1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/json/values_util.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <limits>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker
TEST(ValuesUtilTest,BasicInt64Limits)19*6777b538SAndroid Build Coastguard Worker TEST(ValuesUtilTest, BasicInt64Limits) {
20*6777b538SAndroid Build Coastguard Worker constexpr struct {
21*6777b538SAndroid Build Coastguard Worker int64_t input;
22*6777b538SAndroid Build Coastguard Worker std::string_view expected;
23*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
24*6777b538SAndroid Build Coastguard Worker {0, "0"},
25*6777b538SAndroid Build Coastguard Worker {-1234, "-1234"},
26*6777b538SAndroid Build Coastguard Worker {5678, "5678"},
27*6777b538SAndroid Build Coastguard Worker {std::numeric_limits<int64_t>::lowest(), "-9223372036854775808"},
28*6777b538SAndroid Build Coastguard Worker {std::numeric_limits<int64_t>::max(), "9223372036854775807"},
29*6777b538SAndroid Build Coastguard Worker };
30*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
31*6777b538SAndroid Build Coastguard Worker int64_t input = test_case.input;
32*6777b538SAndroid Build Coastguard Worker TimeDelta time_delta_input = Microseconds(input);
33*6777b538SAndroid Build Coastguard Worker Time time_input = Time::FromDeltaSinceWindowsEpoch(time_delta_input);
34*6777b538SAndroid Build Coastguard Worker Value expected(test_case.expected);
35*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message()
36*6777b538SAndroid Build Coastguard Worker << "input: " << input << ", expected: " << expected);
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Int64ToValue(input), expected);
39*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*ValueToInt64(&expected), input);
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(TimeDeltaToValue(time_delta_input), expected);
42*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*ValueToTimeDelta(&expected), time_delta_input);
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(TimeToValue(time_input), expected);
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*ValueToTime(&expected), time_input);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker
TEST(ValuesUtilTest,InvalidInt64Values)49*6777b538SAndroid Build Coastguard Worker TEST(ValuesUtilTest, InvalidInt64Values) {
50*6777b538SAndroid Build Coastguard Worker const std::unique_ptr<Value> kTestCases[] = {
51*6777b538SAndroid Build Coastguard Worker nullptr,
52*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(),
53*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(0),
54*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(1234),
55*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(true),
56*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(Value::Type::BINARY),
57*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(Value::Type::LIST),
58*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(Value::Type::DICT),
59*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>(""),
60*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>("abcd"),
61*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>("1234.0"),
62*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>("1234a"),
63*6777b538SAndroid Build Coastguard Worker std::make_unique<Value>("a1234"),
64*6777b538SAndroid Build Coastguard Worker };
65*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
66*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ValueToInt64(test_case.get()));
67*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ValueToTimeDelta(test_case.get()));
68*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ValueToTime(test_case.get()));
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
TEST(ValuesUtilTest,FilePath)72*6777b538SAndroid Build Coastguard Worker TEST(ValuesUtilTest, FilePath) {
73*6777b538SAndroid Build Coastguard Worker // Ω is U+03A9 GREEK CAPITAL LETTER OMEGA, a non-ASCII character.
74*6777b538SAndroid Build Coastguard Worker constexpr std::string_view kTestCases[] = {
75*6777b538SAndroid Build Coastguard Worker "/unix/Ω/path.dat",
76*6777b538SAndroid Build Coastguard Worker "C:\\windows\\Ω\\path.dat",
77*6777b538SAndroid Build Coastguard Worker };
78*6777b538SAndroid Build Coastguard Worker for (auto test_case : kTestCases) {
79*6777b538SAndroid Build Coastguard Worker FilePath input = FilePath::FromUTF8Unsafe(test_case);
80*6777b538SAndroid Build Coastguard Worker Value expected(test_case);
81*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "test_case: " << test_case);
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FilePathToValue(input), expected);
84*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*ValueToFilePath(&expected), input);
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
TEST(ValuesUtilTest,UnguessableToken)88*6777b538SAndroid Build Coastguard Worker TEST(ValuesUtilTest, UnguessableToken) {
89*6777b538SAndroid Build Coastguard Worker constexpr struct {
90*6777b538SAndroid Build Coastguard Worker uint64_t high;
91*6777b538SAndroid Build Coastguard Worker uint64_t low;
92*6777b538SAndroid Build Coastguard Worker std::string_view expected;
93*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
94*6777b538SAndroid Build Coastguard Worker {0x123456u, 0x9ABCu, "5634120000000000BC9A000000000000"},
95*6777b538SAndroid Build Coastguard Worker };
96*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
97*6777b538SAndroid Build Coastguard Worker UnguessableToken input =
98*6777b538SAndroid Build Coastguard Worker UnguessableToken::CreateForTesting(test_case.high, test_case.low);
99*6777b538SAndroid Build Coastguard Worker Value expected(test_case.expected);
100*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "expected: " << test_case.expected);
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(UnguessableTokenToValue(input), expected);
103*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*ValueToUnguessableToken(&expected), input);
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker } // namespace
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker } // namespace base
110