string_test.cpp revision cf870199d576bdfc339b7fb016c9f6fe7f2c87ed
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> 20036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#include <math.h> 21b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <string.h> 22b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 23036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define KB 1024 24036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define SMALL 1*KB 25036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define LARGE 64*KB 26036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 27036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastatic int signum(int i) { 28036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (i < 0) { 29036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return -1; 30036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (i > 0) { 31036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 1; 32036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 33036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 0; 34036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 35036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 36b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) { 37b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 38b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", strerror(0)); 39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", strerror(1)); 40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 42e6e60065ff093ff8c859ab146cf543531cb1967cElliott Hughes ASSERT_STREQ("Unknown error -1", strerror(-1)); 43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", strerror(1234)); 44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 45b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 46ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes#if __BIONIC__ // glibc's strerror isn't thread safe, only its strsignal. 47ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 48ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) { 49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0); 50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) { 54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strerror1001 = strerror(1001); 55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 58b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL)); 59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 65ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror_r doesn't even have the same signature as the POSIX one. 69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) { 70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea char buf[256]; 71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf))); 74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", buf); 75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf))); 76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", buf); 77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf))); 80606058933c5129cb1026960ea67624b9426c610fNick Kralevich ASSERT_STREQ("Unknown error -1", buf); 81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf))); 82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", buf); 83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Buffer too small. 85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(-1, strerror_r(0, buf, 2)); 86b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(ERANGE, errno); 87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) { 91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A regular signal. 92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Hangup", strsignal(1)); 93b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A real-time signal. 95b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#ifdef __GLIBC__ // glibc reserves real-time signals for internal use, and doesn't count those. 96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 14", strsignal(48)); 97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#else 98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Real-time signal 16", strsignal(48)); 99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif 100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Errors. 102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small. 103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small. 104b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large. 105b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 107ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) { 108b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0); 109b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 110b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 111b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 112b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) { 113b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strsignal1001 = strsignal(1001); 114b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 115b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 116b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 117b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL)); 118b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 119b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 120b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 121b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 122b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 123b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 124036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 125036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: where did these numbers come from? 126036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define POS_ITER 10 127036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define ITER 500 128036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 129036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// For every length we want to test, vary and change alignment 130036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// of allocated memory, fill it with some values, calculate 131036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// expected result and then run function and compare what we got. 132036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// These tests contributed by Intel Corporation. 133036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: make these tests more intention-revealing and less random. 134036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastruct StringTestState { 135036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN) { 136036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int max_alignment = 64; 137036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 138036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN". 139036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova glob_ptr = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment)); 140036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova glob_ptr1 = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment)); 141036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova glob_ptr2 = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment)); 142036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 143036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova InitLenArray(); 144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 145036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova srandom(1234); 146036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 147036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 148036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ~StringTestState() { 149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr); 150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr1); 151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr2); 152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 153036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 154036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void NewIteration() { 155036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int alignments[] = { 24, 32, 16, 48, 1, 2, 3, 0, 5, 11 }; 156036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int usable_alignments = 10; 157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align1 = alignments[random() % (usable_alignments - 1)]; 158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align2 = alignments[random() % (usable_alignments - 1)]; 159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 160036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr = glob_ptr + align1; 161036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr1 = glob_ptr1 + align1; 162036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr2 = glob_ptr2 + align2; 163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova const size_t MAX_LEN; 166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char *ptr, *ptr1, *ptr2; 167036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t n; 168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int len[ITER + 1]; 169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private: 171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char *glob_ptr, *glob_ptr1, *glob_ptr2; 172036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 173036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Calculate input lengths and fill state.len with them. 174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Test small lengths with more density than big ones. Manually push 175036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats. 176036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Return number of lengths to test. 177036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void InitLenArray() { 178036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova n = 0; 179036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = 0; 180036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < ITER; ++i) { 181036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int l = (int) exp(log((double) MAX_LEN) * i / ITER); 182036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (l != len[n - 1]) { 183036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = l; 184036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 185036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 186036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = MAX_LEN; 187036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 188036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}; 189036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 190036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) { 191036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 192036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 193036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 194036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 195036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 196036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 197036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 198036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 202036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 204036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1); 205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2); 207036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0); 208036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 209036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 210036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 212cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) { 213cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 214cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 215cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 216cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 217cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234"); 218cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 219cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 220cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 221cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 222cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 223cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 224cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 225cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 226cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 227cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 228cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 229cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 230cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 231cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) { 232cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 233cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 234cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 235cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 236cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234567"); 237cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 238cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 239cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 240cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 241cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 242cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 243cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 244cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 245cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 246cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 247cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 248cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 249cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 250cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) { 251cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 252cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 253cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 254cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 255cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1); 256cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 257cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 258cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 259cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 260cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 261cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 262cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 263cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 264cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 265cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 266cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 267cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 268cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 269cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) { 270cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 271cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 272cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 273cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 274cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "0123456789", 5); 275cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 276cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 277cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 278cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 279cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 280cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 281cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 282cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 283cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 284cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 285cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 286cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 287cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 288cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) { 289cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 290cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 291cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 292cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 293cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 8); 294cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 295cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 296cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 297cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 298cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 299cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 300cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 301cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 302cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 303cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 304cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 305cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 306cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 307cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) { 308cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 309cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 310cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 311cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 312cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 9); 313cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 314cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 315cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 316cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 317cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 318cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 319cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 320cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 321cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 322cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 323cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 324cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 325cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 3264f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) { 3274f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich char buf[10]; 3284f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich const char* s = "01234"; 3294f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich memcpy(buf, s, strlen(s) + 1); 3304f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s))); 3314f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich} 3324f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich 333036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) { 334036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 335036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 336036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 337036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 338036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 339036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 340036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 341036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 342036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 343036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 344036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 345036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 346036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 347036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 348036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 349036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 350036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 351036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 352036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 353036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 354036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 355036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 356036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 357036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 358036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 359036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 360036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 361036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected); 362036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 363036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 364036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 365036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 366036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) { 367036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 368036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 369036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 370036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 371036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 372036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 373036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 374036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 375036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 376036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 377036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 378036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 379036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 380036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 384036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) { 404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\2', pos); 411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.MAX_LEN - 1] = '\0'; 413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 415036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2); 424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 429dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich 430dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich#if __BIONIC__ 431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) { 432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]); 438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]); 440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\3', pos); 443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.len[i]) { 445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1); 446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]); 448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0'; 449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]); 452036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0); 454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__ 460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) { 461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (rand < 1) { 467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova rand = 1; 468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.MAX_LEN); 470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.MAX_LEN) { 473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, random() & 255, state.MAX_LEN); 478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN); 479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos > state.MAX_LEN - 1) { 481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN); 482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1)); 488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) || 489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) { 495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = strlen(state.ptr1); 509036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t actual = random() % state.len[i]; 511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos)); 512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0'; 513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2); 515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0); 516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) { 521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 543036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) { 558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random () % state.MAX_LEN] = '\0'; 564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos; 569036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (memchr(state.ptr1, 0, state.MAX_LEN)) { 570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = strlen(state.ptr1); 571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = state.MAX_LEN - 1; 573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN); 576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2); 579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 || 580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0); 581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) { 585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected); 612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) { 617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 634036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected); 635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) { 640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected); 658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) { 663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 665036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 666036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 668036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c1 = random() & 0xff; 669036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c2 = random() & 0xff; 670036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, c1, state.MAX_LEN); 671036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, c1, state.MAX_LEN); 672036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 673036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 674036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos] = c2; 675036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 676036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 677036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN); 678036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 679036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(signum(expected), signum(actual)); 680036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 681036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 682036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 683036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 684036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) { 685036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 686036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 687036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 688036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 689036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 690036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 691036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 692036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 693036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.len[i]); 694036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 695036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 696036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, rand, state.len[i]); 697036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 698036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + pos, '\0', state.len[i]); 699036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 700036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos); 701036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 702036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 703036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 704036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 705036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) { 707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 708036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char ch = random () & 255; 709036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 710036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 711036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 712036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 713036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~ch, state.MAX_LEN); 714036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, state.MAX_LEN); 715036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 716036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random () % (state.MAX_LEN - state.len[i]); 717036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t k = pos; k < pos + state.len[i]; k++) { 718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[k] = ch; 719036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos); 722036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 724036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 725036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 726036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 727036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) { 729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 732036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 733036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 734036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, 2 * state.MAX_LEN); 735036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 736036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 737036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 738036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 739036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 740036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.len[i]); 741036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1 + pos, state.ptr, state.len[i]); 742036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 743036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos); 744036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN)); 745036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 746036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 747036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 748036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 749036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) { 750036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 751036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 752036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 753036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 754036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 755036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 756036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN); 757036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 758036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 759036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % (2 * state.MAX_LEN - state.len[i]); 760036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + start, state.ptr1, state.len[i]); 761036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 762036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bcopy(state.ptr1, state.ptr1 + start, state.len[i]); 763036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN)); 764036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 765036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 766036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 767036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 768036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) { 769036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 770036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 771036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 772036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 773036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 774036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 775036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % state.MAX_LEN; 776036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t end = start + random() % (state.MAX_LEN - start); 777036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 778036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, start); 779036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + start, '\0', end - start); 780036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end); 781036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 782036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bzero(state.ptr1 + start, end - start); 783036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 784036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 785036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 786036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 787