string_test.cpp revision cf870199d576bdfc339b7fb016c9f6fe7f2c87ed
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.
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
212cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat2) {
213cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
214cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
215cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
216cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
217cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strcat(buf, "01234");
218cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
219cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
220cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
221cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
222cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
223cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
224cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
225cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
226cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
227cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
228cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
229cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
230cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
231cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strcat3) {
232cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
233cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
234cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
235cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
236cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strcat(buf, "01234567");
237cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
238cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
239cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
240cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
241cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
242cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
243cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
244cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
245cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
246cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
247cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
248cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
249cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
250cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat2) {
251cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
252cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
253cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
254cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
255cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234", sizeof(buf) - strlen(buf) - 1);
256cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
257cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
258cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
259cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
260cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
261cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
262cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
263cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
264cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
265cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
266cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
267cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
268cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
269cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat3) {
270cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
271cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
272cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
273cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
274cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "0123456789", 5);
275cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
276cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
277cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
278cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
279cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
280cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
281cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
282cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0', buf[6]);
283cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[7]);
284cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[8]);
285cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('A',  buf[9]);
286cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
287cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
288cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat4) {
289cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
290cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
291cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
292cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
293cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234567", 8);
294cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
295cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
296cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
297cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
298cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
299cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
300cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
301cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
302cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
303cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
304cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
305cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
306cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
307cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick KralevichTEST(string, strncat5) {
308cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char buf[10];
309cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  memset(buf, 'A', sizeof(buf));
310cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[0] = 'a';
311cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  buf[1] = '\0';
312cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  char* res = strncat(buf, "01234567", 9);
313cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ(buf, res);
314cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('a',  buf[0]);
315cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('0',  buf[1]);
316cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('1',  buf[2]);
317cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('2',  buf[3]);
318cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('3',  buf[4]);
319cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('4',  buf[5]);
320cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('5', buf[6]);
321cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('6',  buf[7]);
322cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('7',  buf[8]);
323cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich  ASSERT_EQ('\0',  buf[9]);
324cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich}
325cf870199d576bdfc339b7fb016c9f6fe7f2c87edNick Kralevich
3264f40e511b0612ea099ab5b0843977fe7a49372fdNick KralevichTEST(string, strchr_with_0) {
3274f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  char buf[10];
3284f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  const char* s = "01234";
3294f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  memcpy(buf, s, strlen(s) + 1);
3304f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich  EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s)));
3314f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich}
3324f40e511b0612ea099ab5b0843977fe7a49372fdNick Kralevich
333036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strchr) {
334036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
335036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
336036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
337036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
338036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
339036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
340036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
341036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
342036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
343036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
344036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
345036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
346036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
347036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
348036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
349036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
350036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
351036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
352036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
353036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
354036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
355036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
356036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
357036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
358036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
359036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
360036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
361036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strchr(state.ptr1, seek_char) == expected);
362036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
363036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
364036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
365036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
366036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcmp) {
367036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
368036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
369036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
370036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
371036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
372036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
373036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
374036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
375036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
376036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
377036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
378036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
379036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
380036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
381036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
382036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
383036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
384036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
385036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
386036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
387036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
388036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
389036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
390036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
391036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
392036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
393036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
394036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
395036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strcmp(state.ptr1, state.ptr2);
396036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
397036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
398036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
399036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
400036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
401036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
402036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
403036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strcpy) {
404036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
405036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
406036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
407036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
408036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
409036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
410036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, '\2', pos);
411036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[pos] = '\0';
412036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[state.MAX_LEN - 1] = '\0';
413036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
414036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
415036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
416036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
417036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr2[state.MAX_LEN - 1] = '\0';
418036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
419036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\1', state.MAX_LEN);
420036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
421036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr[2 * state.MAX_LEN - 1] = '\0';
422036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
423036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strcpy(state.ptr2, state.ptr1) == state.ptr2);
424036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN)) != 0 ||
425036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
426036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
427036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
428036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
429dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich
430dcab1b2c76a498c56bc00024613386de8b4b2aaeNick Kralevich#if __BIONIC__
431036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcat) {
432036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
433036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
434036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
435036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
436036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
437036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN + state.len[i]);
438036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
439036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]);
440036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
441036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
442036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, '\3', pos);
443036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
444036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos < state.len[i]) {
445036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, pos + 1);
446036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
447036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr + state.MAX_LEN - 1, state.ptr1, state.len[i]);
448036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr[state.MAX_LEN + state.len[i] - 1] = '\0';
449036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
450036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
451036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strlcat(state.ptr2, state.ptr1, state.MAX_LEN + state.len[i]);
452036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
453036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memcmp(state.ptr, state.ptr2, state.MAX_LEN + state.len[i]) == 0);
454036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
455036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
456036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
457036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
458036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
459036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#if __BIONIC__
460036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strlcpy) {
461036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
462036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < POS_ITER; j++) {
463036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
464036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
465036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    int rand = random() & 255;
466036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (rand < 1) {
467036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      rand = 1;
468036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
469036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, rand, state.MAX_LEN);
470036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
471036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos = random() % state.MAX_LEN;
472036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos < state.MAX_LEN) {
473036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[pos] = '\0';
474036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
475036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
476036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
477036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, random() & 255, state.MAX_LEN);
478036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr2, state.MAX_LEN);
479036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
480036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (pos > state.MAX_LEN - 1) {
481036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, state.MAX_LEN);
482036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[2 * state.MAX_LEN - 1] = '\0';
483036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
484036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
485036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
486036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
487036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(strlcpy(state.ptr2, state.ptr1, state.MAX_LEN), strlen(state.ptr1));
488036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE((memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0) ||
489036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 (memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0));
490036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
491036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
492036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova#endif
493036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
494036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncat) {
495036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
496036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
497036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
498036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
499036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
500036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, '\2', state.MAX_LEN);
501036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.MAX_LEN - 1] = '\0';
502036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr2, 2 * state.MAX_LEN);
503036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
504036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
505036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[random() % state.len[i]] = '\0';
506036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
507036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
508036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = strlen(state.ptr1);
509036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
510036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t actual = random() % state.len[i];
511036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      strncpy(state.ptr + state.MAX_LEN - 1, state.ptr1, std::min(actual, pos));
512036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr[state.MAX_LEN + std::min(actual, pos) - 1] = '\0';
513036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
514036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strncat(state.ptr2, state.ptr1, actual) == state.ptr2);
515036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(memcmp(state.ptr, state.ptr2, 2 * state.MAX_LEN), 0);
516036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
517036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
518036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
519036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
520036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncmp) {
521036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
522036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
523036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
524036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
525036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
526036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, 'v', state.MAX_LEN);
527036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, 'n', state.MAX_LEN);
528036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
529036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[state.len[i] - 1] = '\0';
530036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
531036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = 1 + (random() % (state.MAX_LEN - 1));
532036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual;
533036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected;
534036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
535036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, state.len[i]);
536036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = 0;
537036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
538036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
539036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memcpy(state.ptr1, state.ptr2, pos);
540036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (state.ptr1[pos] > state.ptr2[pos]) {
541036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 1;
542036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else if (state.ptr1[pos] == state.ptr2[pos]) {
543036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr1[pos + 1] = '\0';
544036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          state.ptr2[pos + 1] = '\0';
545036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = 0;
546036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
547036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = -1;
548036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
549036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        actual = strncmp(state.ptr1, state.ptr2, state.len[i]);
550036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
551036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
552036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(expected, signum(actual));
553036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
554036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
555036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
556036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
557036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strncpy) {
558036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
559036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
560036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
561036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
562036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
563036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.ptr1[random () % state.MAX_LEN] = '\0';
564036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr, state.ptr1, state.MAX_LEN);
565036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
566036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2, '\1', state.MAX_LEN);
567036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
568036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t pos;
569036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    if (memchr(state.ptr1, 0, state.MAX_LEN)) {
570036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = strlen(state.ptr1);
571036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    } else {
572036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      pos = state.MAX_LEN - 1;
573036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
574036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
575036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr + state.MAX_LEN, '\0', state.MAX_LEN);
576036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr + state.MAX_LEN, state.ptr1, pos + 1);
577036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
578036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_TRUE(strncpy(state.ptr2, state.ptr1, state.MAX_LEN) == state.ptr2);
579036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_FALSE(memcmp(state.ptr1, state.ptr, state.MAX_LEN) != 0 ||
580036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova                 memcmp(state.ptr2, state.ptr + state.MAX_LEN, state.MAX_LEN) != 0);
581036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
582036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
583036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
584036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, strrchr) {
585036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
586036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
587036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 1; i < state.n; i++) {
588036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
589036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
590036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
591036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (~seek_char > 0) {
592036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, ~seek_char, state.len[i]);
593036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
594036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        memset(state.ptr1, '\1', state.len[i]);
595036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
596036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr1[state.len[i] - 1] = '\0';
597036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
598036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
599036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
600036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i] - 1) {
601036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        if (seek_char == 0) {
602036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = state.ptr1 + state.len[i] - 1;
603036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        } else {
604036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova          expected = NULL;
605036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        }
606036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
607036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
608036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
609036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
610036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
611036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(strrchr(state.ptr1, seek_char) == expected);
612036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
613036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
614036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
615036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
616036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memchr) {
617036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
618036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
619036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
620036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
621036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
622036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
623036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
624036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
625036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
626036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
627036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
628036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
629036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
630036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
631036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
632036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
633036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
634036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memchr(state.ptr1, seek_char, state.len[i]) == expected);
635036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
636036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
637036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
638036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
639036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memrchr) {
640036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int seek_char = random() & 255;
641036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
642036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
643036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
644036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
645036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
646036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~seek_char, state.len[i]);
647036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
648036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = random() % state.MAX_LEN;
649036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      char* expected;
650036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      if (pos >= state.len[i]) {
651036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = NULL;
652036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      } else {
653036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[pos] = seek_char;
654036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        expected = state.ptr1 + pos;
655036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
656036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
657036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memrchr(state.ptr1, seek_char, state.len[i]) == expected);
658036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
659036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
660036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
661036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
662036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcmp) {
663036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(SMALL);
664036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
665036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
666036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
667036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
668036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c1 = random() & 0xff;
669036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int c2 = random() & 0xff;
670036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, c1, state.MAX_LEN);
671036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, c1, state.MAX_LEN);
672036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
673036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int pos = (state.len[i] == 0) ? 0 : (random() % state.len[i]);
674036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.ptr2[pos] = c2;
675036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
676036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int expected = (static_cast<int>(c1) - static_cast<int>(c2));
677036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      int actual = memcmp(state.ptr1, state.ptr2, state.MAX_LEN);
678036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
679036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(signum(expected), signum(actual));
680036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
681036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
682036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
683036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
684036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memcpy) {
685036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
686036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  int rand = random() & 255;
687036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
688036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
689036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
690036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
691036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
692036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
693036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, rand, state.len[i]);
694036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
695036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
696036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2, rand, state.len[i]);
697036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + state.len[i], ~rand, state.MAX_LEN - state.len[i]);
698036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr2 + pos, '\0', state.len[i]);
699036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
700036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_FALSE(memcpy(state.ptr2 + pos, state.ptr1 + pos, state.len[i]) != state.ptr2 + pos);
701036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
702036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
703036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
704036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
705036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
706036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memset) {
707036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
708036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  char ch = random () & 255;
709036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
710036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
711036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
712036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
713036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, ~ch, state.MAX_LEN);
714036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, state.MAX_LEN);
715036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
716036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random () % (state.MAX_LEN - state.len[i]);
717036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      for (size_t k = pos; k < pos + state.len[i]; k++) {
718036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova        state.ptr1[k] = ch;
719036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      }
720036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
721036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memset(state.ptr2 + pos, ch, state.len[i]) == state.ptr2 + pos);
722036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
723036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
724036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
725036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
726036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
727036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
728036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, memmove) {
729036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
730036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n - 1; i++) {
731036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
732036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
733036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
734036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, 2 * state.MAX_LEN);
735036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
736036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t pos = random() % (state.MAX_LEN - state.len[i]);
737036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
738036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.len[i]);
739036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
740036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr, state.ptr1, state.len[i]);
741036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr1 + pos, state.ptr, state.len[i]);
742036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
743036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_TRUE(memmove(state.ptr2 + pos, state.ptr2, state.len[i]) == state.ptr2 + pos);
744036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr2, state.ptr1, 2 * state.MAX_LEN));
745036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
746036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
747036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
748036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
749036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bcopy) {
750036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
751036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t i = 0; i < state.n; i++) {
752036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    for (size_t j = 0; j < POS_ITER; j++) {
753036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      state.NewIteration();
754036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
755036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1, random() & 255, state.MAX_LEN);
756036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memset(state.ptr1 + state.MAX_LEN, random() & 255, state.MAX_LEN);
757036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2, state.ptr1, 2 * state.MAX_LEN);
758036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
759036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      size_t start = random() % (2 * state.MAX_LEN - state.len[i]);
760036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      memcpy(state.ptr2 + start, state.ptr1, state.len[i]);
761036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
762036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      bcopy(state.ptr1, state.ptr1 + start, state.len[i]);
763036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova      ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, 2 * state.MAX_LEN));
764036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    }
765036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
766036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
767036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
768036154b0c2d64d618aded8674f2e13cbbb2867e2Anna TikhonovaTEST(string, bzero) {
769036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  StringTestState state(LARGE);
770036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  for (size_t j = 0; j < ITER; j++) {
771036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    state.NewIteration();
772036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
773036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr1, random() & 255, state.MAX_LEN);
774036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
775036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t start = random() % state.MAX_LEN;
776036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    size_t end = start + random() % (state.MAX_LEN - start);
777036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
778036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2, state.ptr1, start);
779036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memset(state.ptr2 + start, '\0', end - start);
780036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    memcpy(state.ptr2 + end, state.ptr1 + end, state.MAX_LEN - end);
781036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
782036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    bzero(state.ptr1 + start, end - start);
783036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova
784036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova    ASSERT_EQ(0, memcmp(state.ptr1, state.ptr2, state.MAX_LEN));
785036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova  }
786036154b0c2d64d618aded8674f2e13cbbb2867e2Anna Tikhonova}
787