blob: f0d63a9d329edc667dc3ac7a945900d1dfb270ad [file] [log] [blame]
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "dbus/values_util.h"
6
avi0ad0ce02015-12-23 03:12:45 +09007#include <stddef.h>
8#include <stdint.h>
9
Hans Wennborgacb4c7e2015-04-25 06:38:04 +090010#include <cmath>
dcheng30c5a172016-04-09 07:55:04 +090011#include <memory>
dcheng7219b062016-06-11 12:41:48 +090012#include <utility>
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090013#include <vector>
14
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090015#include "base/json/json_writer.h"
avi0ad0ce02015-12-23 03:12:45 +090016#include "base/macros.h"
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090017#include "base/values.h"
18#include "dbus/message.h"
19#include "testing/gtest/include/gtest/gtest.h"
20
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090021namespace dbus {
22
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090023TEST(ValuesUtilTest, PopBasicTypes) {
dcheng30c5a172016-04-09 07:55:04 +090024 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090025 // Append basic type values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090026 MessageWriter writer(response.get());
avi0ad0ce02015-12-23 03:12:45 +090027 const uint8_t kByteValue = 42;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090028 writer.AppendByte(kByteValue);
29 const bool kBoolValue = true;
30 writer.AppendBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +090031 const int16_t kInt16Value = -43;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090032 writer.AppendInt16(kInt16Value);
avi0ad0ce02015-12-23 03:12:45 +090033 const uint16_t kUint16Value = 44;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090034 writer.AppendUint16(kUint16Value);
avi0ad0ce02015-12-23 03:12:45 +090035 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090036 writer.AppendInt32(kInt32Value);
avi0ad0ce02015-12-23 03:12:45 +090037 const uint32_t kUint32Value = 46;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090038 writer.AppendUint32(kUint32Value);
avi0ad0ce02015-12-23 03:12:45 +090039 const int64_t kInt64Value = -47;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090040 writer.AppendInt64(kInt64Value);
avi0ad0ce02015-12-23 03:12:45 +090041 const uint64_t kUint64Value = 48;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090042 writer.AppendUint64(kUint64Value);
43 const double kDoubleValue = 4.9;
44 writer.AppendDouble(kDoubleValue);
45 const std::string kStringValue = "fifty";
46 writer.AppendString(kStringValue);
47 const std::string kEmptyStringValue;
48 writer.AppendString(kEmptyStringValue);
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090049 const ObjectPath kObjectPathValue("/ObjectPath");
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090050 writer.AppendObjectPath(kObjectPathValue);
51
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090052 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +090053 std::unique_ptr<base::Value> value;
54 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090055 // Pop a byte.
dcheng6ad83f32016-05-30 15:33:58 +090056 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090057 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090058 expected_value.reset(new base::Value(kByteValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090059 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090060 // Pop a bool.
dcheng6ad83f32016-05-30 15:33:58 +090061 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090062 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090063 expected_value.reset(new base::Value(kBoolValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090064 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090065 // Pop an int16_t.
dcheng6ad83f32016-05-30 15:33:58 +090066 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090067 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090068 expected_value.reset(new base::Value(kInt16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090069 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090070 // Pop a uint16_t.
dcheng6ad83f32016-05-30 15:33:58 +090071 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090072 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090073 expected_value.reset(new base::Value(kUint16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090074 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090075 // Pop an int32_t.
dcheng6ad83f32016-05-30 15:33:58 +090076 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090077 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090078 expected_value.reset(new base::Value(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090079 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090080 // Pop a uint32_t.
dcheng6ad83f32016-05-30 15:33:58 +090081 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090082 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090083 expected_value.reset(new base::Value(static_cast<double>(kUint32Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090084 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090085 // Pop an int64_t.
dcheng6ad83f32016-05-30 15:33:58 +090086 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090087 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090088 expected_value.reset(new base::Value(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090089 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090090 // Pop a uint64_t.
dcheng6ad83f32016-05-30 15:33:58 +090091 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090092 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090093 expected_value.reset(new base::Value(static_cast<double>(kUint64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090094 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090095 // Pop a double.
dcheng6ad83f32016-05-30 15:33:58 +090096 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090097 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +090098 expected_value.reset(new base::Value(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090099 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900100 // Pop a string.
dcheng6ad83f32016-05-30 15:33:58 +0900101 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900102 ASSERT_TRUE(value.get() != NULL);
jdoerrie0d1295b2017-03-06 20:12:04 +0900103 expected_value.reset(new base::Value(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900104 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900105 // Pop an empty string.
dcheng6ad83f32016-05-30 15:33:58 +0900106 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900107 ASSERT_TRUE(value.get() != NULL);
jdoerrie0d1295b2017-03-06 20:12:04 +0900108 expected_value.reset(new base::Value(kEmptyStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900109 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900110 // Pop an object path.
dcheng6ad83f32016-05-30 15:33:58 +0900111 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900112 ASSERT_TRUE(value.get() != NULL);
jdoerrie0d1295b2017-03-06 20:12:04 +0900113 expected_value.reset(new base::Value(kObjectPathValue.value()));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900114 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900115}
116
117TEST(ValuesUtilTest, PopVariant) {
dcheng30c5a172016-04-09 07:55:04 +0900118 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900119 // Append variant values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900120 MessageWriter writer(response.get());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900121 const bool kBoolValue = true;
122 writer.AppendVariantOfBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +0900123 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900124 writer.AppendVariantOfInt32(kInt32Value);
125 const double kDoubleValue = 4.9;
126 writer.AppendVariantOfDouble(kDoubleValue);
127 const std::string kStringValue = "fifty";
128 writer.AppendVariantOfString(kStringValue);
129
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900130 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900131 std::unique_ptr<base::Value> value;
132 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900133 // Pop a bool.
dcheng6ad83f32016-05-30 15:33:58 +0900134 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900135 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +0900136 expected_value.reset(new base::Value(kBoolValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900137 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +0900138 // Pop an int32_t.
dcheng6ad83f32016-05-30 15:33:58 +0900139 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900140 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +0900141 expected_value.reset(new base::Value(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900142 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900143 // Pop a double.
dcheng6ad83f32016-05-30 15:33:58 +0900144 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900145 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +0900146 expected_value.reset(new base::Value(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900147 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900148 // Pop a string.
dcheng6ad83f32016-05-30 15:33:58 +0900149 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900150 ASSERT_TRUE(value.get() != NULL);
jdoerrie0d1295b2017-03-06 20:12:04 +0900151 expected_value.reset(new base::Value(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900152 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900153}
154
155// Pop extremely large integers which cannot be precisely represented in
156// double.
157TEST(ValuesUtilTest, PopExtremelyLargeIntegers) {
dcheng30c5a172016-04-09 07:55:04 +0900158 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900159 // Append large integers.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900160 MessageWriter writer(response.get());
avi0ad0ce02015-12-23 03:12:45 +0900161 const int64_t kInt64Value = -123456789012345689LL;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900162 writer.AppendInt64(kInt64Value);
avi0ad0ce02015-12-23 03:12:45 +0900163 const uint64_t kUint64Value = 9876543210987654321ULL;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900164 writer.AppendUint64(kUint64Value);
165
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900166 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900167 std::unique_ptr<base::Value> value;
168 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900169 double double_value = 0;
avi0ad0ce02015-12-23 03:12:45 +0900170 // Pop an int64_t.
dcheng6ad83f32016-05-30 15:33:58 +0900171 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900172 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +0900173 expected_value.reset(new base::Value(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900174 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900175 ASSERT_TRUE(value->GetAsDouble(&double_value));
avi0ad0ce02015-12-23 03:12:45 +0900176 EXPECT_NE(kInt64Value, static_cast<int64_t>(double_value));
177 // Pop a uint64_t.
dcheng6ad83f32016-05-30 15:33:58 +0900178 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900179 ASSERT_TRUE(value.get() != NULL);
jdoerriebfe825e2017-03-02 21:09:19 +0900180 expected_value.reset(new base::Value(static_cast<double>(kUint64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900181 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900182 ASSERT_TRUE(value->GetAsDouble(&double_value));
avi0ad0ce02015-12-23 03:12:45 +0900183 EXPECT_NE(kUint64Value, static_cast<uint64_t>(double_value));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900184}
185
186TEST(ValuesUtilTest, PopIntArray) {
dcheng30c5a172016-04-09 07:55:04 +0900187 std::unique_ptr<Response> response(Response::CreateEmpty());
avi0ad0ce02015-12-23 03:12:45 +0900188 // Append an int32_t array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900189 MessageWriter writer(response.get());
190 MessageWriter sub_writer(NULL);
avi0ad0ce02015-12-23 03:12:45 +0900191 std::vector<int32_t> data;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900192 data.push_back(0);
193 data.push_back(1);
194 data.push_back(2);
195 writer.OpenArray("i", &sub_writer);
196 for (size_t i = 0; i != data.size(); ++i)
197 sub_writer.AppendInt32(data[i]);
198 writer.CloseContainer(&sub_writer);
199
200 // Create the expected value.
dcheng30c5a172016-04-09 07:55:04 +0900201 std::unique_ptr<base::ListValue> list_value(new base::ListValue);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900202 for (size_t i = 0; i != data.size(); ++i)
dchengef1ad822016-06-07 14:05:14 +0900203 list_value->AppendInteger(data[i]);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900204
avi0ad0ce02015-12-23 03:12:45 +0900205 // Pop an int32_t array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900206 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900207 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900208 ASSERT_TRUE(value.get() != NULL);
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900209 EXPECT_TRUE(value->Equals(list_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900210}
211
212TEST(ValuesUtilTest, PopStringArray) {
dcheng30c5a172016-04-09 07:55:04 +0900213 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900214 // Append a string array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900215 MessageWriter writer(response.get());
216 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900217 std::vector<std::string> data;
218 data.push_back("Dreamlifter");
219 data.push_back("Beluga");
220 data.push_back("Mriya");
221 writer.AppendArrayOfStrings(data);
222
223 // Create the expected value.
dcheng30c5a172016-04-09 07:55:04 +0900224 std::unique_ptr<base::ListValue> list_value(new base::ListValue);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900225 for (size_t i = 0; i != data.size(); ++i)
dchengef1ad822016-06-07 14:05:14 +0900226 list_value->AppendString(data[i]);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900227
228 // Pop a string array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900229 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900230 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900231 ASSERT_TRUE(value.get() != NULL);
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900232 EXPECT_TRUE(value->Equals(list_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900233}
234
235TEST(ValuesUtilTest, PopStruct) {
dcheng30c5a172016-04-09 07:55:04 +0900236 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900237 // Append a struct.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900238 MessageWriter writer(response.get());
239 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900240 writer.OpenStruct(&sub_writer);
241 const bool kBoolValue = true;
242 sub_writer.AppendBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +0900243 const int32_t kInt32Value = -123;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900244 sub_writer.AppendInt32(kInt32Value);
245 const double kDoubleValue = 1.23;
246 sub_writer.AppendDouble(kDoubleValue);
247 const std::string kStringValue = "one two three";
248 sub_writer.AppendString(kStringValue);
249 writer.CloseContainer(&sub_writer);
250
251 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900252 base::ListValue list_value;
dchengef1ad822016-06-07 14:05:14 +0900253 list_value.AppendBoolean(kBoolValue);
254 list_value.AppendInteger(kInt32Value);
255 list_value.AppendDouble(kDoubleValue);
256 list_value.AppendString(kStringValue);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900257
258 // Pop a struct.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900259 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900260 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900261 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900262 EXPECT_TRUE(value->Equals(&list_value));
263}
264
265TEST(ValuesUtilTest, PopStringToVariantDictionary) {
dcheng30c5a172016-04-09 07:55:04 +0900266 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900267 // Append a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900268 MessageWriter writer(response.get());
269 MessageWriter sub_writer(NULL);
270 MessageWriter entry_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900271 writer.OpenArray("{sv}", &sub_writer);
272 sub_writer.OpenDictEntry(&entry_writer);
273 const std::string kKey1 = "one";
274 entry_writer.AppendString(kKey1);
275 const bool kBoolValue = true;
276 entry_writer.AppendVariantOfBool(kBoolValue);
277 sub_writer.CloseContainer(&entry_writer);
278 sub_writer.OpenDictEntry(&entry_writer);
279 const std::string kKey2 = "two";
280 entry_writer.AppendString(kKey2);
avi0ad0ce02015-12-23 03:12:45 +0900281 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900282 entry_writer.AppendVariantOfInt32(kInt32Value);
283 sub_writer.CloseContainer(&entry_writer);
284 sub_writer.OpenDictEntry(&entry_writer);
285 const std::string kKey3 = "three";
286 entry_writer.AppendString(kKey3);
287 const double kDoubleValue = 4.9;
288 entry_writer.AppendVariantOfDouble(kDoubleValue);
289 sub_writer.CloseContainer(&entry_writer);
290 sub_writer.OpenDictEntry(&entry_writer);
291 const std::string kKey4 = "four";
292 entry_writer.AppendString(kKey4);
293 const std::string kStringValue = "fifty";
294 entry_writer.AppendVariantOfString(kStringValue);
295 sub_writer.CloseContainer(&entry_writer);
296 writer.CloseContainer(&sub_writer);
297
298 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900299 base::DictionaryValue dictionary_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900300 dictionary_value.SetBoolean(kKey1, kBoolValue);
301 dictionary_value.SetInteger(kKey2, kInt32Value);
302 dictionary_value.SetDouble(kKey3, kDoubleValue);
303 dictionary_value.SetString(kKey4, kStringValue);
304
305 // Pop a dictinoary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900306 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900307 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900308 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900309 EXPECT_TRUE(value->Equals(&dictionary_value));
310}
311
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900312TEST(ValuesUtilTest, PopDictionaryWithDottedStringKey) {
dcheng30c5a172016-04-09 07:55:04 +0900313 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900314 // Append a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900315 MessageWriter writer(response.get());
316 MessageWriter sub_writer(NULL);
317 MessageWriter entry_writer(NULL);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900318 writer.OpenArray("{sv}", &sub_writer);
319 sub_writer.OpenDictEntry(&entry_writer);
320 const std::string kKey1 = "www.example.com"; // String including dots.
321 entry_writer.AppendString(kKey1);
322 const bool kBoolValue = true;
323 entry_writer.AppendVariantOfBool(kBoolValue);
324 sub_writer.CloseContainer(&entry_writer);
325 sub_writer.OpenDictEntry(&entry_writer);
326 const std::string kKey2 = ".example"; // String starting with a dot.
327 entry_writer.AppendString(kKey2);
avi0ad0ce02015-12-23 03:12:45 +0900328 const int32_t kInt32Value = -45;
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900329 entry_writer.AppendVariantOfInt32(kInt32Value);
330 sub_writer.CloseContainer(&entry_writer);
331 sub_writer.OpenDictEntry(&entry_writer);
332 const std::string kKey3 = "example."; // String ending with a dot.
333 entry_writer.AppendString(kKey3);
334 const double kDoubleValue = 4.9;
335 entry_writer.AppendVariantOfDouble(kDoubleValue);
336 sub_writer.CloseContainer(&entry_writer);
337 writer.CloseContainer(&sub_writer);
338
339 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900340 base::DictionaryValue dictionary_value;
jdoerrie45c13a72017-08-03 08:25:52 +0900341 dictionary_value.SetKey(kKey1, base::Value(kBoolValue));
jdoerriec6b81782017-08-05 11:21:55 +0900342 dictionary_value.SetKey(kKey2, base::Value(kInt32Value));
jdoerrie2c0ad2e2017-08-17 03:43:23 +0900343 dictionary_value.SetKey(kKey3, base::Value(kDoubleValue));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900344
345 // Pop a dictinoary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900346 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900347 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900348 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900349 EXPECT_TRUE(value->Equals(&dictionary_value));
350}
351
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900352TEST(ValuesUtilTest, PopDoubleToIntDictionary) {
353 // Create test data.
avi0ad0ce02015-12-23 03:12:45 +0900354 const int32_t kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
355 const std::vector<int32_t> values(kValues, kValues + arraysize(kValues));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900356 std::vector<double> keys(values.size());
357 for (size_t i = 0; i != values.size(); ++i)
Hans Wennborgacb4c7e2015-04-25 06:38:04 +0900358 keys[i] = std::sqrt(values[i]);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900359
360 // Append a dictionary.
dcheng30c5a172016-04-09 07:55:04 +0900361 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900362 MessageWriter writer(response.get());
363 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900364 writer.OpenArray("{di}", &sub_writer);
365 for (size_t i = 0; i != values.size(); ++i) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900366 MessageWriter entry_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900367 sub_writer.OpenDictEntry(&entry_writer);
368 entry_writer.AppendDouble(keys[i]);
369 entry_writer.AppendInt32(values[i]);
370 sub_writer.CloseContainer(&entry_writer);
371 }
372 writer.CloseContainer(&sub_writer);
373
374 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900375 base::DictionaryValue dictionary_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900376 for (size_t i = 0; i != values.size(); ++i) {
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900377 std::string key_string;
jdoerriebfe825e2017-03-02 21:09:19 +0900378 base::JSONWriter::Write(base::Value(keys[i]), &key_string);
jdoerriec6b81782017-08-05 11:21:55 +0900379 dictionary_value.SetKey(key_string, base::Value(values[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900380 }
381
382 // Pop a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900383 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900384 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900385 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900386 EXPECT_TRUE(value->Equals(&dictionary_value));
387}
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900388
389TEST(ValuesUtilTest, AppendBasicTypes) {
jdoerriebfe825e2017-03-02 21:09:19 +0900390 const base::Value kBoolValue(false);
391 const base::Value kIntegerValue(42);
392 const base::Value kDoubleValue(4.2);
jdoerrie0d1295b2017-03-06 20:12:04 +0900393 const base::Value kStringValue("string");
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900394
dcheng30c5a172016-04-09 07:55:04 +0900395 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900396 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900397 AppendBasicTypeValueData(&writer, kBoolValue);
398 AppendBasicTypeValueData(&writer, kIntegerValue);
399 AppendBasicTypeValueData(&writer, kDoubleValue);
400 AppendBasicTypeValueData(&writer, kStringValue);
401
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900402 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900403 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900404 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900405 ASSERT_TRUE(value.get() != NULL);
406 EXPECT_TRUE(value->Equals(&kBoolValue));
dcheng6ad83f32016-05-30 15:33:58 +0900407 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900408 ASSERT_TRUE(value.get() != NULL);
409 EXPECT_TRUE(value->Equals(&kIntegerValue));
dcheng6ad83f32016-05-30 15:33:58 +0900410 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900411 ASSERT_TRUE(value.get() != NULL);
412 EXPECT_TRUE(value->Equals(&kDoubleValue));
dcheng6ad83f32016-05-30 15:33:58 +0900413 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900414 ASSERT_TRUE(value.get() != NULL);
415 EXPECT_TRUE(value->Equals(&kStringValue));
416}
417
418TEST(ValuesUtilTest, AppendBasicTypesAsVariant) {
jdoerriebfe825e2017-03-02 21:09:19 +0900419 const base::Value kBoolValue(false);
420 const base::Value kIntegerValue(42);
421 const base::Value kDoubleValue(4.2);
jdoerrie0d1295b2017-03-06 20:12:04 +0900422 const base::Value kStringValue("string");
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900423
dcheng30c5a172016-04-09 07:55:04 +0900424 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900425 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900426 AppendBasicTypeValueDataAsVariant(&writer, kBoolValue);
427 AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue);
428 AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue);
429 AppendBasicTypeValueDataAsVariant(&writer, kStringValue);
430
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900431 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900432 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900433 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900434 ASSERT_TRUE(value.get() != NULL);
435 EXPECT_TRUE(value->Equals(&kBoolValue));
dcheng6ad83f32016-05-30 15:33:58 +0900436 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900437 ASSERT_TRUE(value.get() != NULL);
438 EXPECT_TRUE(value->Equals(&kIntegerValue));
dcheng6ad83f32016-05-30 15:33:58 +0900439 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900440 ASSERT_TRUE(value.get() != NULL);
441 EXPECT_TRUE(value->Equals(&kDoubleValue));
dcheng6ad83f32016-05-30 15:33:58 +0900442 value = PopDataAsValue(&reader);
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900443 ASSERT_TRUE(value.get() != NULL);
444 EXPECT_TRUE(value->Equals(&kStringValue));
445}
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900446
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900447TEST(ValuesUtilTest, AppendValueDataBasicTypes) {
jdoerriebfe825e2017-03-02 21:09:19 +0900448 const base::Value kBoolValue(false);
449 const base::Value kIntegerValue(42);
450 const base::Value kDoubleValue(4.2);
jdoerrie0d1295b2017-03-06 20:12:04 +0900451 const base::Value kStringValue("string");
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900452
dcheng30c5a172016-04-09 07:55:04 +0900453 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900454 MessageWriter writer(response.get());
455 AppendValueData(&writer, kBoolValue);
456 AppendValueData(&writer, kIntegerValue);
457 AppendValueData(&writer, kDoubleValue);
458 AppendValueData(&writer, kStringValue);
459
460 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900461 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900462 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900463 ASSERT_TRUE(value.get() != NULL);
464 EXPECT_TRUE(value->Equals(&kBoolValue));
dcheng6ad83f32016-05-30 15:33:58 +0900465 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900466 ASSERT_TRUE(value.get() != NULL);
467 EXPECT_TRUE(value->Equals(&kIntegerValue));
dcheng6ad83f32016-05-30 15:33:58 +0900468 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900469 ASSERT_TRUE(value.get() != NULL);
470 EXPECT_TRUE(value->Equals(&kDoubleValue));
dcheng6ad83f32016-05-30 15:33:58 +0900471 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900472 ASSERT_TRUE(value.get() != NULL);
473 EXPECT_TRUE(value->Equals(&kStringValue));
474}
475
476TEST(ValuesUtilTest, AppendValueDataAsVariantBasicTypes) {
jdoerriebfe825e2017-03-02 21:09:19 +0900477 const base::Value kBoolValue(false);
478 const base::Value kIntegerValue(42);
479 const base::Value kDoubleValue(4.2);
jdoerrie0d1295b2017-03-06 20:12:04 +0900480 const base::Value kStringValue("string");
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900481
dcheng30c5a172016-04-09 07:55:04 +0900482 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900483 MessageWriter writer(response.get());
484 AppendValueDataAsVariant(&writer, kBoolValue);
485 AppendValueDataAsVariant(&writer, kIntegerValue);
486 AppendValueDataAsVariant(&writer, kDoubleValue);
487 AppendValueDataAsVariant(&writer, kStringValue);
488
489 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900490 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900491 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900492 ASSERT_TRUE(value.get() != NULL);
493 EXPECT_TRUE(value->Equals(&kBoolValue));
dcheng6ad83f32016-05-30 15:33:58 +0900494 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900495 ASSERT_TRUE(value.get() != NULL);
496 EXPECT_TRUE(value->Equals(&kIntegerValue));
dcheng6ad83f32016-05-30 15:33:58 +0900497 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900498 ASSERT_TRUE(value.get() != NULL);
499 EXPECT_TRUE(value->Equals(&kDoubleValue));
dcheng6ad83f32016-05-30 15:33:58 +0900500 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900501 ASSERT_TRUE(value.get() != NULL);
502 EXPECT_TRUE(value->Equals(&kStringValue));
503}
504
505TEST(ValuesUtilTest, AppendDictionary) {
506 // Set up the input dictionary.
507 const std::string kKey1 = "one";
508 const std::string kKey2 = "two";
509 const std::string kKey3 = "three";
510 const std::string kKey4 = "four";
511 const std::string kKey5 = "five";
512 const std::string kKey6 = "six";
513
514 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900515 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900516 const double kDoubleValue = 4.9;
517 const std::string kStringValue = "fifty";
518
Ben Chan2e749172017-10-13 06:49:57 +0900519 auto list_value = std::make_unique<base::ListValue>();
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900520 list_value->AppendBoolean(kBoolValue);
521 list_value->AppendInteger(kInt32Value);
522
Ben Chan2e749172017-10-13 06:49:57 +0900523 auto dictionary_value = std::make_unique<base::DictionaryValue>();
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900524 dictionary_value->SetBoolean(kKey1, kBoolValue);
525 dictionary_value->SetInteger(kKey2, kDoubleValue);
526
527 base::DictionaryValue test_dictionary;
528 test_dictionary.SetBoolean(kKey1, kBoolValue);
529 test_dictionary.SetInteger(kKey2, kInt32Value);
530 test_dictionary.SetDouble(kKey3, kDoubleValue);
531 test_dictionary.SetString(kKey4, kStringValue);
jdoerriebe3a2ae2017-06-09 01:16:44 +0900532 test_dictionary.Set(kKey5, std::move(list_value));
533 test_dictionary.Set(kKey6, std::move(dictionary_value));
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900534
dcheng30c5a172016-04-09 07:55:04 +0900535 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900536 MessageWriter writer(response.get());
537 AppendValueData(&writer, test_dictionary);
jdoerriebfe825e2017-03-02 21:09:19 +0900538 base::Value int_value(kInt32Value);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900539 AppendValueData(&writer, int_value);
540
541 // Read the data.
542 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900543 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900544 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900545 ASSERT_TRUE(value.get() != NULL);
546 EXPECT_TRUE(value->Equals(&test_dictionary));
dcheng6ad83f32016-05-30 15:33:58 +0900547 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900548 ASSERT_TRUE(value.get() != NULL);
549 EXPECT_TRUE(value->Equals(&int_value));
550}
551
552TEST(ValuesUtilTest, AppendDictionaryAsVariant) {
553 // Set up the input dictionary.
554 const std::string kKey1 = "one";
555 const std::string kKey2 = "two";
556 const std::string kKey3 = "three";
557 const std::string kKey4 = "four";
558 const std::string kKey5 = "five";
559 const std::string kKey6 = "six";
560
561 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900562 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900563 const double kDoubleValue = 4.9;
564 const std::string kStringValue = "fifty";
565
Ben Chan2e749172017-10-13 06:49:57 +0900566 auto list_value = std::make_unique<base::ListValue>();
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900567 list_value->AppendBoolean(kBoolValue);
568 list_value->AppendInteger(kInt32Value);
569
Ben Chan2e749172017-10-13 06:49:57 +0900570 auto dictionary_value = std::make_unique<base::DictionaryValue>();
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900571 dictionary_value->SetBoolean(kKey1, kBoolValue);
572 dictionary_value->SetInteger(kKey2, kDoubleValue);
573
574 base::DictionaryValue test_dictionary;
575 test_dictionary.SetBoolean(kKey1, kBoolValue);
576 test_dictionary.SetInteger(kKey2, kInt32Value);
577 test_dictionary.SetDouble(kKey3, kDoubleValue);
578 test_dictionary.SetString(kKey4, kStringValue);
jdoerriebe3a2ae2017-06-09 01:16:44 +0900579 test_dictionary.Set(kKey5, std::move(list_value));
580 test_dictionary.Set(kKey6, std::move(dictionary_value));
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900581
dcheng30c5a172016-04-09 07:55:04 +0900582 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900583 MessageWriter writer(response.get());
584 AppendValueDataAsVariant(&writer, test_dictionary);
jdoerriebfe825e2017-03-02 21:09:19 +0900585 base::Value int_value(kInt32Value);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900586 AppendValueData(&writer, int_value);
587
588 // Read the data.
589 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900590 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900591 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900592 ASSERT_TRUE(value.get() != NULL);
593 EXPECT_TRUE(value->Equals(&test_dictionary));
dcheng6ad83f32016-05-30 15:33:58 +0900594 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900595 ASSERT_TRUE(value.get() != NULL);
596 EXPECT_TRUE(value->Equals(&int_value));
597}
598
599TEST(ValuesUtilTest, AppendList) {
600 // Set up the input list.
601 const std::string kKey1 = "one";
602 const std::string kKey2 = "two";
603
604 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900605 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900606 const double kDoubleValue = 4.9;
607 const std::string kStringValue = "fifty";
608
dcheng7219b062016-06-11 12:41:48 +0900609 std::unique_ptr<base::ListValue> list_value(new base::ListValue());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900610 list_value->AppendBoolean(kBoolValue);
611 list_value->AppendInteger(kInt32Value);
612
dcheng7219b062016-06-11 12:41:48 +0900613 std::unique_ptr<base::DictionaryValue> dictionary_value(
614 new base::DictionaryValue());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900615 dictionary_value->SetBoolean(kKey1, kBoolValue);
616 dictionary_value->SetInteger(kKey2, kDoubleValue);
617
618 base::ListValue test_list;
619 test_list.AppendBoolean(kBoolValue);
620 test_list.AppendInteger(kInt32Value);
621 test_list.AppendDouble(kDoubleValue);
622 test_list.AppendString(kStringValue);
dcheng7219b062016-06-11 12:41:48 +0900623 test_list.Append(std::move(list_value));
624 test_list.Append(std::move(dictionary_value));
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900625
dcheng30c5a172016-04-09 07:55:04 +0900626 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900627 MessageWriter writer(response.get());
628 AppendValueData(&writer, test_list);
jdoerriebfe825e2017-03-02 21:09:19 +0900629 base::Value int_value(kInt32Value);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900630 AppendValueData(&writer, int_value);
631
632 // Read the data.
633 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900634 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900635 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900636 ASSERT_TRUE(value.get() != NULL);
637 EXPECT_TRUE(value->Equals(&test_list));
dcheng6ad83f32016-05-30 15:33:58 +0900638 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900639 ASSERT_TRUE(value.get() != NULL);
640 EXPECT_TRUE(value->Equals(&int_value));
641}
642
643TEST(ValuesUtilTest, AppendListAsVariant) {
644 // Set up the input list.
645 const std::string kKey1 = "one";
646 const std::string kKey2 = "two";
647
648 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900649 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900650 const double kDoubleValue = 4.9;
651 const std::string kStringValue = "fifty";
652
dcheng7219b062016-06-11 12:41:48 +0900653 std::unique_ptr<base::ListValue> list_value(new base::ListValue());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900654 list_value->AppendBoolean(kBoolValue);
655 list_value->AppendInteger(kInt32Value);
656
dcheng7219b062016-06-11 12:41:48 +0900657 std::unique_ptr<base::DictionaryValue> dictionary_value(
658 new base::DictionaryValue());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900659 dictionary_value->SetBoolean(kKey1, kBoolValue);
660 dictionary_value->SetInteger(kKey2, kDoubleValue);
661
662 base::ListValue test_list;
663 test_list.AppendBoolean(kBoolValue);
664 test_list.AppendInteger(kInt32Value);
665 test_list.AppendDouble(kDoubleValue);
666 test_list.AppendString(kStringValue);
dcheng7219b062016-06-11 12:41:48 +0900667 test_list.Append(std::move(list_value));
668 test_list.Append(std::move(dictionary_value));
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900669
dcheng30c5a172016-04-09 07:55:04 +0900670 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900671 MessageWriter writer(response.get());
672 AppendValueDataAsVariant(&writer, test_list);
jdoerriebfe825e2017-03-02 21:09:19 +0900673 base::Value int_value(kInt32Value);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900674 AppendValueData(&writer, int_value);
675
676 // Read the data.
677 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900678 std::unique_ptr<base::Value> value;
dcheng6ad83f32016-05-30 15:33:58 +0900679 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900680 ASSERT_TRUE(value.get() != NULL);
681 EXPECT_TRUE(value->Equals(&test_list));
dcheng6ad83f32016-05-30 15:33:58 +0900682 value = PopDataAsValue(&reader);
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900683 ASSERT_TRUE(value.get() != NULL);
684 EXPECT_TRUE(value->Equals(&int_value));
685}
686
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900687} // namespace dbus