blob: 7a5a47d7fa3801432eef86055088e7cad19e7a29 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Fumitoshi Ukai744bb2b2015-06-25 00:10:52 +090015// +build ignore
16
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090017#include "strutil.h"
18
19#include <assert.h>
Dan Willemsencd29d6c2016-06-29 23:21:20 -070020#include <sys/mman.h>
21#include <unistd.h>
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090022
23#include <string>
24#include <vector>
25
26#include "string_piece.h"
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +090027#include "testutil.h"
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090028
29using namespace std;
30
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +090031namespace {
32
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090033void TestWordScanner() {
34 vector<StringPiece> ss;
Shinichiro Hamaji096bb4e2016-02-03 13:24:34 +090035 for (StringPiece tok : WordScanner("foo bar baz hogeeeeeeeeeeeeeeee")) {
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090036 ss.push_back(tok);
37 }
Shinichiro Hamaji096bb4e2016-02-03 13:24:34 +090038 assert(ss.size() == 4LU);
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +090039 ASSERT_EQ(ss[0], "foo");
40 ASSERT_EQ(ss[1], "bar");
41 ASSERT_EQ(ss[2], "baz");
Shinichiro Hamaji096bb4e2016-02-03 13:24:34 +090042 ASSERT_EQ(ss[3], "hogeeeeeeeeeeeeeeee");
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +090043}
44
Shinichiro Hamajif91d6822015-06-16 17:51:23 +090045void TestHasPrefix() {
46 assert(HasPrefix("foo", "foo"));
47 assert(HasPrefix("foo", "fo"));
48 assert(HasPrefix("foo", ""));
49 assert(!HasPrefix("foo", "fooo"));
50}
51
52void TestHasSuffix() {
53 assert(HasSuffix("bar", "bar"));
54 assert(HasSuffix("bar", "ar"));
55 assert(HasSuffix("bar", ""));
56 assert(!HasSuffix("bar", "bbar"));
57}
58
59string SubstPattern(StringPiece str, StringPiece pat, StringPiece subst) {
60 string r;
Shinichiro Hamajia6a17a42015-06-18 20:11:19 +090061 Pattern(pat).AppendSubst(str, subst, &r);
Shinichiro Hamajif91d6822015-06-16 17:51:23 +090062 return r;
63}
64
65void TestSubstPattern() {
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +090066 ASSERT_EQ(SubstPattern("x.c", "%.c", "%.o"), "x.o");
67 ASSERT_EQ(SubstPattern("c.x", "c.%", "o.%"), "o.x");
68 ASSERT_EQ(SubstPattern("x.c.c", "%.c", "%.o"), "x.c.o");
69 ASSERT_EQ(SubstPattern("x.x y.c", "%.c", "%.o"), "x.x y.o");
70 ASSERT_EQ(SubstPattern("x.%.c", "%.%.c", "OK"), "OK");
71 ASSERT_EQ(SubstPattern("x.c", "x.c", "OK"), "OK");
72 ASSERT_EQ(SubstPattern("x.c.c", "x.c", "XX"), "x.c.c");
73 ASSERT_EQ(SubstPattern("x.x.c", "x.c", "XX"), "x.x.c");
Shinichiro Hamajif91d6822015-06-16 17:51:23 +090074}
75
Shinichiro Hamaji2b674c42015-06-24 17:49:35 +090076void TestNoLineBreak() {
77 assert(NoLineBreak("a\nb") == "a\\nb");
78 assert(NoLineBreak("a\nb\nc") == "a\\nb\\nc");
79}
80
Shinichiro Hamajic9b0aca2015-07-31 16:47:56 +090081void TestHasWord() {
82 assert(HasWord("foo bar baz", "bar"));
83 assert(HasWord("foo bar baz", "foo"));
84 assert(HasWord("foo bar baz", "baz"));
85 assert(!HasWord("foo bar baz", "oo"));
86 assert(!HasWord("foo bar baz", "ar"));
87 assert(!HasWord("foo bar baz", "ba"));
88 assert(!HasWord("foo bar baz", "az"));
89 assert(!HasWord("foo bar baz", "ba"));
90 assert(!HasWord("foo bar baz", "fo"));
91}
92
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +090093static string NormalizePath(string s) {
94 ::NormalizePath(&s);
95 return s;
96}
97
98void TestNormalizePath() {
99 ASSERT_EQ(NormalizePath(""), "");
100 ASSERT_EQ(NormalizePath("."), "");
101 ASSERT_EQ(NormalizePath("/"), "/");
102 ASSERT_EQ(NormalizePath("/tmp"), "/tmp");
103 ASSERT_EQ(NormalizePath("////tmp////"), "/tmp");
104 ASSERT_EQ(NormalizePath("a////b"), "a/b");
105 ASSERT_EQ(NormalizePath("a//.//b"), "a/b");
106 ASSERT_EQ(NormalizePath("a////b//../c/////"), "a/c");
107 ASSERT_EQ(NormalizePath("../foo"), "../foo");
108 ASSERT_EQ(NormalizePath("./foo"), "foo");
109 ASSERT_EQ(NormalizePath("x/y/..//../foo"), "foo");
110 ASSERT_EQ(NormalizePath("x/../../foo"), "../foo");
111 ASSERT_EQ(NormalizePath("/../foo"), "/foo");
112 ASSERT_EQ(NormalizePath("/../../foo"), "/foo");
113 ASSERT_EQ(NormalizePath("/a/../../foo"), "/foo");
114 ASSERT_EQ(NormalizePath("/a/b/.."), "/a");
Shinichiro Hamaji14ea0f12015-10-13 17:04:34 +0900115 ASSERT_EQ(NormalizePath("../../a/b"), "../../a/b");
116 ASSERT_EQ(NormalizePath("../../../a/b"), "../../../a/b");
117 ASSERT_EQ(NormalizePath(".././../a/b"), "../../a/b");
118 ASSERT_EQ(NormalizePath("./../../a/b"), "../../a/b");
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +0900119}
120
Shinichiro Hamajia67fba32016-02-22 15:21:43 +0900121string EscapeShell(string s) {
122 ::EscapeShell(&s);
123 return s;
124}
125
126void TestEscapeShell() {
127 ASSERT_EQ(EscapeShell(""), "");
128 ASSERT_EQ(EscapeShell("foo"), "foo");
129 ASSERT_EQ(EscapeShell("foo$`\\baz\"bar"), "foo\\$\\`\\\\baz\\\"bar");
130 ASSERT_EQ(EscapeShell("$$"), "\\$$");
131 ASSERT_EQ(EscapeShell("$$$"), "\\$$\\$");
Shinichiro Hamaji03ce2392016-02-22 16:50:04 +0900132 ASSERT_EQ(EscapeShell("\\\n"), "\\\\\n");
Shinichiro Hamajia67fba32016-02-22 15:21:43 +0900133}
134
Shinichiro Hamaji01406292016-02-29 19:58:52 +0900135void TestFindEndOfLine() {
136 size_t lf_cnt = 0;
137 ASSERT_EQ(FindEndOfLine("foo", 0, &lf_cnt), 3);
Shinichiro Hamaji4a888022016-02-29 20:00:39 +0900138 char buf[10] = {'f', 'o', '\\', '\0', 'x', 'y'};
Shinichiro Hamaji01406292016-02-29 19:58:52 +0900139 ASSERT_EQ(FindEndOfLine(StringPiece(buf, 6), 0, &lf_cnt), 3);
Shinichiro Hamaji4a888022016-02-29 20:00:39 +0900140 ASSERT_EQ(FindEndOfLine(StringPiece(buf, 2), 0, &lf_cnt), 2);
Shinichiro Hamaji01406292016-02-29 19:58:52 +0900141}
142
Dan Willemsencd29d6c2016-06-29 23:21:20 -0700143// Take a string, and copy it into an allocated buffer where
144// the byte immediately after the null termination character
145// is read protected. Useful for testing, but doesn't support
146// freeing the allocated pages.
147const char* CreateProtectedString(const char* str) {
148 int pagesize = sysconf(_SC_PAGE_SIZE);
149 void *buffer;
150 char *buffer_str;
151
152 // Allocate two pages of memory
153 if (posix_memalign(&buffer, pagesize, pagesize * 2) != 0) {
154 perror("posix_memalign failed");
155 assert(false);
156 }
157
158 // Make the second page unreadable
159 buffer_str = (char*)buffer + pagesize;
160 if (mprotect(buffer_str, pagesize, PROT_NONE) != 0) {
161 perror("mprotect failed");
162 assert(false);
163 }
164
165 // Then move the test string into the very end of the first page
166 buffer_str -= strlen(str) + 1;
167 strcpy(buffer_str, str);
168
169 return buffer_str;
170}
171
172void TestWordScannerInvalidAccess() {
173 vector<StringPiece> ss;
174 for (StringPiece tok : WordScanner(CreateProtectedString("0123 456789"))) {
175 ss.push_back(tok);
176 }
177 assert(ss.size() == 2LU);
178 ASSERT_EQ(ss[0], "0123");
Shinichiro Hamaji8ca0f762016-06-30 17:24:02 +0900179 ASSERT_EQ(ss[1], "456789");
Dan Willemsencd29d6c2016-06-29 23:21:20 -0700180}
181
182void TestFindEndOfLineInvalidAccess() {
183 size_t lf_cnt = 0;
184 ASSERT_EQ(FindEndOfLine(CreateProtectedString("a\\"), 0, &lf_cnt), 2);
185}
186
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +0900187} // namespace
188
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +0900189int main() {
190 TestWordScanner();
Shinichiro Hamajif91d6822015-06-16 17:51:23 +0900191 TestHasPrefix();
192 TestHasSuffix();
193 TestSubstPattern();
Shinichiro Hamaji2b674c42015-06-24 17:49:35 +0900194 TestNoLineBreak();
Shinichiro Hamajic9b0aca2015-07-31 16:47:56 +0900195 TestHasWord();
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +0900196 TestNormalizePath();
Shinichiro Hamajia67fba32016-02-22 15:21:43 +0900197 TestEscapeShell();
Shinichiro Hamaji01406292016-02-29 19:58:52 +0900198 TestFindEndOfLine();
Dan Willemsencd29d6c2016-06-29 23:21:20 -0700199 TestWordScannerInvalidAccess();
200 TestFindEndOfLineInvalidAccess();
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +0900201 assert(!g_failed);
Shinichiro Hamaji63e68fc2015-06-16 17:36:53 +0900202}