string_test.cpp revision 036154b0c2d64d618aded8674f2e13cbbb2867e2
1b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea/*
2b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Copyright (C) 2012 The Android Open Source Project
3b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
4b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Licensed under the Apache License, Version 2.0 (the "License");
5b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * you may not use this file except in compliance with the License.
6b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * You may obtain a copy of the License at
7b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
8b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *      http://www.apache.org/licenses/LICENSE-2.0
9b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
10b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Unless required by applicable law or agreed to in writing, software
11b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * distributed under the License is distributed on an "AS IS" BASIS,
12b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * See the License for the specific language governing permissions and
14b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * limitations under the License.
15b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea */
16b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
17b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <gtest/gtest.h>
18b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
19b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <errno.h>
20036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#include <math.h>
21b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <string.h>
22b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
23036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define KB 1024
24036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define SMALL 1*KB
25036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define LARGE 64*KB
26036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
27036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastatic int signum(int i) {
28036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  if (i < 0) {
29036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    return -1;
30036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  } else if (i > 0) {
31036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    return 1;
32036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
33036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  return 0;
34036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
35036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
36b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) {
37b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Valid.
38b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Success", strerror(0));
39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Operation not permitted", strerror(1));
40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Invalid.
42b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 4294967295", strerror(-1));
43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1234", strerror(1234));
44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
45b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
46ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes#if __BIONIC__ // glibc's strerror isn't thread safe, only its strsignal.
47ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes
48ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) {
49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0);
50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  return reinterpret_cast<void*>(equal);
51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) {
54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  const char* strerror1001 = strerror(1001);
55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1001", strerror1001);
56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  pthread_t t;
58b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL));
59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  void* result;
60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_join(t, &result));
61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_TRUE(static_cast<bool>(result));
62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1001", strerror1001);
64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
65ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes
66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror_r doesn't even have the same signature as the POSIX one.
69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) {
70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  char buf[256];
71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Valid.
73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf)));
74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Success", buf);
75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf)));
76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Operation not permitted", buf);
77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Invalid.
79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf)));
80b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 4294967295", buf);
81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf)));
82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1234", buf);
83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Buffer too small.
85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(-1, strerror_r(0, buf, 2));
86b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(ERANGE, errno);
87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) {
91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // A regular signal.
92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Hangup", strsignal(1));
93b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // A real-time signal.
95b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#ifdef __GLIBC__ // glibc reserves real-time signals for internal use, and doesn't count those.
96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Real-time signal 14", strsignal(48));
97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#else
98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Real-time signal 16", strsignal(48));
99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Errors.
102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small.
103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small.
104b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large.
105b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
107ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) {
108b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0);
109b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  return reinterpret_cast<void*>(equal);
110b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
111b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
112b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) {
113b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  const char* strsignal1001 = strsignal(1001);
114b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1001", strsignal1001);
115b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
116b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  pthread_t t;
117b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL));
118b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  void* result;
119b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_join(t, &result));
120b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_TRUE(static_cast<bool>(result));
121b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
122b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1001", strsignal1001);
123b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
124036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
125036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: where did these numbers come from?
126036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define POS_ITER    10
127036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define ITER        500
128036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
129036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// For every length we want to test, vary and change alignment
130036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// of allocated memory, fill it with some values, calculate
131036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// expected result and then run function and compare what we got.
132036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// These tests contributed by Intel Corporation.
133036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: make these tests more intention-revealing and less random.
134036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastruct StringTestState {
135036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN) {
136036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int max_alignment = 64;
137036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
138036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN".
139036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    glob_ptr = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment));
140036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    glob_ptr1 = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment));
141036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    glob_ptr2 = reinterpret_cast<char*>(valloc(2 * MAX_LEN + max_alignment));
142036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
143036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    InitLenArray();
144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
145036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    srandom(1234);
146036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
147036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
148036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  ~StringTestState() {
149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr);
150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr1);
151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr2);
152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
153036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
154036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  void NewIteration() {
155036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int alignments[] = { 24, 32, 16, 48, 1, 2, 3, 0, 5, 11 };
156036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int usable_alignments = 10;
157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int align1 = alignments[random() % (usable_alignments - 1)];
158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int align2 = alignments[random() % (usable_alignments - 1)];
159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
160036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr = glob_ptr + align1;
161036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr1 = glob_ptr1 + align1;
162036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr2 = glob_ptr2 + align2;
163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  const size_t MAX_LEN;
166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  char *ptr, *ptr1, *ptr2;
167036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  size_t n;
168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int len[ITER + 1];
169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private:
171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  char *glob_ptr, *glob_ptr1, *glob_ptr2;
172036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
173036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Calculate input lengths and fill state.len with them.
174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Test small lengths with more density than big ones. Manually push
175036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats.
176036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Return number of lengths to test.
177036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  void InitLenArray() {
178036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    n = 0;
179036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    len[n++] = 0;
180036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t i = 1; i < ITER; ++i) {
181036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int l = (int) exp(log((double) MAX_LEN) * i / ITER);
182036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (l != len[n - 1]) {
183036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        len[n++] = l;
184036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
185036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
186036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    len[n++] = MAX_LEN;
187036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
188036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova};
189036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
190036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) {
191036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
192036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
193036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
194036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
195036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
196036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN);
197036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
198036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN);
199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[random() % state.len[i]] = '\0';
202036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
204036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1);
205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2);
207036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0);
208036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
209036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
210036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) {
213036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
214036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
215036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
216036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
217036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
218036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
219036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
220036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
221036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
222036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
223036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
224036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
225036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
226036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
227036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
228036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
229036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
230036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
231036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
232036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
233036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
234036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
235036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
236036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
237036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
238036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
239036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
240036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected);
241036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
242036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
243036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
244036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
245036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) {
246036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
247036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
248036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
249036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
250036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
251036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
252036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
253036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
254036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
255036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
256036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
257036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
258036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
259036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
260036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
261036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
262036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
263036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
264036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
265036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
266036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
267036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
268036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
269036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
270036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
271036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
272036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
273036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
274036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
275036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
276036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
277036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
278036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
279036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
280036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
281036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
282036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) {
283036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
284036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
285036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
286036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
287036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
288036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
289036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, '\2', pos);
290036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[pos] = '\0';
291036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[state.MAX_LEN - 1] = '\0';
292036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
293036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
294036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
295036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
296036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr2[state.MAX_LEN - 1] = '\0';
297036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
298036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN);
299036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
300036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr[2 * state.MAX_LEN - 1] = '\0';
301036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
302036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2);
303036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 ||
304036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
305036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
306036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
307036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
308036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__
309036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) {
310036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
311036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
312036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
313036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
314036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
315036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]);
316036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
317036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]);
318036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
319036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
320036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, '\3', pos);
321036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
322036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos < state.len[i]) {
323036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1);
324036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
325036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]);
326036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0';
327036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
328036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
329036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]);
330036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
331036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0);
332036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
333036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
334036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
335036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
336036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
337036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__
338036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) {
339036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
340036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
341036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
342036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
343036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int rand = random() & 255;
344036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (rand < 1) {
345036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      rand = 1;
346036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
347036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, rand, state.MAX_LEN);
348036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
349036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
350036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos < state.MAX_LEN) {
351036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
352036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
353036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
354036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
355036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, random() & 255, state.MAX_LEN);
356036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN);
357036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
358036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos > state.MAX_LEN - 1) {
359036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN);
360036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[2 * state.MAX_LEN - 1] = '\0';
361036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
362036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
363036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
364036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
365036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1));
366036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) ||
367036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
368036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
369036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
370036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
371036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
372036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) {
373036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
374036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
375036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
376036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
377036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
378036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN);
379036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
380036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN);
381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[random() % state.len[i]] = '\0';
384036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = strlen(state.ptr1);
387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t actual = random() % state.len[i];
389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos));
390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0';
391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2);
393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0);
394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) {
399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
415036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
430036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) {
436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[random () % state.MAX_LEN] = '\0';
442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos;
447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (memchr(state.ptr1, 0, state.MAX_LEN)) {
448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = strlen(state.ptr1);
449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = state.MAX_LEN - 1;
451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
452036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN);
454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2);
457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 ||
458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0);
459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) {
463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected);
490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) {
495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
509036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected);
513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) {
518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected);
536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) {
541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
543036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c1 = random() & 0xff;
547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c2 = random() & 0xff;
548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, c1, state.MAX_LEN);
549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, c1, state.MAX_LEN);
550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]);
552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[pos] = c2;
553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected = (static_cast<int>(c1) - static_cast<int>(c2));
555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN);
556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(signum(expected), signum(actual));
558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) {
563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int rand = random() & 255;
565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
569036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, rand, state.len[i]);
572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, rand, state.len[i]);
575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + pos, '\0', state.len[i]);
577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos);
579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) {
585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  char ch = random () & 255;
587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~ch, state.MAX_LEN);
592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, state.MAX_LEN);
593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random () % (state.MAX_LEN - state.len[i]);
595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      for (size_t k = pos; k < pos + state.len[i]; k++) {
596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[k] = ch;
597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos);
600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) {
607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, 2 * state.MAX_LEN);
613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr1, state.len[i]);
619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr1 + pos, state.ptr, state.len[i]);
620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos);
622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN));
623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) {
628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.MAX_LEN);
634036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN);
635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t start = random() % (2 * state.MAX_LEN - state.len[i]);
638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2 + start, state.ptr1, state.len[i]);
639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      bcopy(state.ptr1, state.ptr1 + start, state.len[i]);
641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN));
642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) {
647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t start = random() % state.MAX_LEN;
654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t end = start + random() % (state.MAX_LEN - start);
655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2, state.ptr1, start);
657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2 + start, '\0', end - start);
658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end);
659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    bzero(state.ptr1 + start, end - start);
661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
665