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. 134baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkotemplate<class Character> 135036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastruct StringTestState { 136036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN) { 137036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int max_alignment = 64; 138036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 139036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN". 140baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 141baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr1 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 142baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr2 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 143036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova InitLenArray(); 145036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 146036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova srandom(1234); 147036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 148036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ~StringTestState() { 150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr); 151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr1); 152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr2); 153036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 154036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 155036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void NewIteration() { 156036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int alignments[] = { 24, 32, 16, 48, 1, 2, 3, 0, 5, 11 }; 157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int usable_alignments = 10; 158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align1 = alignments[random() % (usable_alignments - 1)]; 159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align2 = alignments[random() % (usable_alignments - 1)]; 160036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 161036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr = glob_ptr + align1; 162036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr1 = glob_ptr1 + align1; 163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr2 = glob_ptr2 + align2; 164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova const size_t MAX_LEN; 167baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *ptr, *ptr1, *ptr2; 168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t n; 169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int len[ITER + 1]; 170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private: 172baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *glob_ptr, *glob_ptr1, *glob_ptr2; 173036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Calculate input lengths and fill state.len with them. 175036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Test small lengths with more density than big ones. Manually push 176036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats. 177036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Return number of lengths to test. 178036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void InitLenArray() { 179036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova n = 0; 180036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = 0; 181036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < ITER; ++i) { 182036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int l = (int) exp(log((double) MAX_LEN) * i / ITER); 183036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (l != len[n - 1]) { 184036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = l; 185036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 186036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 187036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = MAX_LEN; 188036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 189036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}; 190036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 191036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) { 192baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 193036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 194036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 195036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 196036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 197036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 198036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 202036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 204036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1); 206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 207036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2); 208036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0); 209036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 210036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 21313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// one byte target with "\0" source 21413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy2) { 21513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[1]; 21613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup(""); 21713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich strcpy(buf, orig); 21813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('\0', buf[0]); 21913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 22013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 22113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 22213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we under fill target 22313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy3) { 22413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 22513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("12345"); 22613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 22713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich strcpy(buf, orig); 22813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('1', buf[0]); 22913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('2', buf[1]); 23013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('3', buf[2]); 23113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('4', buf[3]); 23213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('5', buf[4]); 23313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('\0', buf[5]); 23413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[6]); 23513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[7]); 23613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[8]); 23713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[9]); 23813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 23913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 24013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 24113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we fill target exactly 24213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy4) { 24313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 24413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("123456789"); 24513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 24613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich strcpy(buf, orig); 24713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('1', buf[0]); 24813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('2', buf[1]); 24913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('3', buf[2]); 25013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('4', buf[3]); 25113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('5', buf[4]); 25213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('6', buf[5]); 25313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('7', buf[6]); 25413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('8', buf[7]); 25513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('9', buf[8]); 25613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('\0', buf[9]); 25713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 25813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 25913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 260cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) { 261cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 262cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 263cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 264cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 265cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234"); 266cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 267cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 268cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 269cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 270cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 271cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 272cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 273cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 274cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 275cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 276cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 277cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 278cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 279cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) { 280cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 281cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 282cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 283cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 284cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234567"); 285cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 286cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 287cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 288cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 289cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 290cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 291cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 292cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 293cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 294cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 295cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 296cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 297cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 298cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) { 299cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 300cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 301cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 302cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 303cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1); 304cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 305cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 306cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 307cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 308cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 309cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 310cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 311cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 312cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 313cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 314cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 315cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 316cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 317cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) { 318cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 319cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 320cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 321cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 322cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "0123456789", 5); 323cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 324cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 325cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 326cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 327cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 328cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 329cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 330cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[6]); 331cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 332cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 333cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 334cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 335cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 336cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) { 337cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 338cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 339cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 340cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 341cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 8); 342cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 343cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 344cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 345cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 346cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 347cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 348cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 349cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 350cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 351cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 352cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 353cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 354cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 355cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) { 356cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 357cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 358cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 359cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 360cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 9); 361cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 362cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('a', buf[0]); 363cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('0', buf[1]); 364cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('1', buf[2]); 365cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('2', buf[3]); 366cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('3', buf[4]); 367cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('4', buf[5]); 368cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('5', buf[6]); 369cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('6', buf[7]); 370cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('7', buf[8]); 371cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('\0', buf[9]); 372cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 373cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 3744f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) { 3754f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich char buf[10]; 3764f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich const char* s = "01234"; 3774f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich memcpy(buf, s, strlen(s) + 1); 3784f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s))); 3794f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich} 3804f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich 381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) { 382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 384baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected); 410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) { 415baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 430036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) { 452baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\2', pos); 459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.MAX_LEN - 1] = '\0'; 461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2); 472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 477dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich 478dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich#if __BIONIC__ 479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) { 480baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]); 486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]); 488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\3', pos); 491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.len[i]) { 493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1); 494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]); 496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0'; 497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]); 500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0); 502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__ 508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) { 509baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (rand < 1) { 515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova rand = 1; 516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.MAX_LEN); 518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.MAX_LEN) { 521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, random() & 255, state.MAX_LEN); 526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN); 527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos > state.MAX_LEN - 1) { 529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN); 530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1)); 536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) || 537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) { 543baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = strlen(state.ptr1); 557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t actual = random() % state.len[i]; 559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos)); 560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0'; 561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2); 563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0); 564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) { 569baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) { 606baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random () % state.MAX_LEN] = '\0'; 612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos; 617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (memchr(state.ptr1, 0, state.MAX_LEN)) { 618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = strlen(state.ptr1); 619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = state.MAX_LEN - 1; 621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN); 624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2); 627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 || 628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0); 629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) { 633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 634baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected); 660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) { 665036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 666baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 668036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 669036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 670036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 671036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 672036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 673036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 674036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 675036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 676036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 677036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 678036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 679036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 680036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 681036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 682036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected); 683036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 684036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 685036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 686036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 687036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) { 688036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 689baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 690036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 691036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 692036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 693036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 694036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 695036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 696036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 697036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 698036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 699036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 700036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 701036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 702036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 703036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 704036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 705036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected); 706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 708036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 709036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 710036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) { 711baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 712036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 713036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 714036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 715036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 716036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c1 = random() & 0xff; 717036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c2 = random() & 0xff; 718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, c1, state.MAX_LEN); 719036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, c1, state.MAX_LEN); 720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 722036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos] = c2; 723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 724036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 725036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN); 726036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 727036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(signum(expected), signum(actual)); 728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 732baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko#if defined(__BIONIC__) 733baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkoextern "C" int __memcmp16(const unsigned short *ptr1, const unsigned short *ptr2, size_t n); 734baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 735baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, __memcmp16) { 736baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<unsigned short> state(SMALL); 737baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 738baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t i = 0; i < state.n; i++) { 739baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t j = 0; j < POS_ITER; j++) { 740baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.NewIteration(); 741baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 742baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short mask = 0xffff; 743baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short c1 = rand() & mask; 744baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short c2 = rand() & mask; 745baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 746baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko std::fill(state.ptr1, state.ptr1 + state.MAX_LEN, c1); 747baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko std::fill(state.ptr2, state.ptr2 + state.MAX_LEN, c1); 748baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 749baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 750baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.ptr2[pos] = c2; 751baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 752baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int expected = (static_cast<unsigned short>(c1) - static_cast<unsigned short>(c2)); 753baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int actual = __memcmp16(state.ptr1, state.ptr2, (size_t) state.MAX_LEN); 754baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 755baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko ASSERT_EQ(expected, actual); 756baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 757baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 758baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko} 759baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko#endif 760baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 761baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, wmemcmp) { 762baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<wchar_t> state(SMALL); 763baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 764baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t i = 0; i < state.n; i++) { 765baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t j = 0; j < POS_ITER; j++) { 766baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.NewIteration(); 767baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 768baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko long long mask = ((long long) 1 << 8 * sizeof(wchar_t)) - 1; 769baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c1 = rand() & mask; 770baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c2 = rand() & mask; 771baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr1, c1, state.MAX_LEN); 772baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr2, c1, state.MAX_LEN); 773baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 774baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 775baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.ptr2[pos] = c2; 776baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 777baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 778baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int actual = wmemcmp(state.ptr1, state.ptr2, (size_t) state.MAX_LEN); 779baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 780baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko ASSERT_EQ(signum(expected), signum(actual)); 781baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 782baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 783baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko} 784baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 785036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) { 786baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 787036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 788036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 789036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 790036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 791036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 792036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 793036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 794036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.len[i]); 795036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 796036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 797036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, rand, state.len[i]); 798036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 799036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + pos, '\0', state.len[i]); 800036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 801036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos); 802036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 803036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 804036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 805036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 806036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 807036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) { 808baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 809036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char ch = random () & 255; 810036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 811036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 812036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 813036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 814036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~ch, state.MAX_LEN); 815036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, state.MAX_LEN); 816036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 817036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random () % (state.MAX_LEN - state.len[i]); 818036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t k = pos; k < pos + state.len[i]; k++) { 819036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[k] = ch; 820036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 821036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 822036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos); 823036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 824036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 825036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 826036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 827036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 828036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 829036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) { 830baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 831036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 832036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 833036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 834036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 835036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, 2 * state.MAX_LEN); 836036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 837036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 838036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 839036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 840036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 841036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.len[i]); 842036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1 + pos, state.ptr, state.len[i]); 843036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 844036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos); 845036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN)); 846036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 847036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 848036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 849036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 850036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) { 851baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 852036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 853036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 854036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 855036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 856036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 857036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN); 858036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 859036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 860036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % (2 * state.MAX_LEN - state.len[i]); 861036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + start, state.ptr1, state.len[i]); 862036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 863036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bcopy(state.ptr1, state.ptr1 + start, state.len[i]); 864036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN)); 865036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 866036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 867036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 868036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 869036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) { 870baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 871036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 872036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 873036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 874036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 875036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 876036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % state.MAX_LEN; 877036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t end = start + random() % (state.MAX_LEN - start); 878036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 879036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, start); 880036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + start, '\0', end - start); 881036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end); 882036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 883036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bzero(state.ptr1 + start, end - start); 884036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 885036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 886036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 887036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 888