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