Export of internal Abseil changes
-- a85860e450815776c8753f34348f41ab0e918d36 by Gennadiy Rozental <rogeeff@google.com>: Rename ComamndLineFlag's interface SetFromString as ParseFrom. This is the name approved by C++ API review. PiperOrigin-RevId: 301543521 -- 28f31bae2a136854fd89f0a32f281d12a40f702c by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 301524919 -- a68da3d6fbbca4c5f41a20e99ed72bb1c5dd1165 by Abseil Team <absl-team@google.com>: Introduce absl::base_internal::StrError, a portability wrapper around the various thread-safe alternatives to C89's strerror. PiperOrigin-RevId: 301513962 -- 92ccac3b6eb18cb41cddedbfdab53b9ad481505d by Andy Getzendanner <durandal@google.com>: Introduce absl::base_internal::StrError, a portability wrapper around the various thread-safe alternatives to C89's strerror. PiperOrigin-RevId: 301493389 -- 8e196def47c250941202840d6a1de686d681cd3e by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 301363394 -- dd1dcffa6c47675ba4d198730a301bd408142298 by Gennadiy Rozental <rogeeff@google.com>: Add validation for size of void* to match the size of free function pointer. PiperOrigin-RevId: 301341331 GitOrigin-RevId: a85860e450815776c8753f34348f41ab0e918d36 Change-Id: I27c9d1365d3c9b4328d1587ab3ac38e2d09a6ec2
This commit is contained in:
		
							parent
							
								
									7853a7586c
								
							
						
					
					
						commit
						2d2a8aea29
					
				
					 15 changed files with 379 additions and 52 deletions
				
			
		
							
								
								
									
										86
									
								
								absl/base/internal/strerror_test.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								absl/base/internal/strerror_test.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | |||
| // Copyright 2020 The Abseil Authors.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //      https://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| #include "absl/base/internal/strerror.h" | ||||
| 
 | ||||
| #include <atomic> | ||||
| #include <cerrno> | ||||
| #include <cstdio> | ||||
| #include <cstring> | ||||
| #include <string> | ||||
| #include <thread>  // NOLINT(build/c++11)
 | ||||
| #include <vector> | ||||
| 
 | ||||
| #include "gmock/gmock.h" | ||||
| #include "gtest/gtest.h" | ||||
| #include "absl/strings/match.h" | ||||
| 
 | ||||
| namespace { | ||||
| using ::testing::AnyOf; | ||||
| using ::testing::Eq; | ||||
| 
 | ||||
| TEST(StrErrorTest, ValidErrorCode) { | ||||
|   errno = ERANGE; | ||||
|   EXPECT_THAT(absl::base_internal::StrError(EDOM), Eq(strerror(EDOM))); | ||||
|   EXPECT_THAT(errno, Eq(ERANGE)); | ||||
| } | ||||
| 
 | ||||
| TEST(StrErrorTest, InvalidErrorCode) { | ||||
|   errno = ERANGE; | ||||
|   EXPECT_THAT(absl::base_internal::StrError(-1), | ||||
|               AnyOf(Eq("No error information"), Eq("Unknown error -1"))); | ||||
|   EXPECT_THAT(errno, Eq(ERANGE)); | ||||
| } | ||||
| 
 | ||||
| TEST(StrErrorTest, MultipleThreads) { | ||||
|   // In this test, we will start up 2 threads and have each one call
 | ||||
|   // StrError 1000 times, each time with a different errnum.  We
 | ||||
|   // expect that StrError(errnum) will return a string equal to the
 | ||||
|   // one returned by strerror(errnum), if the code is known.  Since
 | ||||
|   // strerror is known to be thread-hostile, collect all the expected
 | ||||
|   // strings up front.
 | ||||
|   const int kNumCodes = 1000; | ||||
|   std::vector<std::string> expected_strings(kNumCodes); | ||||
|   for (int i = 0; i < kNumCodes; ++i) { | ||||
|     expected_strings[i] = strerror(i); | ||||
|   } | ||||
| 
 | ||||
|   std::atomic_int counter(0); | ||||
|   auto thread_fun = [&]() { | ||||
|     for (int i = 0; i < kNumCodes; ++i) { | ||||
|       ++counter; | ||||
|       errno = ERANGE; | ||||
|       const std::string value = absl::base_internal::StrError(i); | ||||
|       // Only the GNU implementation is guaranteed to provide the
 | ||||
|       // string "Unknown error nnn". POSIX doesn't say anything.
 | ||||
|       if (!absl::StartsWith(value, "Unknown error ")) { | ||||
|         EXPECT_THAT(absl::base_internal::StrError(i), Eq(expected_strings[i])); | ||||
|       } | ||||
|       EXPECT_THAT(errno, Eq(ERANGE)); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   const int kNumThreads = 100; | ||||
|   std::vector<std::thread> threads; | ||||
|   for (int i = 0; i < kNumThreads; ++i) { | ||||
|     threads.push_back(std::thread(thread_fun)); | ||||
|   } | ||||
|   for (auto& thread : threads) { | ||||
|     thread.join(); | ||||
|   } | ||||
| 
 | ||||
|   EXPECT_THAT(counter, Eq(kNumThreads * kNumCodes)); | ||||
| } | ||||
| 
 | ||||
| }  // namespace
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue