/Users/deen/code/yugabyte-db/src/yb/util/uuid-test.cc
Line | Count | Source |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | // |
13 | | |
14 | | #include "yb/util/uuid.h" |
15 | | |
16 | | #include "yb/util/result.h" |
17 | | #include "yb/util/test_macros.h" |
18 | | #include "yb/util/test_util.h" |
19 | | |
20 | | namespace yb { |
21 | | |
22 | | class UuidTest : public YBTest { |
23 | | protected: |
24 | 7 | void RunRoundTrip(const std::string& strval) { |
25 | | // Test regular byte conversion. |
26 | 7 | Uuid uuid_orig = ASSERT_RESULT(Uuid::FromString(strval)); |
27 | 7 | std::string bytes; |
28 | 7 | uuid_orig.ToBytes(&bytes); |
29 | 7 | Uuid uuid_new; |
30 | 7 | ASSERT_OK(uuid_new.FromBytes(bytes)); |
31 | | |
32 | | // Test encode and decode. |
33 | 7 | std::string encoded_bytes; |
34 | 7 | uuid_orig.EncodeToComparable(&encoded_bytes); |
35 | 7 | Uuid decoded_uuid_new; |
36 | 7 | ASSERT_OK(decoded_uuid_new.DecodeFromComparable(encoded_bytes)); |
37 | | |
38 | | // Test string conversion. |
39 | 7 | std::string strval_new; |
40 | 7 | ASSERT_OK(uuid_new.ToString(&strval_new)); |
41 | 7 | std::string decoded_strval_new; |
42 | 7 | ASSERT_OK(decoded_uuid_new.ToString(&decoded_strval_new)); |
43 | 7 | ASSERT_EQ(strval, strval_new); |
44 | 7 | ASSERT_EQ(strval, decoded_strval_new); |
45 | | |
46 | | // Check the final values. |
47 | 7 | ASSERT_EQ(uuid_orig, uuid_new); |
48 | 7 | ASSERT_EQ(uuid_orig, decoded_uuid_new); |
49 | 7 | LOG(INFO) << "Finished Roundtrip Test for " << strval; |
50 | 7 | } |
51 | | }; |
52 | | |
53 | 1 | TEST_F(UuidTest, TestRoundTrip) { |
54 | | // Test all types of UUID. |
55 | 1 | for (const std::string& strval : { |
56 | 1 | "123e4567-e89b-02d3-a456-426655440000", |
57 | 1 | "123e4567-e89b-12d3-a456-426655440000", |
58 | 1 | "123e4567-e89b-22d3-a456-426655440000", |
59 | 1 | "123e4567-e89b-32d3-a456-426655440000", |
60 | 1 | "123e4567-e89b-42d3-a456-426655440000", |
61 | 1 | "11111111-1111-1111-1111-111111111111", |
62 | 7 | "00000000-0000-0000-0000-000000000000"}) { |
63 | 7 | RunRoundTrip(strval); |
64 | 7 | } |
65 | 1 | } |
66 | | |
67 | 1 | TEST_F(UuidTest, TestOperators) { |
68 | | // Assignment. |
69 | 1 | Uuid uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
70 | 1 | Uuid uuid2 = uuid1; |
71 | 1 | std::string strval; |
72 | 1 | ASSERT_OK(uuid2.ToString(&strval)); |
73 | 1 | ASSERT_EQ("11111111-1111-1111-1111-111111111111", strval); |
74 | | |
75 | | // InEquality. |
76 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
77 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111112")); |
78 | 1 | ASSERT_NE(uuid1, uuid2); |
79 | | |
80 | | // Comparison. |
81 | | // Same type lexical comparison. |
82 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-4111-1111-111111111111")); |
83 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("21111111-1111-4111-1111-111111111111")); |
84 | 1 | ASSERT_LT(uuid1, uuid2); |
85 | 1 | ASSERT_LE(uuid1, uuid2); |
86 | | |
87 | | // Different type comparison. |
88 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
89 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1111-2111-1111-111111111111")); |
90 | 1 | LOG(INFO) << (uuid1 < uuid2); |
91 | 1 | ASSERT_LT(uuid1, uuid2); |
92 | 1 | ASSERT_GT(uuid2, uuid1); |
93 | | |
94 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
95 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1111-1211-1111-111111111111")); |
96 | 1 | LOG(INFO) << (uuid1 < uuid2); |
97 | 1 | ASSERT_LT(uuid1, uuid2); |
98 | 1 | ASSERT_GT(uuid2, uuid1); |
99 | | |
100 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
101 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1111-1121-1111-111111111111")); |
102 | 1 | LOG(INFO) << (uuid1 < uuid2); |
103 | 1 | ASSERT_LT(uuid1, uuid2); |
104 | 1 | ASSERT_GT(uuid2, uuid1); |
105 | | |
106 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
107 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1111-1112-1111-111111111111")); |
108 | 1 | LOG(INFO) << (uuid1 < uuid2); |
109 | 1 | ASSERT_LT(uuid1, uuid2); |
110 | 1 | ASSERT_GT(uuid2, uuid1); |
111 | | |
112 | | // Same type other time comparison. |
113 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
114 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-2111-1111-1111-111111111111")); |
115 | 1 | LOG(INFO) << (uuid1 < uuid2); |
116 | 1 | ASSERT_LT(uuid1, uuid2); |
117 | 1 | ASSERT_GT(uuid2, uuid1); |
118 | | |
119 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
120 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1211-1111-1111-111111111111")); |
121 | 1 | LOG(INFO) << (uuid1 < uuid2); |
122 | 1 | ASSERT_LT(uuid1, uuid2); |
123 | 1 | ASSERT_GT(uuid2, uuid1); |
124 | | |
125 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
126 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1121-1111-1111-111111111111")); |
127 | 1 | LOG(INFO) << (uuid1 < uuid2); |
128 | 1 | ASSERT_LT(uuid1, uuid2); |
129 | 1 | ASSERT_GT(uuid2, uuid1); |
130 | | |
131 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
132 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("01111111-1112-1111-1111-111111111111")); |
133 | 1 | LOG(INFO) << (uuid1 < uuid2); |
134 | 1 | ASSERT_LT(uuid1, uuid2); |
135 | 1 | ASSERT_GT(uuid2, uuid1); |
136 | | |
137 | | // Equality comparison |
138 | 1 | uuid1 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
139 | 1 | uuid2 = ASSERT_RESULT(Uuid::FromString("11111111-1111-1111-1111-111111111111")); |
140 | 1 | ASSERT_LE(uuid1, uuid2); |
141 | 1 | ASSERT_GE(uuid1, uuid2); |
142 | 1 | } |
143 | | |
144 | 1 | TEST_F(UuidTest, TestErrors) { |
145 | 1 | ASSERT_FALSE(Uuid::FromString("11111111-1111-1111-1111-11111111111").ok()); |
146 | | // Test non-hex UUID. |
147 | 1 | ASSERT_FALSE(Uuid::FromString("11111111-1111-1111-1111-11111111111X").ok()); |
148 | 1 | ASSERT_FALSE(Uuid::FromString("00000-00-0-0-0-0-0").ok()); |
149 | 1 | auto empty_uuid = Uuid::FromString(""); |
150 | 1 | ASSERT_TRUE(empty_uuid.ok()); |
151 | 1 | ASSERT_EQ(*empty_uuid, Uuid::Nil()); |
152 | | |
153 | 1 | Uuid uuid; |
154 | 1 | std::string bytes; |
155 | 1 | ASSERT_FALSE(uuid.FromBytes(bytes).ok()); |
156 | 1 | bytes = "0"; |
157 | 1 | ASSERT_FALSE(uuid.FromBytes(bytes).ok()); |
158 | 1 | bytes = "012345"; |
159 | 1 | ASSERT_FALSE(uuid.FromBytes(bytes).ok()); |
160 | 1 | bytes = "111111111111111111"; // 17 bytes. |
161 | 1 | ASSERT_FALSE(uuid.FromBytes(bytes).ok()); |
162 | | |
163 | | // Test hex string |
164 | 1 | ASSERT_FALSE(uuid.FromHexString("123").ok()); |
165 | 1 | ASSERT_FALSE(uuid.FromHexString("zz111111111111111111111111111111").ok()); |
166 | 1 | } |
167 | | |
168 | 4 | Result<Uuid> HexRoundTrip(const std::string& input) { |
169 | 4 | Uuid uuid; |
170 | 4 | RETURN_NOT_OK(uuid.FromHexString(input)); |
171 | 4 | EXPECT_EQ(input, uuid.ToHexString()); |
172 | 4 | return uuid; |
173 | 4 | } |
174 | | |
175 | 1 | TEST_F(UuidTest, TestHexString) { |
176 | 1 | ASSERT_OK(HexRoundTrip("ffffffffffffffffffffffffffffffff")); |
177 | 1 | ASSERT_OK(HexRoundTrip("00000000000000000000000000000000")); |
178 | 1 | auto uuid = ASSERT_RESULT(HexRoundTrip("11000000000000000000000000000000")); |
179 | 1 | EXPECT_EQ("00000000-0000-0000-0000-000000000011", uuid.ToString()); |
180 | 1 | uuid = ASSERT_RESULT(HexRoundTrip("00004455664256a4d3029be867453e12")); |
181 | 1 | EXPECT_EQ("123e4567-e89b-02d3-a456-426655440000", uuid.ToString()); |
182 | 1 | } |
183 | | |
184 | | } // namespace yb |