string_test.cpp revision b5f053b5a7deb084e7a052d527e0aa41339ae05c
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 32b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdeavoid* ConcurrentStrErrorFn(void* arg) { 33b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0); 34b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 35b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 36b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 37b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror isn't thread safe, only its strsignal. 38b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) { 39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strerror1001 = strerror(1001); 40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 42b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL)); 44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 45b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 46b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 47b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 48b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror_r doesn't even have the same signature as the POSIX one. 53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) { 54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea char buf[256]; 55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf))); 58b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", buf); 59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf))); 60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", buf); 61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf))); 64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 4294967295", buf); 65b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf))); 66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", buf); 67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Buffer too small. 69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(-1, strerror_r(0, buf, 2)); 70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(ERANGE, errno); 71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) { 75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A regular signal. 76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Hangup", strsignal(1)); 77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A real-time signal. 79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#ifdef __GLIBC__ // glibc reserves real-time signals for internal use, and doesn't count those. 80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 14", strsignal(48)); 81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#else 82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 16", strsignal(48)); 83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Errors. 86b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small. 87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small. 88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large. 89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdeavoid* ConcurrentStrSignalFn(void* arg) { 92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0); 93b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 95b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) { 97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strsignal1001 = strsignal(1001); 98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL)); 102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 104b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 105b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 107b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 108