string_test.cpp revision 036154b0c2d64d618aded8674f2e13cbbb2867e2
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. 42b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 4294967295", 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))); 80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 4294967295", 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 212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) { 213036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 214036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 215036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 216036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 217036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 218036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 219036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 220036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 221036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 222036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 223036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 224036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 225036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 226036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 227036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 228036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 229036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 230036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 231036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 232036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 233036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 234036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 235036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 236036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 237036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 238036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 239036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 240036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected); 241036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 242036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 243036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 244036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 245036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) { 246036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 247036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 248036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 249036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 250036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 251036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 252036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 253036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 254036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 255036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 256036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 257036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 258036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 259036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 260036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 261036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 262036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 263036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 264036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 265036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 266036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 267036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 268036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 269036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 270036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 271036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 272036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 273036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 274036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 275036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 276036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 277036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 278036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 279036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 280036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 281036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 282036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) { 283036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 284036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 285036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 286036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 287036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 288036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 289036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\2', pos); 290036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 291036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.MAX_LEN - 1] = '\0'; 292036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 293036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 294036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 295036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 296036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 297036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 298036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 299036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 300036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 301036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 302036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2); 303036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 304036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 305036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 306036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 307036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 308036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__ 309036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) { 310036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 311036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 312036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 313036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 314036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 315036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]); 316036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 317036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]); 318036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 319036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 320036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\3', pos); 321036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 322036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.len[i]) { 323036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1); 324036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 325036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]); 326036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0'; 327036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 328036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 329036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]); 330036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 331036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0); 332036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 333036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 334036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 335036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 336036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 337036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__ 338036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) { 339036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 340036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 341036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 342036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 343036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 344036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (rand < 1) { 345036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova rand = 1; 346036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 347036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.MAX_LEN); 348036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 349036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 350036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.MAX_LEN) { 351036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 352036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 353036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 354036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 355036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, random() & 255, state.MAX_LEN); 356036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN); 357036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 358036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos > state.MAX_LEN - 1) { 359036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN); 360036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 361036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 362036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 363036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 364036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 365036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1)); 366036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) || 367036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 368036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 369036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 370036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif 371036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 372036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) { 373036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 374036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 375036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 376036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 377036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 378036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 379036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 380036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 384036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = strlen(state.ptr1); 387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t actual = random() % state.len[i]; 389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos)); 390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0'; 391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2); 393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0); 394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) { 399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 415036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 430036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) { 436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random () % state.MAX_LEN] = '\0'; 442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos; 447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (memchr(state.ptr1, 0, state.MAX_LEN)) { 448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = strlen(state.ptr1); 449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova pos = state.MAX_LEN - 1; 451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 452036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN); 454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2); 457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 || 458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0); 459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) { 463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected); 490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) { 495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 509036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected); 513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) { 518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected); 536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) { 541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(SMALL); 542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 543036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c1 = random() & 0xff; 547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c2 = random() & 0xff; 548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, c1, state.MAX_LEN); 549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, c1, state.MAX_LEN); 550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos] = c2; 553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN); 556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(signum(expected), signum(actual)); 558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) { 563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 569036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.len[i]); 572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, rand, state.len[i]); 575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + pos, '\0', state.len[i]); 577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos); 579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) { 585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char ch = random () & 255; 587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~ch, state.MAX_LEN); 592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, state.MAX_LEN); 593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random () % (state.MAX_LEN - state.len[i]); 595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t k = pos; k < pos + state.len[i]; k++) { 596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[k] = ch; 597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos); 600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) { 607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, 2 * state.MAX_LEN); 613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.len[i]); 619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1 + pos, state.ptr, state.len[i]); 620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos); 622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN)); 623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) { 628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 634036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN); 635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % (2 * state.MAX_LEN - state.len[i]); 638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + start, state.ptr1, state.len[i]); 639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bcopy(state.ptr1, state.ptr1 + start, state.len[i]); 641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN)); 642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) { 647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState state(LARGE); 648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % state.MAX_LEN; 654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t end = start + random() % (state.MAX_LEN - start); 655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, start); 657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + start, '\0', end - start); 658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end); 659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bzero(state.ptr1 + start, end - start); 661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 665