1 /*
2 *
3 * Copyright 2017 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19 #include <grpc/slice.h>
20
21 #include "src/core/lib/gprpp/string_view.h"
22
23 #include <gtest/gtest.h>
24 #include "src/core/lib/gprpp/memory.h"
25 #include "test/core/util/test_config.h"
26
27 namespace grpc_core {
28 namespace testing {
29
TEST(StringViewTest,Empty)30 TEST(StringViewTest, Empty) {
31 grpc_core::StringView empty;
32 EXPECT_TRUE(empty.empty());
33 EXPECT_EQ(empty.size(), 0lu);
34
35 grpc_core::StringView empty_buf("");
36 EXPECT_TRUE(empty_buf.empty());
37 EXPECT_EQ(empty_buf.size(), 0lu);
38
39 grpc_core::StringView empty_trimmed("foo", 0);
40 EXPECT_TRUE(empty_trimmed.empty());
41 EXPECT_EQ(empty_trimmed.size(), 0lu);
42
43 grpc_core::StringView empty_slice(grpc_empty_slice());
44 EXPECT_TRUE(empty_slice.empty());
45 EXPECT_EQ(empty_slice.size(), 0lu);
46 }
47
TEST(StringViewTest,Size)48 TEST(StringViewTest, Size) {
49 constexpr char kStr[] = "foo";
50 grpc_core::StringView str1(kStr);
51 EXPECT_EQ(str1.size(), strlen(kStr));
52 grpc_core::StringView str2(kStr, 2);
53 EXPECT_EQ(str2.size(), 2lu);
54 }
55
TEST(StringViewTest,Data)56 TEST(StringViewTest, Data) {
57 constexpr char kStr[] = "foo-bar";
58 grpc_core::StringView str(kStr);
59 EXPECT_EQ(str.size(), strlen(kStr));
60 for (size_t i = 0; i < strlen(kStr); ++i) {
61 EXPECT_EQ(str[i], kStr[i]);
62 }
63 }
64
TEST(StringViewTest,Slice)65 TEST(StringViewTest, Slice) {
66 constexpr char kStr[] = "foo";
67 grpc_core::StringView slice(grpc_slice_from_static_string(kStr));
68 EXPECT_EQ(slice.size(), strlen(kStr));
69 }
70
TEST(StringViewTest,Dup)71 TEST(StringViewTest, Dup) {
72 constexpr char kStr[] = "foo";
73 grpc_core::StringView slice(grpc_slice_from_static_string(kStr));
74 grpc_core::UniquePtr<char> dup = slice.dup();
75 EXPECT_EQ(0, strcmp(kStr, dup.get()));
76 EXPECT_EQ(slice.size(), strlen(kStr));
77 }
78
TEST(StringViewTest,Eq)79 TEST(StringViewTest, Eq) {
80 constexpr char kStr1[] = "foo";
81 constexpr char kStr2[] = "bar";
82 grpc_core::StringView str1(kStr1);
83 EXPECT_EQ(kStr1, str1);
84 EXPECT_EQ(str1, kStr1);
85 grpc_core::StringView slice1(grpc_slice_from_static_string(kStr1));
86 EXPECT_EQ(slice1, str1);
87 EXPECT_EQ(str1, slice1);
88 EXPECT_NE(slice1, kStr2);
89 EXPECT_NE(kStr2, slice1);
90 grpc_core::StringView slice2(grpc_slice_from_static_string(kStr2));
91 EXPECT_NE(slice2, str1);
92 EXPECT_NE(str1, slice2);
93 }
94
TEST(StringViewTest,Cmp)95 TEST(StringViewTest, Cmp) {
96 constexpr char kStr1[] = "abc";
97 constexpr char kStr2[] = "abd";
98 constexpr char kStr3[] = "abcd";
99 grpc_core::StringView str1(kStr1);
100 grpc_core::StringView str2(kStr2);
101 grpc_core::StringView str3(kStr3);
102 EXPECT_EQ(str1.cmp(str1), 0);
103 EXPECT_LT(str1.cmp(str2), 0);
104 EXPECT_LT(str1.cmp(str3), 0);
105 EXPECT_EQ(str2.cmp(str2), 0);
106 EXPECT_GT(str2.cmp(str1), 0);
107 EXPECT_GT(str2.cmp(str3), 0);
108 EXPECT_EQ(str3.cmp(str3), 0);
109 EXPECT_GT(str3.cmp(str1), 0);
110 EXPECT_LT(str3.cmp(str2), 0);
111 }
112
TEST(StringViewTest,RemovePrefix)113 TEST(StringViewTest, RemovePrefix) {
114 constexpr char kStr[] = "abcd";
115 grpc_core::StringView str(kStr);
116 str.remove_prefix(1);
117 EXPECT_EQ("bcd", str);
118 str.remove_prefix(2);
119 EXPECT_EQ("d", str);
120 str.remove_prefix(1);
121 EXPECT_EQ("", str);
122 }
123
TEST(StringViewTest,RemoveSuffix)124 TEST(StringViewTest, RemoveSuffix) {
125 constexpr char kStr[] = "abcd";
126 grpc_core::StringView str(kStr);
127 str.remove_suffix(1);
128 EXPECT_EQ("abc", str);
129 str.remove_suffix(2);
130 EXPECT_EQ("a", str);
131 str.remove_suffix(1);
132 EXPECT_EQ("", str);
133 }
134
TEST(StringViewTest,Substring)135 TEST(StringViewTest, Substring) {
136 constexpr char kStr[] = "abcd";
137 grpc_core::StringView str(kStr);
138 EXPECT_EQ("bcd", str.substr(1));
139 EXPECT_EQ("bc", str.substr(1, 2));
140 }
141
TEST(StringViewTest,Find)142 TEST(StringViewTest, Find) {
143 // Passing StringView::npos directly to GTEST macros result in link errors.
144 // Store the value in a local variable and use it in the test.
145 const size_t npos = grpc_core::StringView::npos;
146 constexpr char kStr[] = "abacad";
147 grpc_core::StringView str(kStr);
148 EXPECT_EQ(0ul, str.find('a'));
149 EXPECT_EQ(2ul, str.find('a', 1));
150 EXPECT_EQ(4ul, str.find('a', 3));
151 EXPECT_EQ(1ul, str.find('b'));
152 EXPECT_EQ(npos, str.find('b', 2));
153 EXPECT_EQ(npos, str.find('z'));
154 }
155
156 } // namespace testing
157 } // namespace grpc_core
158
main(int argc,char ** argv)159 int main(int argc, char** argv) {
160 grpc::testing::TestEnvironment env(argc, argv);
161 ::testing::InitGoogleTest(&argc, argv);
162 return RUN_ALL_TESTS();
163 }
164