1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <memory>
8*635a8641SAndroid Build Coastguard Worker #include <sstream>
9*635a8641SAndroid Build Coastguard Worker #include <type_traits>
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker #include "base/value_conversions.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/values.h"
13*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker namespace base {
16*635a8641SAndroid Build Coastguard Worker
TestSmallerThanOperator(const UnguessableToken & a,const UnguessableToken & b)17*635a8641SAndroid Build Coastguard Worker void TestSmallerThanOperator(const UnguessableToken& a,
18*635a8641SAndroid Build Coastguard Worker const UnguessableToken& b) {
19*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(a < b);
20*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(b < a);
21*635a8641SAndroid Build Coastguard Worker }
22*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyEqualityOperators)23*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyEqualityOperators) {
24*635a8641SAndroid Build Coastguard Worker // Deserialize is used for testing purposes.
25*635a8641SAndroid Build Coastguard Worker // Use UnguessableToken::Create() in production code instead.
26*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Deserialize(1, 2);
27*635a8641SAndroid Build Coastguard Worker UnguessableToken same_token = UnguessableToken::Deserialize(1, 2);
28*635a8641SAndroid Build Coastguard Worker UnguessableToken diff_token = UnguessableToken::Deserialize(1, 3);
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(token == token);
31*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(token != token);
32*635a8641SAndroid Build Coastguard Worker
33*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(token == same_token);
34*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(token != same_token);
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(token == diff_token);
37*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(diff_token == token);
38*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(token != diff_token);
39*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(diff_token != token);
40*635a8641SAndroid Build Coastguard Worker }
41*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyConstructors)42*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyConstructors) {
43*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Create();
44*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(token.is_empty());
45*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(token);
46*635a8641SAndroid Build Coastguard Worker
47*635a8641SAndroid Build Coastguard Worker UnguessableToken copied_token(token);
48*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(copied_token);
49*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(token, copied_token);
50*635a8641SAndroid Build Coastguard Worker
51*635a8641SAndroid Build Coastguard Worker UnguessableToken uninitialized;
52*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(uninitialized.is_empty());
53*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(uninitialized);
54*635a8641SAndroid Build Coastguard Worker
55*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(UnguessableToken().is_empty());
56*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(UnguessableToken());
57*635a8641SAndroid Build Coastguard Worker }
58*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifySerialization)59*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifySerialization) {
60*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Create();
61*635a8641SAndroid Build Coastguard Worker
62*635a8641SAndroid Build Coastguard Worker uint64_t high = token.GetHighForSerialization();
63*635a8641SAndroid Build Coastguard Worker uint64_t low = token.GetLowForSerialization();
64*635a8641SAndroid Build Coastguard Worker
65*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(high);
66*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(low);
67*635a8641SAndroid Build Coastguard Worker
68*635a8641SAndroid Build Coastguard Worker UnguessableToken Deserialized = UnguessableToken::Deserialize(high, low);
69*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(token, Deserialized);
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyValueSerialization)72*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyValueSerialization) {
73*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Create();
74*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> value = CreateUnguessableTokenValue(token);
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Worker UnguessableToken deserialized;
77*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(GetValueAsUnguessableToken(*value, &deserialized));
78*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(token, deserialized);
79*635a8641SAndroid Build Coastguard Worker }
80*635a8641SAndroid Build Coastguard Worker
81*635a8641SAndroid Build Coastguard Worker // Common case (~88% of the time) - no leading zeroes in high_ nor low_.
TEST(UnguessableTokenTest,VerifyToString1)82*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyToString1) {
83*635a8641SAndroid Build Coastguard Worker UnguessableToken token =
84*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(0x1234567890ABCDEF, 0xFEDCBA0987654321);
85*635a8641SAndroid Build Coastguard Worker std::string expected = "1234567890ABCDEFFEDCBA0987654321";
86*635a8641SAndroid Build Coastguard Worker
87*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected, token.ToString());
88*635a8641SAndroid Build Coastguard Worker
89*635a8641SAndroid Build Coastguard Worker std::string expected_stream = "(1234567890ABCDEFFEDCBA0987654321)";
90*635a8641SAndroid Build Coastguard Worker std::stringstream stream;
91*635a8641SAndroid Build Coastguard Worker stream << token;
92*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_stream, stream.str());
93*635a8641SAndroid Build Coastguard Worker }
94*635a8641SAndroid Build Coastguard Worker
95*635a8641SAndroid Build Coastguard Worker // Less common case - leading zeroes in high_ or low_ (testing with both).
TEST(UnguessableTokenTest,VerifyToString2)96*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyToString2) {
97*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Deserialize(0x123, 0xABC);
98*635a8641SAndroid Build Coastguard Worker std::string expected = "00000000000001230000000000000ABC";
99*635a8641SAndroid Build Coastguard Worker
100*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected, token.ToString());
101*635a8641SAndroid Build Coastguard Worker
102*635a8641SAndroid Build Coastguard Worker std::string expected_stream = "(00000000000001230000000000000ABC)";
103*635a8641SAndroid Build Coastguard Worker std::stringstream stream;
104*635a8641SAndroid Build Coastguard Worker stream << token;
105*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_stream, stream.str());
106*635a8641SAndroid Build Coastguard Worker }
107*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyToStringUniqueness)108*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyToStringUniqueness) {
109*635a8641SAndroid Build Coastguard Worker const UnguessableToken token1 =
110*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(0x0000000012345678, 0x0000000123456789);
111*635a8641SAndroid Build Coastguard Worker const UnguessableToken token2 =
112*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(0x0000000123456781, 0x0000000023456789);
113*635a8641SAndroid Build Coastguard Worker EXPECT_NE(token1.ToString(), token2.ToString());
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifySmallerThanOperator)116*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifySmallerThanOperator) {
117*635a8641SAndroid Build Coastguard Worker // Deserialize is used for testing purposes.
118*635a8641SAndroid Build Coastguard Worker // Use UnguessableToken::Create() in production code instead.
119*635a8641SAndroid Build Coastguard Worker {
120*635a8641SAndroid Build Coastguard Worker SCOPED_TRACE("a.low < b.low and a.high == b.high.");
121*635a8641SAndroid Build Coastguard Worker TestSmallerThanOperator(UnguessableToken::Deserialize(0, 1),
122*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(0, 5));
123*635a8641SAndroid Build Coastguard Worker }
124*635a8641SAndroid Build Coastguard Worker {
125*635a8641SAndroid Build Coastguard Worker SCOPED_TRACE("a.low == b.low and a.high < b.high.");
126*635a8641SAndroid Build Coastguard Worker TestSmallerThanOperator(UnguessableToken::Deserialize(1, 0),
127*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(5, 0));
128*635a8641SAndroid Build Coastguard Worker }
129*635a8641SAndroid Build Coastguard Worker {
130*635a8641SAndroid Build Coastguard Worker SCOPED_TRACE("a.low < b.low and a.high < b.high.");
131*635a8641SAndroid Build Coastguard Worker TestSmallerThanOperator(UnguessableToken::Deserialize(1, 1),
132*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(5, 5));
133*635a8641SAndroid Build Coastguard Worker }
134*635a8641SAndroid Build Coastguard Worker {
135*635a8641SAndroid Build Coastguard Worker SCOPED_TRACE("a.low > b.low and a.high < b.high.");
136*635a8641SAndroid Build Coastguard Worker TestSmallerThanOperator(UnguessableToken::Deserialize(1, 10),
137*635a8641SAndroid Build Coastguard Worker UnguessableToken::Deserialize(10, 1));
138*635a8641SAndroid Build Coastguard Worker }
139*635a8641SAndroid Build Coastguard Worker }
140*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyHash)141*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyHash) {
142*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Create();
143*635a8641SAndroid Build Coastguard Worker
144*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(base::HashInts64(token.GetHighForSerialization(),
145*635a8641SAndroid Build Coastguard Worker token.GetLowForSerialization()),
146*635a8641SAndroid Build Coastguard Worker UnguessableTokenHash()(token));
147*635a8641SAndroid Build Coastguard Worker }
148*635a8641SAndroid Build Coastguard Worker
TEST(UnguessableTokenTest,VerifyBasicUniqueness)149*635a8641SAndroid Build Coastguard Worker TEST(UnguessableTokenTest, VerifyBasicUniqueness) {
150*635a8641SAndroid Build Coastguard Worker EXPECT_NE(UnguessableToken::Create(), UnguessableToken::Create());
151*635a8641SAndroid Build Coastguard Worker
152*635a8641SAndroid Build Coastguard Worker UnguessableToken token = UnguessableToken::Create();
153*635a8641SAndroid Build Coastguard Worker EXPECT_NE(token.GetHighForSerialization(), token.GetLowForSerialization());
154*635a8641SAndroid Build Coastguard Worker }
155*635a8641SAndroid Build Coastguard Worker }
156