1b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea/*
2b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Copyright (C) 2012 The Android Open Source Project
3b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
4b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Licensed under the Apache License, Version 2.0 (the "License");
5b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * you may not use this file except in compliance with the License.
6b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * You may obtain a copy of the License at
7b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
8b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *      http://www.apache.org/licenses/LICENSE-2.0
9b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea *
10b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * Unless required by applicable law or agreed to in writing, software
11b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * distributed under the License is distributed on an "AS IS" BASIS,
12b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * See the License for the specific language governing permissions and
14b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea * limitations under the License.
15b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea */
16b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
17b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <gtest/gtest.h>
18b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
19b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <errno.h>
20036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#include <math.h>
21b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#include <string.h>
22b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
23036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define KB 1024
24036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define SMALL 1*KB
25036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define LARGE 64*KB
26036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
27036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastatic int signum(int i) {
28036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  if (i < 0) {
29036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    return -1;
30036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  } else if (i > 0) {
31036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    return 1;
32036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
33036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  return 0;
34036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
35036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
36b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror) {
37b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Valid.
38b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Success", strerror(0));
39b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Operation not permitted", strerror(1));
40b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
41b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Invalid.
42e6e60065ff093ff8c859ab146cf543531cb1967cElliott Hughes  ASSERT_STREQ("Unknown error -1", strerror(-1));
43b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1234", strerror(1234));
44b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
45b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
46ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes#if __BIONIC__ // glibc's strerror isn't thread safe, only its strsignal.
47ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes
48ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrErrorFn(void*) {
49b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0);
50b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  return reinterpret_cast<void*>(equal);
51b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
52b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
53b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_concurrent) {
54b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  const char* strerror1001 = strerror(1001);
55b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1001", strerror1001);
56b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
57b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  pthread_t t;
58b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrErrorFn, NULL));
59b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  void* result;
60b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_join(t, &result));
61b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_TRUE(static_cast<bool>(result));
62b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
63b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1001", strerror1001);
64b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
65ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughes
66b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
67b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
68b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#if __BIONIC__ // glibc's strerror_r doesn't even have the same signature as the POSIX one.
69b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strerror_r) {
70b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  char buf[256];
71b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
72b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Valid.
73b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(0, buf, sizeof(buf)));
74b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Success", buf);
75b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(1, buf, sizeof(buf)));
76b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Operation not permitted", buf);
77b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
78b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Invalid.
79b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(-1, buf, sizeof(buf)));
80606058933c5129cb1026960ea67624b9426c610fNick Kralevich  ASSERT_STREQ("Unknown error -1", buf);
81b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, strerror_r(1234, buf, sizeof(buf)));
82b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown error 1234", buf);
83b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
84b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Buffer too small.
85b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(-1, strerror_r(0, buf, 2));
86b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(ERANGE, errno);
87b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
88b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
89b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
90b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal) {
91b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // A regular signal.
92b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Hangup", strsignal(1));
93b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
94b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // A real-time signal.
95b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#ifdef __GLIBC__ // glibc reserves real-time signals for internal use, and doesn't count those.
96b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Real-time signal 14", strsignal(48));
97b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#else
98b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Real-time signal 16", strsignal(48));
99b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea#endif
100b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
101b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  // Errors.
102b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal -1", strsignal(-1)); // Too small.
103b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 0", strsignal(0)); // Still too small.
104b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1234", strsignal(1234)); // Too large.
105b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
106b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
107ad88a0863110798cef5169dcf917e18b967a7cf6Elliott Hughesstatic void* ConcurrentStrSignalFn(void*) {
108b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  bool equal = (strcmp("Unknown signal 2002", strsignal(2002)) == 0);
109b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  return reinterpret_cast<void*>(equal);
110b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
111b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
112b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina TirdeaTEST(string, strsignal_concurrent) {
113b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  const char* strsignal1001 = strsignal(1001);
114b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1001", strsignal1001);
115b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
116b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  pthread_t t;
117b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentStrSignalFn, NULL));
118b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  void* result;
119b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_EQ(0, pthread_join(t, &result));
120b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_TRUE(static_cast<bool>(result));
121b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea
122b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea  ASSERT_STREQ("Unknown signal 1001", strsignal1001);
123b5f053b5a7deb084e7a052d527e0aa41339ae05cIrina Tirdea}
124036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
125036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: where did these numbers come from?
126036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define POS_ITER    10
127036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#define ITER        500
128036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
129036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// For every length we want to test, vary and change alignment
130036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// of allocated memory, fill it with some values, calculate
131036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// expected result and then run function and compare what we got.
132036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// These tests contributed by Intel Corporation.
133036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova// TODO: make these tests more intention-revealing and less random.
134baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkotemplate<class Character>
135036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonovastruct StringTestState {
136036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState(size_t MAX_LEN) : MAX_LEN(MAX_LEN) {
137036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int max_alignment = 64;
138036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
139036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    // TODO: fix the tests to not sometimes use twice their specified "MAX_LEN".
140baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    glob_ptr = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment));
141baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    glob_ptr1 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment));
142baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    glob_ptr2 = reinterpret_cast<Character*>(valloc(2 * sizeof(Character) * MAX_LEN + max_alignment));
143036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
144036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    InitLenArray();
145036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
146036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    srandom(1234);
147036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
148036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
149036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  ~StringTestState() {
150036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr);
151036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr1);
152036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    free(glob_ptr2);
153036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
154036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
155036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  void NewIteration() {
156036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int alignments[] = { 24, 32, 16, 48, 1, 2, 3, 0, 5, 11 };
157036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int usable_alignments = 10;
158036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int align1 = alignments[random() % (usable_alignments - 1)];
159036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int align2 = alignments[random() % (usable_alignments - 1)];
160036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
161036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr = glob_ptr + align1;
162036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr1 = glob_ptr1 + align1;
163036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ptr2 = glob_ptr2 + align2;
164036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
165036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
166036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  const size_t MAX_LEN;
167baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  Character *ptr, *ptr1, *ptr2;
168036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  size_t n;
169036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int len[ITER + 1];
170036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
171036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova private:
172baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  Character *glob_ptr, *glob_ptr1, *glob_ptr2;
173036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
174036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Calculate input lengths and fill state.len with them.
175036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Test small lengths with more density than big ones. Manually push
176036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // smallest (0) and biggest (MAX_LEN) lengths. Avoid repeats.
177036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  // Return number of lengths to test.
178036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  void InitLenArray() {
179036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    n = 0;
180036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    len[n++] = 0;
181036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t i = 1; i < ITER; ++i) {
182036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int l = (int) exp(log((double) MAX_LEN) * i / ITER);
183036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (l != len[n - 1]) {
184036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        len[n++] = l;
185036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
186036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
187036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    len[n++] = MAX_LEN;
188036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
189036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova};
190036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
191036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcat) {
192baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
193036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
194036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
195036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
196036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
197036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN);
198036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
199036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN);
200036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
201036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
202036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[random() % state.len[i]] = '\0';
203036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
204036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
205036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strcpy(state.ptr + state.MAX_LEN - 1, state.ptr1);
206036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
207036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      EXPECT_TRUE(strcat(state.ptr2, state.ptr1) == state.ptr2);
208036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      EXPECT_TRUE(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN) == 0);
209036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
210036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
211036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
212036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
21313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// one byte target with "\0" source
21413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy2) {
21513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char buf[1];
21613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char* orig = strdup("");
21713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  strcpy(buf, orig);
21813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('\0', buf[0]);
21913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  free(orig);
22013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich}
22113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich
22213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we under fill target
22313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy3) {
22413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char buf[10];
22513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char* orig = strdup("12345");
22613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  memset(buf, 'A', sizeof(buf));
22713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  strcpy(buf, orig);
22813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('1',  buf[0]);
22913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('2',  buf[1]);
23013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('3',  buf[2]);
23113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('4',  buf[3]);
23213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('5',  buf[4]);
23313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('\0', buf[5]);
23413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('A',  buf[6]);
23513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('A',  buf[7]);
23613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('A',  buf[8]);
23713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('A',  buf[9]);
23813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  free(orig);
23913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich}
24013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich
24113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich// multibyte target where we fill target exactly
24213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick KralevichTEST(string, strcpy4) {
24313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char buf[10];
24413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  char* orig = strdup("123456789");
24513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  memset(buf, 'A', sizeof(buf));
24613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  strcpy(buf, orig);
24713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('1',  buf[0]);
24813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('2',  buf[1]);
24913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('3',  buf[2]);
25013476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('4',  buf[3]);
25113476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('5',  buf[4]);
25213476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('6',  buf[5]);
25313476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('7',  buf[6]);
25413476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('8',  buf[7]);
25513476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('9',  buf[8]);
25613476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  ASSERT_EQ('\0', buf[9]);
25713476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich  free(orig);
25813476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich}
25913476deec46d7ba101c1f76b8ddcaab9d0b96b84Nick Kralevich
260cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) {
261cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
262cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
263cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
264cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
265cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strcat(buf, "01234");
266cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
267cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
268cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
269cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
270cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
271cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
272cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
273cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
274cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
275cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
276cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
277cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
278cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
279cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) {
280cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
281cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
282cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
283cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
284cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strcat(buf, "01234567");
285cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
286cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
287cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
288cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
289cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
290cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
291cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
292cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
293cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
294cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
295cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
296cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
297cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
298cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) {
299cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
300cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
301cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
302cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
303cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1);
304cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
305cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
306cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
307cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
308cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
309cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
310cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
311cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
312cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
313cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
314cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
315cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
316cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
317cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) {
318cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
319cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
320cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
321cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
322cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "0123456789", 5);
323cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
324cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
325cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
326cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
327cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
328cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
329cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
330cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
331cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
332cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
333cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
334cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
335cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
336cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) {
337cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
338cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
339cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
340cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
341cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234567", 8);
342cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
343cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
344cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
345cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
346cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
347cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
348cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
349cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
350cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
351cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
352cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
353cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
354cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
355cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) {
356cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
357cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
358cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
359cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
360cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234567", 9);
361cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
362cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
363cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
364cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
365cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
366cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
367cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
368cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
369cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
370cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
371cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
372cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
373cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
3744f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) {
3754f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  char buf[10];
3764f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  const char* s = "01234";
3774f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  memcpy(buf, s, strlen(s) + 1);
3784f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s)));
3794f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich}
3804f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich
381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) {
382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
384baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected);
410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) {
415baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
429036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
430036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) {
452baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, '\2', pos);
459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[pos] = '\0';
460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[state.MAX_LEN - 1] = '\0';
461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr2[state.MAX_LEN - 1] = '\0';
466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN);
468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr[2 * state.MAX_LEN - 1] = '\0';
470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2);
472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 ||
473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
477dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich
478dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich#if __BIONIC__
479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) {
480baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]);
486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]);
488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, '\3', pos);
491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos < state.len[i]) {
493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1);
494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]);
496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0';
497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]);
500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0);
502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__
508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) {
509baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int rand = random() & 255;
514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (rand < 1) {
515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      rand = 1;
516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, rand, state.MAX_LEN);
518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos < state.MAX_LEN) {
521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, random() & 255, state.MAX_LEN);
526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN);
527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos > state.MAX_LEN - 1) {
529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN);
530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[2 * state.MAX_LEN - 1] = '\0';
531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1));
536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) ||
537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) {
543baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN);
549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN);
551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[random() % state.len[i]] = '\0';
554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = strlen(state.ptr1);
557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t actual = random() % state.len[i];
559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos));
560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0';
561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2);
563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0);
564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) {
569baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) {
606baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[random () % state.MAX_LEN] = '\0';
612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos;
617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (memchr(state.ptr1, 0, state.MAX_LEN)) {
618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = strlen(state.ptr1);
619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = state.MAX_LEN - 1;
621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN);
624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2);
627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 ||
628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0);
629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) {
633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
634baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected);
660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) {
665036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
666baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
668036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
669036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
670036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
671036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
672036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
673036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
674036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
675036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
676036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
677036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
678036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
679036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
680036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
681036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
682036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected);
683036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
684036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
685036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
686036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
687036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) {
688036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
689baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
690036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
691036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
692036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
693036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
694036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
695036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
696036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
697036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
698036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
699036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
700036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
701036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
702036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
703036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
704036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
705036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected);
706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
708036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
709036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
710036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) {
711baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(SMALL);
712036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
713036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
714036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
715036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
716036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c1 = random() & 0xff;
717036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c2 = random() & 0xff;
718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, c1, state.MAX_LEN);
719036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, c1, state.MAX_LEN);
720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]);
722036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[pos] = c2;
723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
724036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected = (static_cast<int>(c1) - static_cast<int>(c2));
725036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN);
726036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
727036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(signum(expected), signum(actual));
728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
732baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko#if defined(__BIONIC__)
733baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenkoextern "C" int __memcmp16(const unsigned short *ptr1, const unsigned short *ptr2, size_t n);
734baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
735baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, __memcmp16) {
736baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<unsigned short> state(SMALL);
737baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
738baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  for (size_t i = 0; i < state.n; i++) {
739baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    for (size_t j = 0; j < POS_ITER; j++) {
740baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      state.NewIteration();
741baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
742baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      unsigned short mask = 0xffff;
743baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      unsigned short c1 = rand() & mask;
744baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      unsigned short c2 = rand() & mask;
745baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
746baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      std::fill(state.ptr1, state.ptr1 + state.MAX_LEN, c1);
747baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      std::fill(state.ptr2, state.ptr2 + state.MAX_LEN, c1);
748baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
749baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]);
750baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      state.ptr2[pos] = c2;
751baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
752baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int expected = (static_cast<unsigned short>(c1) - static_cast<unsigned short>(c2));
753baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int actual = __memcmp16(state.ptr1, state.ptr2, (size_t) state.MAX_LEN);
754baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
755baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      ASSERT_EQ(expected, actual);
756baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    }
757baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  }
758baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko}
759baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko#endif
760baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
761baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander IvchenkoTEST(string, wmemcmp) {
762baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<wchar_t> state(SMALL);
763baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
764baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  for (size_t i = 0; i < state.n; i++) {
765baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    for (size_t j = 0; j < POS_ITER; j++) {
766baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      state.NewIteration();
767baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
768baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      long long mask = ((long long) 1 << 8 * sizeof(wchar_t)) - 1;
769baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int c1 = rand() & mask;
770baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int c2 = rand() & mask;
771baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      wmemset(state.ptr1, c1, state.MAX_LEN);
772baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      wmemset(state.ptr2, c1, state.MAX_LEN);
773baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
774baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]);
775baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      state.ptr2[pos] = c2;
776baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
777baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int expected = (static_cast<int>(c1) - static_cast<int>(c2));
778baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      int actual = wmemcmp(state.ptr1, state.ptr2, (size_t) state.MAX_LEN);
779baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
780baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko      ASSERT_EQ(signum(expected), signum(actual));
781baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko    }
782baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  }
783baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko}
784baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko
785036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) {
786baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(LARGE);
787036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int rand = random() & 255;
788036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
789036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
790036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
791036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
792036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
793036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
794036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, rand, state.len[i]);
795036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
796036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
797036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, rand, state.len[i]);
798036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
799036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + pos, '\0', state.len[i]);
800036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
801036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos);
802036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
803036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
804036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
805036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
806036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
807036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) {
808baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(LARGE);
809036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  char ch = random () & 255;
810036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
811036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
812036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
813036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
814036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~ch, state.MAX_LEN);
815036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, state.MAX_LEN);
816036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
817036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random () % (state.MAX_LEN - state.len[i]);
818036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      for (size_t k = pos; k < pos + state.len[i]; k++) {
819036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[k] = ch;
820036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
821036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
822036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos);
823036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
824036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
825036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
826036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
827036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
828036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
829036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) {
830baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(LARGE);
831036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
832036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
833036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
834036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
835036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, 2 * state.MAX_LEN);
836036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
837036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
838036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
839036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
840036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
841036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr1, state.len[i]);
842036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr1 + pos, state.ptr, state.len[i]);
843036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
844036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos);
845036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN));
846036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
847036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
848036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
849036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
850036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) {
851baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(LARGE);
852036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
853036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
854036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
855036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
856036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.MAX_LEN);
857036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN);
858036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
859036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
860036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t start = random() % (2 * state.MAX_LEN - state.len[i]);
861036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2 + start, state.ptr1, state.len[i]);
862036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
863036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      bcopy(state.ptr1, state.ptr1 + start, state.len[i]);
864036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN));
865036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
866036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
867036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
868036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
869036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) {
870baa91f4f8974b6e9a81fa3aa49f051b3bf823653Alexander Ivchenko  StringTestState<char> state(LARGE);
871036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
872036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
873036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
874036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
875036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
876036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t start = random() % state.MAX_LEN;
877036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t end = start + random() % (state.MAX_LEN - start);
878036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
879036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2, state.ptr1, start);
880036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2 + start, '\0', end - start);
881036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end);
882036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
883036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    bzero(state.ptr1 + start, end - start);
884036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
885036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
886036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
887036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
888