string_test.cpp revision 6c80ccdeed9d9b30e961f68229fe8171d79c5d14
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 23b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#include "buffer_tests.h" 24b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 25036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define KB 1024 26036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define SMALL 1*KB 27b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#define MEDIUM 4*KB 28036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define LARGE 64*KB 29036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 30036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastatic int signum(int i) { 31036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (i < 0) { 32036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return -1; 33036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (i > 0) { 34036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 1; 35036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 36036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova return 0; 37036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 38036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) { 40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", strerror(0)); 42b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", strerror(1)); 43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 45e6e60065ff093ff8c859ab146cf543531cb1967cElliott Hughes ASSERT_STREQ("Unknown error -1", strerror(-1)); 46b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", strerror(1234)); 47b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 48b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 49f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 50ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) { 51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0); 52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 54f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 56f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris// glibc's strerror isn't thread safe, only its strsignal. 57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) { 58f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strerror1001 = strerror(1001); 60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL)); 64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 65b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1001", strerror1001); 69f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 70f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 71f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 73ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes 74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) { 75f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) // glibc's strerror_r doesn't even have the same signature as the POSIX one. 76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea char buf[256]; 77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Valid. 79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf))); 80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Success", buf); 81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf))); 82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Operation not permitted", buf); 83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Invalid. 85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf))); 86606058933c5129cb1026960ea67624b9426c610fNick Kralevich ASSERT_STREQ("Unknown error -1", buf); 87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf))); 88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown error 1234", buf); 89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Buffer too small. 91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(-1, strerror_r(0, buf, 2)); 92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(ERANGE, errno); 93f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 94f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 95f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) { 99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A regular signal. 100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Hangup", strsignal(1)); 101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // A real-time signal. 1030990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes ASSERT_STREQ("Real-time signal 14", strsignal(SIGRTMIN + 14)); 1040990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes // One of the signals the C library keeps to itself. 1050990d4fda898ada86e557f872f5cb7d16b138e3cElliott Hughes ASSERT_STREQ("Unknown signal 32", strsignal(__SIGRTMIN)); 106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 107b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea // Errors. 108b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small. 109b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small. 110b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large. 111b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 112b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 113ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) { 114b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0); 115b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea return reinterpret_cast<void*>(equal); 116b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 117b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 118b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) { 119b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea const char* strsignal1001 = strsignal(1001); 120b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 121b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 122b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea pthread_t t; 123b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL)); 124b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea void* result; 125b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_EQ(0, pthread_join(t, &result)); 126b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_TRUE(static_cast<bool>(result)); 127b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea 128b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea ASSERT_STREQ("Unknown signal 1001", strsignal1001); 129b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea} 130036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 131036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: where did these numbers come from? 132036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define POS_ITER 10 133036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define ITER 500 134036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 135036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// For every length we want to test, vary and change alignment 136036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// of allocated memory, fill it with some values, calculate 137036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// expected result and then run function and compare what we got. 138036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// These tests contributed by Intel Corporation. 139036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: make these tests more intention-revealing and less random. 140baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkotemplate<class Character> 141036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastruct StringTestState { 142036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN) { 143036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int max_alignment = 64; 144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 145036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN". 146baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 147baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr1 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 148baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko glob_ptr2 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment)); 149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova InitLenArray(); 151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova srandom(1234); 153036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 154036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 155036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ~StringTestState() { 156036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr); 157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr1); 158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova free(glob_ptr2); 159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 160036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 161036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void NewIteration() { 162036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int alignments[] = { 24, 32, 16, 48, 1, 2, 3, 0, 5, 11 }; 163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int usable_alignments = 10; 164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align1 = alignments[random() % (usable_alignments - 1)]; 165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int align2 = alignments[random() % (usable_alignments - 1)]; 166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 167036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr = glob_ptr + align1; 168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr1 = glob_ptr1 + align1; 169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ptr2 = glob_ptr2 + align2; 170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 172036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova const size_t MAX_LEN; 173baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *ptr, *ptr1, *ptr2; 174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t n; 175036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int len[ITER + 1]; 176036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 177036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private: 178baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko Character *glob_ptr, *glob_ptr1, *glob_ptr2; 179036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 180036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Calculate input lengths and fill state.len with them. 181036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Test small lengths with more density than big ones. Manually push 182036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats. 183036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova // Return number of lengths to test. 184036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova void InitLenArray() { 185036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova n = 0; 186036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = 0; 187036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < ITER; ++i) { 188036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int l = (int) exp(log((double) MAX_LEN) * i / ITER); 189036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (l != len[n - 1]) { 190036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = l; 191036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 192036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 193036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova len[n++] = MAX_LEN; 194036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 195036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}; 196036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 197036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) { 198baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 202036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 204036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 207036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 208036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 209036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 210036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1); 212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 213036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2); 214036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0); 215036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 216036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 217036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 218036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 21913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// one byte target with "\0" source 22013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy2) { 22113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[1]; 22213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup(""); 223950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 22413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('\0', buf[0]); 22513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 22613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 22713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 22813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we under fill target 22913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy3) { 23013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 23113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("12345"); 23213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 233950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 234950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("12345", buf); 23513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[6]); 23613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[7]); 23713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[8]); 23813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich ASSERT_EQ('A', buf[9]); 23913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 24013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 24113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 24213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we fill target exactly 24313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy4) { 24413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char buf[10]; 24513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich char* orig = strdup("123456789"); 24613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich memset(buf, 'A', sizeof(buf)); 247950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, strcpy(buf, orig)); 248950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("123456789", buf); 249950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 250950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 251950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 252950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// one byte target with "\0" source 253950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy2) { 254950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[1]; 255950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup(""); 256950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf, stpcpy(buf, orig)); 257950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('\0', buf[0]); 258950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 259950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 260950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 261950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// multibyte target where we under fill target 262950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy3) { 263950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[10]; 264950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup("12345"); 265950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(buf, 'A', sizeof(buf)); 266950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig)); 267950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("12345", buf); 268950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[6]); 269950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[7]); 270950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[8]); 271950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ('A', buf[9]); 272950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris free(orig); 273950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 274950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 275950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris// multibyte target where we fill target exactly 276950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy4) { 277950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char buf[10]; 278950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris char* orig = strdup("123456789"); 279950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(buf, 'A', sizeof(buf)); 280950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(buf+strlen(orig), stpcpy(buf, orig)); 281950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("123456789", buf); 28213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich free(orig); 28313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich} 28413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich 285cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) { 286cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 287cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 288cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 289cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 290cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strcat(buf, "01234"); 291cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 292950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 293cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 294cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 295cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 296cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 297cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 298cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) { 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 = strcat(buf, "01234567"); 304cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 305950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 306cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 307cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 308cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) { 309cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 310cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 311cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 312cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 313cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1); 314cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 315950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 316cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 317cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 318cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 319cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 320cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 321cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) { 322cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 323cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 324cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 325cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 326cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "0123456789", 5); 327cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 328950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234", buf); 329cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[7]); 330cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[8]); 331cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ('A', buf[9]); 332cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 333cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 334cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) { 335cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 336cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 337cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 338cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 339cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 8); 340cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 341950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 342cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 343cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 344cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) { 345cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char buf[10]; 346cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich memset(buf, 'A', sizeof(buf)); 347cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[0] = 'a'; 348cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich buf[1] = '\0'; 349cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich char* res = strncat(buf, "01234567", 9); 350cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich ASSERT_EQ(buf, res); 351950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_STREQ("a01234567", buf); 352cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich} 353cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich 3544f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) { 3554f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich char buf[10]; 3564f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich const char* s = "01234"; 3574f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich memcpy(buf, s, strlen(s) + 1); 3584f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s))); 3594f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich} 3604f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich 361036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) { 362036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 363036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 364baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 365036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 366036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 367036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 368036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 369036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 370036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 371036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 372036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 373036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 374036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 375036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 376036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 377036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 378036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 379036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 380036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 384036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected); 390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) { 395baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 415036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strcmp(state.ptr1, state.ptr2); 424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 430036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 431950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy) { 432950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris StringTestState<char> state(SMALL); 433950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris for (size_t j = 0; j < POS_ITER; j++) { 434950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.NewIteration(); 435950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 436950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t pos = random() % state.MAX_LEN; 437950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 438950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr1, '\2', pos); 439950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[pos] = '\0'; 440950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[state.MAX_LEN - 1] = '\0'; 441950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 442950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr, state.ptr1, state.MAX_LEN); 443950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 444950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr2, '\1', state.MAX_LEN); 445950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr2[state.MAX_LEN - 1] = '\0'; 446950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 447950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 448950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 449950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr[2 * state.MAX_LEN - 1] = '\0'; 450950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 451950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_TRUE(stpcpy(state.ptr2, state.ptr1) == state.ptr2 + strlen(state.ptr1)); 452950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 453950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 454950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 455950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 456950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) { 458baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\2', pos); 465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.MAX_LEN - 1] = '\0'; 467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2); 478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 || 479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) { 484f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 485baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]); 491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]); 493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\3', pos); 496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.len[i]) { 498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1); 499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]); 501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0'; 502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]); 505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0); 507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 509f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 510f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 511f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) { 515f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 516baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (rand < 1) { 522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova rand = 1; 523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.MAX_LEN); 525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % state.MAX_LEN; 527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos < state.MAX_LEN) { 528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = '\0'; 529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, random() & 255, state.MAX_LEN); 533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN); 534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos > state.MAX_LEN - 1) { 536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN); 537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[2 * state.MAX_LEN - 1] = '\0'; 538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1); 540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1)); 543036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) || 544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0)); 545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 546f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 547f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 548f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) { 552baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\2', state.MAX_LEN); 558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.MAX_LEN - 1] = '\0'; 559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN); 560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[random() % state.len[i]] = '\0'; 563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = strlen(state.ptr1); 566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t actual = random() % state.len[i]; 568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos)); 569036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0'; 570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2); 572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0); 573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) { 578baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, 'v', state.MAX_LEN); 584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, 'n', state.MAX_LEN); 585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[state.len[i] - 1] = '\0'; 587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = 1 + (random() % (state.MAX_LEN - 1)); 589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual; 590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected; 591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, state.len[i]); 593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1, state.ptr2, pos); 597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (state.ptr1[pos] > state.ptr2[pos]) { 598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 1; 599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else if (state.ptr1[pos] == state.ptr2[pos]) { 600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos + 1] = '\0'; 601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos + 1] = '\0'; 602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = 0; 603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = -1; 605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova actual = strncmp(state.ptr1, state.ptr2, state.len[i]); 607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(expected, signum(actual)); 610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 614950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpncpy) { 615baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 619950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random value to fill the string, except \0 (string terminator), 620950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // or \1 (guarantees it's different from anything in ptr2). 621950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr1, (random() % 254) + 2, state.MAX_LEN); 622950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random size for our src buffer. 623950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t ptr1_len = random() % state.MAX_LEN; 624950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[ptr1_len] = '\0'; 625950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Copy ptr1 into ptr, used to verify that ptr1 does not get modified. 626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.MAX_LEN); 627950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Init ptr2 to a set value. 628950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr2, '\1', state.MAX_LEN); 629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 630950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random amount of data to copy. 631950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t copy_len = random() % state.MAX_LEN; 632950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 633950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Set the second half of ptr to the expected pattern in ptr2. 634950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 635950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, copy_len); 636950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t expected_end; 637950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (copy_len > ptr1_len) { 638950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN + ptr1_len, '\0', copy_len - ptr1_len); 639950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = ptr1_len; 640950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } else { 641950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = copy_len; 642950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 643950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 644950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(state.ptr2 + expected_end, stpncpy(state.ptr2, state.ptr1, copy_len)); 645950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 646950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr1 was not modified. 647950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr1, state.ptr, state.MAX_LEN)); 648950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr2 contains the expected data. 649950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN)); 650950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 651950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 652950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 653950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, strncpy) { 654950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris StringTestState<char> state(SMALL); 655950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris for (size_t j = 0; j < ITER; j++) { 656950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.NewIteration(); 657950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 658950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random value to fill the string, except \0 (string terminator), 659950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // or \1 (guarantees it's different from anything in ptr2). 660950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr1, (random() % 254) + 2, state.MAX_LEN); 661950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random size for our src buffer. 662950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t ptr1_len = random() % state.MAX_LEN; 663950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris state.ptr1[ptr1_len] = '\0'; 664950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Copy ptr1 into ptr, used to verify that ptr1 does not get modified. 665950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr, state.ptr1, state.MAX_LEN); 666950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Init ptr2 to a set value. 667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, '\1', state.MAX_LEN); 668036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 669950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Choose a random amount of data to copy. 670950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t copy_len = random() % state.MAX_LEN; 671950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 672950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Set the second half of ptr to the expected pattern in ptr2. 673950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN); 674950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memcpy(state.ptr + state.MAX_LEN, state.ptr1, copy_len); 675950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris size_t expected_end; 676950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (copy_len > ptr1_len) { 677950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(state.ptr + state.MAX_LEN + ptr1_len, '\0', copy_len - ptr1_len); 678950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = ptr1_len; 679036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 680950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris expected_end = copy_len; 681036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 682036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 683950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(state.ptr2 + expected_end, stpncpy(state.ptr2, state.ptr1, copy_len)); 684036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 685950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr1 was not modified. 686950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr1, state.ptr, state.MAX_LEN)); 687950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris // Verify ptr2 contains the expected data. 688950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(0, memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN)); 689036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 690036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 691036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 692036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) { 693036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 694baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 695036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 1; i < state.n; i++) { 696036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 697036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 698036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 699036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (~seek_char > 0) { 700036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 701036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 702036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, '\1', state.len[i]); 703036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 704036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[state.len[i] - 1] = '\0'; 705036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 708036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i] - 1) { 709036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (seek_char == 0) { 710036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + state.len[i] - 1; 711036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 712036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 713036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 714036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 715036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 716036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 717036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 719036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected); 720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 722036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 724036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) { 725036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 726baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 727036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 732036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 733036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 734036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 735036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 736036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 737036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 738036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 739036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 740036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 741036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 742036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected); 743036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 744036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 745036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 746036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 747036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) { 748036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int seek_char = random() & 255; 749baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 750036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 751036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 752036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 753036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 754036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~seek_char, state.len[i]); 755036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 756036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = random() % state.MAX_LEN; 757036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char* expected; 758036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova if (pos >= state.len[i]) { 759036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = NULL; 760036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } else { 761036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[pos] = seek_char; 762036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova expected = state.ptr1 + pos; 763036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 764036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 765036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected); 766036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 767036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 768036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 769036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 770036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) { 771baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(SMALL); 772036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 773036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 774036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 775036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 776036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c1 = random() & 0xff; 777036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int c2 = random() & 0xff; 778036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, c1, state.MAX_LEN); 779036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, c1, state.MAX_LEN); 780036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 781036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 782036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr2[pos] = c2; 783036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 784036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 785036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN); 786036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 787036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(signum(expected), signum(actual)); 788036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 789036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 790036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 791036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 792baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkoextern "C" int __memcmp16(const unsigned short *ptr1, const unsigned short *ptr2, size_t n); 793baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 794baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, __memcmp16) { 795f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) 796baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<unsigned short> state(SMALL); 797baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 798baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t i = 0; i < state.n; i++) { 799baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t j = 0; j < POS_ITER; j++) { 800baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.NewIteration(); 801baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 802baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short mask = 0xffff; 803baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short c1 = rand() & mask; 804baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko unsigned short c2 = rand() & mask; 805baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 806baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko std::fill(state.ptr1, state.ptr1 + state.MAX_LEN, c1); 807baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko std::fill(state.ptr2, state.ptr2 + state.MAX_LEN, c1); 808baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 809baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 810baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.ptr2[pos] = c2; 811baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 812baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int expected = (static_cast<unsigned short>(c1) - static_cast<unsigned short>(c2)); 813baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int actual = __memcmp16(state.ptr1, state.ptr2, (size_t) state.MAX_LEN); 814baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 815baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko ASSERT_EQ(expected, actual); 816baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 817baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 818f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else // __BIONIC__ 819f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 820f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif // __BIONIC__ 821baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko} 822baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 823baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, wmemcmp) { 824baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<wchar_t> state(SMALL); 825baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 826baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t i = 0; i < state.n; i++) { 827baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko for (size_t j = 0; j < POS_ITER; j++) { 828baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.NewIteration(); 829baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 830baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko long long mask = ((long long) 1 << 8 * sizeof(wchar_t)) - 1; 831baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c1 = rand() & mask; 832baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int c2 = rand() & mask; 833baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr1, c1, state.MAX_LEN); 834baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko wmemset(state.ptr2, c1, state.MAX_LEN); 835baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 836baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]); 837baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko state.ptr2[pos] = c2; 838baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 839baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int expected = (static_cast<int>(c1) - static_cast<int>(c2)); 840baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko int actual = wmemcmp(state.ptr1, state.ptr2, (size_t) state.MAX_LEN); 841baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 842baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko ASSERT_EQ(signum(expected), signum(actual)); 843baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 844baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko } 845baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko} 846baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko 847036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) { 848baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 849036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova int rand = random() & 255; 850036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 851036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 852036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 853036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 854036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 855036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 856036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, rand, state.len[i]); 857036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 858036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 859036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2, rand, state.len[i]); 860036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]); 861036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + pos, '\0', state.len[i]); 862036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 863036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos); 864036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 865036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 866036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 867036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 868036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 869036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) { 870baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 871036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova char ch = random () & 255; 872036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 873036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 874036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 875036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 876036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, ~ch, state.MAX_LEN); 877036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, state.MAX_LEN); 878036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 879036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random () % (state.MAX_LEN - state.len[i]); 880036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t k = pos; k < pos + state.len[i]; k++) { 881036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.ptr1[k] = ch; 882036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 883036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 884036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos); 885036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 886036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 887036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 888036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 889036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 890036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 891036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) { 892baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 893036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n - 1; i++) { 894036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 895036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 896036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 897036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, 2 * state.MAX_LEN); 898036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 899036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t pos = random() % (state.MAX_LEN - state.len[i]); 900036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 901036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.len[i]); 902036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 903036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr, state.ptr1, state.len[i]); 904036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr1 + pos, state.ptr, state.len[i]); 905036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 906036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos); 907036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN)); 908036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 909036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 910036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 911036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 9126c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhangstatic void verify_memmove(char* src_copy, char* dst, char* src, size_t size) { 9136c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(dst, 0, size); 9146c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memcpy(src, src_copy, size); 9156c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(dst, memmove(dst, src, size)); 9166c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(0, memcmp(dst, src_copy, size)); 9176c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 9186c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9196c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang#define MEMMOVE_DATA_SIZE (1024*1024*3) 9206c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9216c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_check) { 9226c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* buffer = reinterpret_cast<char*>(malloc(MEMMOVE_DATA_SIZE)); 9236c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(buffer != NULL); 9246c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9256c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* src_data = reinterpret_cast<char*>(malloc(MEMMOVE_DATA_SIZE)); 9266c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(src_data != NULL); 9276c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Initialize to a known pattern to copy into src for each test and 9286c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // to compare dst against. 9296c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t i = 0; i < MEMMOVE_DATA_SIZE; i++) { 9306c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang src_data[i] = (i + 1) % 255; 9316c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9326c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9336c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Check all different dst offsets between 0 and 127 inclusive. 9346c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* src = buffer; 9356c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t i = 0; i < 127; i++) { 9366c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* dst = buffer + 256 + i; 9376c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Small copy. 9386c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024); 9396c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9406c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9416c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 64 * 1024); 9426c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9436c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9446c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024 * 1024 + 128 * 1024); 9456c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9466c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9476c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Check all leftover size offsets between 1 and 127 inclusive. 9486c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang char* dst = buffer + 256; 9496c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang src = buffer; 9506c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang for (size_t size = 1; size < 127; size++) { 9516c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Small copy. 9526c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024); 9536c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9546c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Medium copy. 9556c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 64 * 1024); 9566c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 9576c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang // Large copy. 9586c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang verify_memmove(src_data, dst, src, 1024 * 1024 + 128 * 1024); 9596c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang } 9606c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 9616c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 962036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) { 963baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 964036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t i = 0; i < state.n; i++) { 965036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < POS_ITER; j++) { 966036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 967036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 968036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 969036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN); 970036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN); 971036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 972036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % (2 * state.MAX_LEN - state.len[i]); 973036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + start, state.ptr1, state.len[i]); 974036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 975036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bcopy(state.ptr1, state.ptr1 + start, state.len[i]); 976036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN)); 977036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 978036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 979036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 980036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 981036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) { 982baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko StringTestState<char> state(LARGE); 983036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova for (size_t j = 0; j < ITER; j++) { 984036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova state.NewIteration(); 985036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 986036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr1, random() & 255, state.MAX_LEN); 987036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 988036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t start = random() % state.MAX_LEN; 989036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova size_t end = start + random() % (state.MAX_LEN - start); 990036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 991036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2, state.ptr1, start); 992036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memset(state.ptr2 + start, '\0', end - start); 993036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end); 994036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 995036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova bzero(state.ptr1 + start, end - start); 996036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova 997036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN)); 998036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova } 999036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova} 1000b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1001b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoMemcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1002b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, (len % 255) + 1, len); 1003b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, 0, len); 1004b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1005b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, memcpy(dst, src, len)); 1006b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1007b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1008b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1009b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memcpy_align) { 1010b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoMemcpyTest); 1011b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1012b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1013b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memcpy_overread) { 1014b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoMemcpyTest); 1015b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1016b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 10176c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhangstatic void DoMemmoveTest(uint8_t* src, uint8_t* dst, size_t len) { 10186c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(src, (len % 255) + 1, len); 10196c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang memset(dst, 0, len); 10206c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10216c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_EQ(dst, memmove(dst, src, len)); 10226c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang ASSERT_TRUE(memcmp(src, dst, len) == 0); 10236c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10246c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10256c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_align) { 10266c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang RunSrcDstBufferAlignTest(LARGE, DoMemmoveTest); 10276c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10286c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 10296c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu ZhangTEST(string, memmove_overread) { 10306c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang RunSrcDstBufferOverreadTest(DoMemmoveTest); 10316c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang} 10326c80ccdeed9d9b30e961f68229fe8171d79c5d14Shu Zhang 1033b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoMemsetTest(uint8_t* buf, size_t len) { 1034b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 0; i < len; i++) { 1035b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris buf[i] = 0; 1036b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1037b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value = (len % 255) + 1; 1038b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(buf, memset(buf, value, len)); 1039b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 0; i < len; i++) { 1040b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(value, buf[i]); 1041b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1042b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1043b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1044b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, memset_align) { 1045b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferAlignTest(LARGE, DoMemsetTest); 1046b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1047b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1048b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrlenTest(uint8_t* buf, size_t len) { 1049b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1050b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(buf, (32 + (len % 96)), len - 1); 1051b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris buf[len-1] = '\0'; 1052b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(len-1, strlen(reinterpret_cast<char*>(buf))); 1053b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1054b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1055b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1056b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strlen_align) { 1057b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferAlignTest(LARGE, DoStrlenTest); 1058b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1059b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1060b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strlen_overread) { 1061b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSingleBufferOverreadTest(DoStrlenTest); 1062b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1063b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1064b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1065b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1066b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, (32 + (len % 96)), len - 1); 1067b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-1] = '\0'; 1068b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, 0, len); 1069b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcpy(reinterpret_cast<char*>(dst), 1070b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1071b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1072b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1073b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1074b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1075b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcpy_align) { 1076b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoStrcpyTest); 1077b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1078b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1079b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcpy_overread) { 1080b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoStrcpyTest); 1081b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1082b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1083950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferrisstatic void DoStpcpyTest(uint8_t* src, uint8_t* dst, size_t len) { 1084950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris if (len >= 1) { 1085950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(src, (32 + (len % 96)), len - 1); 1086950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris src[len-1] = '\0'; 1087950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris memset(dst, 0, len); 1088950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_EQ(dst+len-1, reinterpret_cast<uint8_t*>(stpcpy(reinterpret_cast<char*>(dst), 1089950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris reinterpret_cast<char*>(src)))); 1090950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1091950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris } 1092950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1093950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1094950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy_align) { 1095950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris RunSrcDstBufferAlignTest(LARGE, DoStpcpyTest); 1096950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1097950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1098950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher FerrisTEST(string, stpcpy_overread) { 1099950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris RunSrcDstBufferOverreadTest(DoStpcpyTest); 1100950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris} 1101950a58e24d1019eb9d814dbb16f111a6b61e3f23Christopher Ferris 1102b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris// Use our own incrementer to cut down on the total number of calls. 1103e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic size_t LargeSetIncrement(size_t len) { 1104b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 4096) { 1105b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 4096; 1106b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else if (len >= 1024) { 1107b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 1024; 1108b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else if (len >= 256) { 1109b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 256; 1110b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1111b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris return 1; 1112b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1113b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1114b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris#define STRCAT_DST_LEN 128 1115b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1116b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferrisstatic void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) { 1117b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= 1) { 1118b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value = 32 + (len % 96); 1119b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(src, value, len - 1); 1120b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-1] = '\0'; 1121b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1122b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris if (len >= STRCAT_DST_LEN) { 1123b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris // Create a small buffer for doing quick compares in each loop. 1124b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris uint8_t cmp_buf[STRCAT_DST_LEN]; 1125b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris // Make sure dst string contains a different value then the src string. 1126b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris int value2 = 32 + (value + 2) % 96; 1127b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(cmp_buf, value2, sizeof(cmp_buf)); 1128b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1129b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris for (size_t i = 1; i <= STRCAT_DST_LEN; i++) { 1130b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst, value2, i-1); 1131b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris memset(dst+i-1, 0, len-i); 1132b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris src[len-i] = '\0'; 1133b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcat(reinterpret_cast<char*>(dst), 1134b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1135b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(dst, cmp_buf, i-1) == 0); 1136b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst+i-1, len-i+1) == 0); 1137b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1138b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } else { 1139b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris dst[0] = '\0'; 1140b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_EQ(dst, reinterpret_cast<uint8_t*>(strcat(reinterpret_cast<char*>(dst), 1141b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris reinterpret_cast<char*>(src)))); 1142b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris ASSERT_TRUE(memcmp(src, dst, len) == 0); 1143b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1144b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris } 1145b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1146b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1147b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcat_align) { 1148e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunSrcDstBufferAlignTest(MEDIUM, DoStrcatTest, LargeSetIncrement); 1149b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1150b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris 1151b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher FerrisTEST(string, strcat_overread) { 1152b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris RunSrcDstBufferOverreadTest(DoStrcatTest); 1153b687ad3c3491fffe22507cafc9347e10cbf6bd31Christopher Ferris} 1154e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1155e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoStrcmpTest(uint8_t* buf1, uint8_t* buf2, size_t len) { 1156e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len >= 1) { 1157e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, (32 + (len % 96)), len - 1); 1158e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = '\0'; 1159e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, (32 + (len % 96)), len - 1); 1160e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = '\0'; 1161e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_EQ(0, strcmp(reinterpret_cast<char*>(buf1), 1162e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1163e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1164e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1165e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1166e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoStrcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t len2) { 1167e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Do string length differences. 1168e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris int c = (32 + (len1 % 96)); 1169e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, c, len1 - 1); 1170e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len1-1] = '\0'; 1171e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, c, len2 - 1); 1172e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len2-1] = '\0'; 1173e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1174e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1175e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1176e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Do single character differences. 1177e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris size_t len; 1178e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len1 > len2) { 1179e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len2; 1180e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } else { 1181e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len1; 1182e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1183e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris // Need at least a two character buffer to do this test. 1184e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len > 1) { 1185e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = '\0'; 1186e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = '\0'; 1187e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris int diff_c = (c + 1) % 96; 1188e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1189e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-2] = diff_c; 1190e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1191e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1192e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1193e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-2] = c; 1194e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-2] = diff_c; 1195e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, strcmp(reinterpret_cast<char*>(buf1), 1196e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris reinterpret_cast<char*>(buf2))); 1197e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1198e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1199e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1200e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, strcmp_align) { 1201e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferAlignTest(MEDIUM, DoStrcmpTest, DoStrcmpFailTest, LargeSetIncrement); 1202e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1203e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1204e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, strcmp_overread) { 1205e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferOverreadTest(DoStrcmpTest, DoStrcmpFailTest); 1206e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1207e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1208e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoMemcmpTest(uint8_t* buf1, uint8_t* buf2, size_t len) { 1209e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, len+1, len); 1210e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, len+1, len); 1211e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_EQ(0, memcmp(buf1, buf2, len)); 1212e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1213e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1214e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferrisstatic void DoMemcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t len2) { 1215e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris size_t len; 1216e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris if (len1 > len2) { 1217e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len2; 1218e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } else { 1219e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris len = len1; 1220e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris } 1221e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1222e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf1, len2+1, len); 1223e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = len2; 1224e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris memset(buf2, len2+1, len); 1225e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, memcmp(buf1, buf2, len)); 1226e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1227e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf1[len-1] = len2+1; 1228e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris buf2[len-1] = len2; 1229e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris ASSERT_NE(0, memcmp(buf1, buf2, len)); 1230e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1231e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1232e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, memcmp_align) { 1233e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferAlignTest(MEDIUM, DoMemcmpTest, DoMemcmpFailTest, LargeSetIncrement); 1234e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1235e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris 1236e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher FerrisTEST(string, memcmp_overread) { 1237e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris RunCmpBufferOverreadTest(DoMemcmpTest, DoMemcmpFailTest); 1238e5bbb6b6ab662503f06ceb20fa841d2e558d596dChristopher Ferris} 1239