string_test.cpp revision ad88a0863110798cef5169dcf917e18b967a7cf6
1b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea/* 2b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Copyright (C) 2012 The Android Open Source Project 3b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 4b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Licensed under the Apache License, Version 2.0 (the "License"); 5b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * you may not use this file except in compliance with the License. 6b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * You may obtain a copy of the License at 7b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 8b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * http://www.apache.org/licenses/LICENSE-2.0 9b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * 10b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Unless required by applicable law or agreed to in writing, software 11b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * distributed under the License is distributed on an "AS IS" BASIS, 12b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * See the License for the specific language governing permissions and 14b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * limitations under the License. 15b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea */ 16b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 17b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <gtest/gtest.h> 18b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 19b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <errno.h> 20b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <string.h> 21b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 22b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) { 23b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 24b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", strerror(0)); 25b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", strerror(1)); 26b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 27b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 28b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 4294967295", strerror(-1)); 29b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", strerror(1234)); 30b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 31b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 32ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes#if __BIONIC__ // glibc's strerror isn't thread safe, only its strsignal. 33ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 34ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) { 35b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0); 36b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 37b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 38b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) { 40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strerror1001 = strerror(1001); 41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 42b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL)); 45b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 46b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 47b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 48b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 51ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror_r doesn't even have the same signature as the POSIX one. 55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) { 56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea char buf[256]; 57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 58b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf))); 60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", buf); 61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf))); 62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", buf); 63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 65b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf))); 66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 4294967295", buf); 67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf))); 68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", buf); 69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Buffer too small. 71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(-1, strerror_r(0, buf, 2)); 72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(ERANGE, errno); 73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) { 77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A regular signal. 78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Hangup", strsignal(1)); 79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A real-time signal. 81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#ifdef __GLIBC__ // glibc reserves real-time signals for internal use, and doesn't count those. 82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 14", strsignal(48)); 83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#else 84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 16", strsignal(48)); 85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 86b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Errors. 88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small. 89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small. 90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large. 91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 93ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) { 94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0); 95b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) { 99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strsignal1001 = strsignal(1001); 100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL)); 104b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 105b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 107b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 108b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 109b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 110