blob: 6903d51d20dbb73ed9e4a96915a92bf85bd5f447 [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>
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090012#include <vector>
13
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090014#include "base/json/json_writer.h"
avi0ad0ce02015-12-23 03:12:45 +090015#include "base/macros.h"
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090016#include "base/values.h"
17#include "dbus/message.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090020namespace dbus {
21
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090022TEST(ValuesUtilTest, PopBasicTypes) {
dcheng30c5a172016-04-09 07:55:04 +090023 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090024 // Append basic type values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090025 MessageWriter writer(response.get());
avi0ad0ce02015-12-23 03:12:45 +090026 const uint8_t kByteValue = 42;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090027 writer.AppendByte(kByteValue);
28 const bool kBoolValue = true;
29 writer.AppendBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +090030 const int16_t kInt16Value = -43;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090031 writer.AppendInt16(kInt16Value);
avi0ad0ce02015-12-23 03:12:45 +090032 const uint16_t kUint16Value = 44;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090033 writer.AppendUint16(kUint16Value);
avi0ad0ce02015-12-23 03:12:45 +090034 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090035 writer.AppendInt32(kInt32Value);
avi0ad0ce02015-12-23 03:12:45 +090036 const uint32_t kUint32Value = 46;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090037 writer.AppendUint32(kUint32Value);
avi0ad0ce02015-12-23 03:12:45 +090038 const int64_t kInt64Value = -47;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090039 writer.AppendInt64(kInt64Value);
avi0ad0ce02015-12-23 03:12:45 +090040 const uint64_t kUint64Value = 48;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090041 writer.AppendUint64(kUint64Value);
42 const double kDoubleValue = 4.9;
43 writer.AppendDouble(kDoubleValue);
44 const std::string kStringValue = "fifty";
45 writer.AppendString(kStringValue);
46 const std::string kEmptyStringValue;
47 writer.AppendString(kEmptyStringValue);
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090048 const ObjectPath kObjectPathValue("/ObjectPath");
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090049 writer.AppendObjectPath(kObjectPathValue);
50
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090051 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +090052 std::unique_ptr<base::Value> value;
53 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090054 // Pop a byte.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090055 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090056 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090057 expected_value.reset(new base::FundamentalValue(kByteValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090058 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090059 // Pop a bool.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090060 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090061 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090062 expected_value.reset(new base::FundamentalValue(kBoolValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090063 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090064 // Pop an int16_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090065 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090066 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090067 expected_value.reset(new base::FundamentalValue(kInt16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090068 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090069 // Pop a uint16_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090070 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090071 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090072 expected_value.reset(new base::FundamentalValue(kUint16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090073 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090074 // Pop an int32_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090075 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090076 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090077 expected_value.reset(new base::FundamentalValue(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090078 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090079 // Pop a uint32_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090080 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090081 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090082 expected_value.reset(
83 new base::FundamentalValue(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.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090086 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090087 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090088 expected_value.reset(
89 new base::FundamentalValue(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090090 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +090091 // Pop a uint64_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090092 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090093 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090094 expected_value.reset(
95 new base::FundamentalValue(static_cast<double>(kUint64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090096 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090097 // Pop a double.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090098 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090099 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900100 expected_value.reset(new base::FundamentalValue(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900101 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900102 // Pop a string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900103 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900104 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900105 expected_value.reset(new base::StringValue(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900106 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900107 // Pop an empty string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900108 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900109 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900110 expected_value.reset(new base::StringValue(kEmptyStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900111 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900112 // Pop an object path.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900113 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900114 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900115 expected_value.reset(new base::StringValue(kObjectPathValue.value()));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900116 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900117}
118
119TEST(ValuesUtilTest, PopVariant) {
dcheng30c5a172016-04-09 07:55:04 +0900120 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900121 // Append variant values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900122 MessageWriter writer(response.get());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900123 const bool kBoolValue = true;
124 writer.AppendVariantOfBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +0900125 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900126 writer.AppendVariantOfInt32(kInt32Value);
127 const double kDoubleValue = 4.9;
128 writer.AppendVariantOfDouble(kDoubleValue);
129 const std::string kStringValue = "fifty";
130 writer.AppendVariantOfString(kStringValue);
131
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900132 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900133 std::unique_ptr<base::Value> value;
134 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900135 // Pop a bool.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900136 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900137 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900138 expected_value.reset(new base::FundamentalValue(kBoolValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900139 EXPECT_TRUE(value->Equals(expected_value.get()));
avi0ad0ce02015-12-23 03:12:45 +0900140 // Pop an int32_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900141 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900142 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900143 expected_value.reset(new base::FundamentalValue(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900144 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900145 // Pop a double.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900146 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900147 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900148 expected_value.reset(new base::FundamentalValue(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900149 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900150 // Pop a string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900151 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900152 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900153 expected_value.reset(new base::StringValue(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900154 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900155}
156
157// Pop extremely large integers which cannot be precisely represented in
158// double.
159TEST(ValuesUtilTest, PopExtremelyLargeIntegers) {
dcheng30c5a172016-04-09 07:55:04 +0900160 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900161 // Append large integers.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900162 MessageWriter writer(response.get());
avi0ad0ce02015-12-23 03:12:45 +0900163 const int64_t kInt64Value = -123456789012345689LL;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900164 writer.AppendInt64(kInt64Value);
avi0ad0ce02015-12-23 03:12:45 +0900165 const uint64_t kUint64Value = 9876543210987654321ULL;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900166 writer.AppendUint64(kUint64Value);
167
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900168 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900169 std::unique_ptr<base::Value> value;
170 std::unique_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900171 double double_value = 0;
avi0ad0ce02015-12-23 03:12:45 +0900172 // Pop an int64_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900173 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900174 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900175 expected_value.reset(
176 new base::FundamentalValue(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900177 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900178 ASSERT_TRUE(value->GetAsDouble(&double_value));
avi0ad0ce02015-12-23 03:12:45 +0900179 EXPECT_NE(kInt64Value, static_cast<int64_t>(double_value));
180 // Pop a uint64_t.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900181 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900182 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900183 expected_value.reset(
184 new base::FundamentalValue(static_cast<double>(kUint64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900185 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900186 ASSERT_TRUE(value->GetAsDouble(&double_value));
avi0ad0ce02015-12-23 03:12:45 +0900187 EXPECT_NE(kUint64Value, static_cast<uint64_t>(double_value));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900188}
189
190TEST(ValuesUtilTest, PopIntArray) {
dcheng30c5a172016-04-09 07:55:04 +0900191 std::unique_ptr<Response> response(Response::CreateEmpty());
avi0ad0ce02015-12-23 03:12:45 +0900192 // Append an int32_t array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900193 MessageWriter writer(response.get());
194 MessageWriter sub_writer(NULL);
avi0ad0ce02015-12-23 03:12:45 +0900195 std::vector<int32_t> data;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900196 data.push_back(0);
197 data.push_back(1);
198 data.push_back(2);
199 writer.OpenArray("i", &sub_writer);
200 for (size_t i = 0; i != data.size(); ++i)
201 sub_writer.AppendInt32(data[i]);
202 writer.CloseContainer(&sub_writer);
203
204 // Create the expected value.
dcheng30c5a172016-04-09 07:55:04 +0900205 std::unique_ptr<base::ListValue> list_value(new base::ListValue);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900206 for (size_t i = 0; i != data.size(); ++i)
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900207 list_value->Append(new base::FundamentalValue(data[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900208
avi0ad0ce02015-12-23 03:12:45 +0900209 // Pop an int32_t array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900210 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900211 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900212 ASSERT_TRUE(value.get() != NULL);
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900213 EXPECT_TRUE(value->Equals(list_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900214}
215
216TEST(ValuesUtilTest, PopStringArray) {
dcheng30c5a172016-04-09 07:55:04 +0900217 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900218 // Append a string array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900219 MessageWriter writer(response.get());
220 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900221 std::vector<std::string> data;
222 data.push_back("Dreamlifter");
223 data.push_back("Beluga");
224 data.push_back("Mriya");
225 writer.AppendArrayOfStrings(data);
226
227 // Create the expected value.
dcheng30c5a172016-04-09 07:55:04 +0900228 std::unique_ptr<base::ListValue> list_value(new base::ListValue);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900229 for (size_t i = 0; i != data.size(); ++i)
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900230 list_value->Append(new base::StringValue(data[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900231
232 // Pop a string array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900233 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900234 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900235 ASSERT_TRUE(value.get() != NULL);
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900236 EXPECT_TRUE(value->Equals(list_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900237}
238
239TEST(ValuesUtilTest, PopStruct) {
dcheng30c5a172016-04-09 07:55:04 +0900240 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900241 // Append a struct.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900242 MessageWriter writer(response.get());
243 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900244 writer.OpenStruct(&sub_writer);
245 const bool kBoolValue = true;
246 sub_writer.AppendBool(kBoolValue);
avi0ad0ce02015-12-23 03:12:45 +0900247 const int32_t kInt32Value = -123;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900248 sub_writer.AppendInt32(kInt32Value);
249 const double kDoubleValue = 1.23;
250 sub_writer.AppendDouble(kDoubleValue);
251 const std::string kStringValue = "one two three";
252 sub_writer.AppendString(kStringValue);
253 writer.CloseContainer(&sub_writer);
254
255 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900256 base::ListValue list_value;
257 list_value.Append(new base::FundamentalValue(kBoolValue));
258 list_value.Append(new base::FundamentalValue(kInt32Value));
259 list_value.Append(new base::FundamentalValue(kDoubleValue));
260 list_value.Append(new base::StringValue(kStringValue));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900261
262 // Pop a struct.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900263 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900264 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900265 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900266 EXPECT_TRUE(value->Equals(&list_value));
267}
268
269TEST(ValuesUtilTest, PopStringToVariantDictionary) {
dcheng30c5a172016-04-09 07:55:04 +0900270 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900271 // Append a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900272 MessageWriter writer(response.get());
273 MessageWriter sub_writer(NULL);
274 MessageWriter entry_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900275 writer.OpenArray("{sv}", &sub_writer);
276 sub_writer.OpenDictEntry(&entry_writer);
277 const std::string kKey1 = "one";
278 entry_writer.AppendString(kKey1);
279 const bool kBoolValue = true;
280 entry_writer.AppendVariantOfBool(kBoolValue);
281 sub_writer.CloseContainer(&entry_writer);
282 sub_writer.OpenDictEntry(&entry_writer);
283 const std::string kKey2 = "two";
284 entry_writer.AppendString(kKey2);
avi0ad0ce02015-12-23 03:12:45 +0900285 const int32_t kInt32Value = -45;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900286 entry_writer.AppendVariantOfInt32(kInt32Value);
287 sub_writer.CloseContainer(&entry_writer);
288 sub_writer.OpenDictEntry(&entry_writer);
289 const std::string kKey3 = "three";
290 entry_writer.AppendString(kKey3);
291 const double kDoubleValue = 4.9;
292 entry_writer.AppendVariantOfDouble(kDoubleValue);
293 sub_writer.CloseContainer(&entry_writer);
294 sub_writer.OpenDictEntry(&entry_writer);
295 const std::string kKey4 = "four";
296 entry_writer.AppendString(kKey4);
297 const std::string kStringValue = "fifty";
298 entry_writer.AppendVariantOfString(kStringValue);
299 sub_writer.CloseContainer(&entry_writer);
300 writer.CloseContainer(&sub_writer);
301
302 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900303 base::DictionaryValue dictionary_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900304 dictionary_value.SetBoolean(kKey1, kBoolValue);
305 dictionary_value.SetInteger(kKey2, kInt32Value);
306 dictionary_value.SetDouble(kKey3, kDoubleValue);
307 dictionary_value.SetString(kKey4, kStringValue);
308
309 // Pop a dictinoary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900310 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900311 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900312 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900313 EXPECT_TRUE(value->Equals(&dictionary_value));
314}
315
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900316TEST(ValuesUtilTest, PopDictionaryWithDottedStringKey) {
dcheng30c5a172016-04-09 07:55:04 +0900317 std::unique_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900318 // Append a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900319 MessageWriter writer(response.get());
320 MessageWriter sub_writer(NULL);
321 MessageWriter entry_writer(NULL);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900322 writer.OpenArray("{sv}", &sub_writer);
323 sub_writer.OpenDictEntry(&entry_writer);
324 const std::string kKey1 = "www.example.com"; // String including dots.
325 entry_writer.AppendString(kKey1);
326 const bool kBoolValue = true;
327 entry_writer.AppendVariantOfBool(kBoolValue);
328 sub_writer.CloseContainer(&entry_writer);
329 sub_writer.OpenDictEntry(&entry_writer);
330 const std::string kKey2 = ".example"; // String starting with a dot.
331 entry_writer.AppendString(kKey2);
avi0ad0ce02015-12-23 03:12:45 +0900332 const int32_t kInt32Value = -45;
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900333 entry_writer.AppendVariantOfInt32(kInt32Value);
334 sub_writer.CloseContainer(&entry_writer);
335 sub_writer.OpenDictEntry(&entry_writer);
336 const std::string kKey3 = "example."; // String ending with a dot.
337 entry_writer.AppendString(kKey3);
338 const double kDoubleValue = 4.9;
339 entry_writer.AppendVariantOfDouble(kDoubleValue);
340 sub_writer.CloseContainer(&entry_writer);
341 writer.CloseContainer(&sub_writer);
342
343 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900344 base::DictionaryValue dictionary_value;
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900345 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900346 kKey1, new base::FundamentalValue(kBoolValue));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900347 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900348 kKey2, new base::FundamentalValue(kInt32Value));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900349 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900350 kKey3, new base::FundamentalValue(kDoubleValue));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900351
352 // Pop a dictinoary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900353 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900354 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900355 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900356 EXPECT_TRUE(value->Equals(&dictionary_value));
357}
358
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900359TEST(ValuesUtilTest, PopDoubleToIntDictionary) {
360 // Create test data.
avi0ad0ce02015-12-23 03:12:45 +0900361 const int32_t kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
362 const std::vector<int32_t> values(kValues, kValues + arraysize(kValues));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900363 std::vector<double> keys(values.size());
364 for (size_t i = 0; i != values.size(); ++i)
Hans Wennborgacb4c7e2015-04-25 06:38:04 +0900365 keys[i] = std::sqrt(values[i]);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900366
367 // Append a dictionary.
dcheng30c5a172016-04-09 07:55:04 +0900368 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900369 MessageWriter writer(response.get());
370 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900371 writer.OpenArray("{di}", &sub_writer);
372 for (size_t i = 0; i != values.size(); ++i) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900373 MessageWriter entry_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900374 sub_writer.OpenDictEntry(&entry_writer);
375 entry_writer.AppendDouble(keys[i]);
376 entry_writer.AppendInt32(values[i]);
377 sub_writer.CloseContainer(&entry_writer);
378 }
379 writer.CloseContainer(&sub_writer);
380
381 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900382 base::DictionaryValue dictionary_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900383 for (size_t i = 0; i != values.size(); ++i) {
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900384 std::string key_string;
estadeb5f30dd2015-05-16 10:02:34 +0900385 base::JSONWriter::Write(base::FundamentalValue(keys[i]), &key_string);
386 dictionary_value.SetIntegerWithoutPathExpansion(key_string, values[i]);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900387 }
388
389 // Pop a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900390 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900391 std::unique_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900392 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900393 EXPECT_TRUE(value->Equals(&dictionary_value));
394}
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900395
396TEST(ValuesUtilTest, AppendBasicTypes) {
397 const base::FundamentalValue kBoolValue(false);
398 const base::FundamentalValue kIntegerValue(42);
399 const base::FundamentalValue kDoubleValue(4.2);
400 const base::StringValue kStringValue("string");
401
dcheng30c5a172016-04-09 07:55:04 +0900402 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900403 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900404 AppendBasicTypeValueData(&writer, kBoolValue);
405 AppendBasicTypeValueData(&writer, kIntegerValue);
406 AppendBasicTypeValueData(&writer, kDoubleValue);
407 AppendBasicTypeValueData(&writer, kStringValue);
408
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900409 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900410 std::unique_ptr<base::Value> value;
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900411 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900412 ASSERT_TRUE(value.get() != NULL);
413 EXPECT_TRUE(value->Equals(&kBoolValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900414 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900415 ASSERT_TRUE(value.get() != NULL);
416 EXPECT_TRUE(value->Equals(&kIntegerValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900417 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900418 ASSERT_TRUE(value.get() != NULL);
419 EXPECT_TRUE(value->Equals(&kDoubleValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900420 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900421 ASSERT_TRUE(value.get() != NULL);
422 EXPECT_TRUE(value->Equals(&kStringValue));
423}
424
425TEST(ValuesUtilTest, AppendBasicTypesAsVariant) {
426 const base::FundamentalValue kBoolValue(false);
427 const base::FundamentalValue kIntegerValue(42);
428 const base::FundamentalValue kDoubleValue(4.2);
429 const base::StringValue kStringValue("string");
430
dcheng30c5a172016-04-09 07:55:04 +0900431 std::unique_ptr<Response> response(Response::CreateEmpty());
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900432 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900433 AppendBasicTypeValueDataAsVariant(&writer, kBoolValue);
434 AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue);
435 AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue);
436 AppendBasicTypeValueDataAsVariant(&writer, kStringValue);
437
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900438 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900439 std::unique_ptr<base::Value> value;
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900440 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900441 ASSERT_TRUE(value.get() != NULL);
442 EXPECT_TRUE(value->Equals(&kBoolValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900443 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900444 ASSERT_TRUE(value.get() != NULL);
445 EXPECT_TRUE(value->Equals(&kIntegerValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900446 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900447 ASSERT_TRUE(value.get() != NULL);
448 EXPECT_TRUE(value->Equals(&kDoubleValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900449 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900450 ASSERT_TRUE(value.get() != NULL);
451 EXPECT_TRUE(value->Equals(&kStringValue));
452}
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900453
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900454TEST(ValuesUtilTest, AppendValueDataBasicTypes) {
455 const base::FundamentalValue kBoolValue(false);
456 const base::FundamentalValue kIntegerValue(42);
457 const base::FundamentalValue kDoubleValue(4.2);
458 const base::StringValue kStringValue("string");
459
dcheng30c5a172016-04-09 07:55:04 +0900460 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900461 MessageWriter writer(response.get());
462 AppendValueData(&writer, kBoolValue);
463 AppendValueData(&writer, kIntegerValue);
464 AppendValueData(&writer, kDoubleValue);
465 AppendValueData(&writer, kStringValue);
466
467 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900468 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900469 value.reset(PopDataAsValue(&reader));
470 ASSERT_TRUE(value.get() != NULL);
471 EXPECT_TRUE(value->Equals(&kBoolValue));
472 value.reset(PopDataAsValue(&reader));
473 ASSERT_TRUE(value.get() != NULL);
474 EXPECT_TRUE(value->Equals(&kIntegerValue));
475 value.reset(PopDataAsValue(&reader));
476 ASSERT_TRUE(value.get() != NULL);
477 EXPECT_TRUE(value->Equals(&kDoubleValue));
478 value.reset(PopDataAsValue(&reader));
479 ASSERT_TRUE(value.get() != NULL);
480 EXPECT_TRUE(value->Equals(&kStringValue));
481}
482
483TEST(ValuesUtilTest, AppendValueDataAsVariantBasicTypes) {
484 const base::FundamentalValue kBoolValue(false);
485 const base::FundamentalValue kIntegerValue(42);
486 const base::FundamentalValue kDoubleValue(4.2);
487 const base::StringValue kStringValue("string");
488
dcheng30c5a172016-04-09 07:55:04 +0900489 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900490 MessageWriter writer(response.get());
491 AppendValueDataAsVariant(&writer, kBoolValue);
492 AppendValueDataAsVariant(&writer, kIntegerValue);
493 AppendValueDataAsVariant(&writer, kDoubleValue);
494 AppendValueDataAsVariant(&writer, kStringValue);
495
496 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900497 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900498 value.reset(PopDataAsValue(&reader));
499 ASSERT_TRUE(value.get() != NULL);
500 EXPECT_TRUE(value->Equals(&kBoolValue));
501 value.reset(PopDataAsValue(&reader));
502 ASSERT_TRUE(value.get() != NULL);
503 EXPECT_TRUE(value->Equals(&kIntegerValue));
504 value.reset(PopDataAsValue(&reader));
505 ASSERT_TRUE(value.get() != NULL);
506 EXPECT_TRUE(value->Equals(&kDoubleValue));
507 value.reset(PopDataAsValue(&reader));
508 ASSERT_TRUE(value.get() != NULL);
509 EXPECT_TRUE(value->Equals(&kStringValue));
510}
511
512TEST(ValuesUtilTest, AppendDictionary) {
513 // Set up the input dictionary.
514 const std::string kKey1 = "one";
515 const std::string kKey2 = "two";
516 const std::string kKey3 = "three";
517 const std::string kKey4 = "four";
518 const std::string kKey5 = "five";
519 const std::string kKey6 = "six";
520
521 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900522 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900523 const double kDoubleValue = 4.9;
524 const std::string kStringValue = "fifty";
525
526 base::ListValue* list_value = new base::ListValue();
527 list_value->AppendBoolean(kBoolValue);
528 list_value->AppendInteger(kInt32Value);
529
530 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
531 dictionary_value->SetBoolean(kKey1, kBoolValue);
532 dictionary_value->SetInteger(kKey2, kDoubleValue);
533
534 base::DictionaryValue test_dictionary;
535 test_dictionary.SetBoolean(kKey1, kBoolValue);
536 test_dictionary.SetInteger(kKey2, kInt32Value);
537 test_dictionary.SetDouble(kKey3, kDoubleValue);
538 test_dictionary.SetString(kKey4, kStringValue);
539 test_dictionary.Set(kKey5, list_value); // takes ownership
540 test_dictionary.Set(kKey6, dictionary_value); // takes ownership
541
dcheng30c5a172016-04-09 07:55:04 +0900542 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900543 MessageWriter writer(response.get());
544 AppendValueData(&writer, test_dictionary);
545 base::FundamentalValue int_value(kInt32Value);
546 AppendValueData(&writer, int_value);
547
548 // Read the data.
549 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900550 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900551 value.reset(PopDataAsValue(&reader));
552 ASSERT_TRUE(value.get() != NULL);
553 EXPECT_TRUE(value->Equals(&test_dictionary));
554 value.reset(PopDataAsValue(&reader));
555 ASSERT_TRUE(value.get() != NULL);
556 EXPECT_TRUE(value->Equals(&int_value));
557}
558
559TEST(ValuesUtilTest, AppendDictionaryAsVariant) {
560 // Set up the input dictionary.
561 const std::string kKey1 = "one";
562 const std::string kKey2 = "two";
563 const std::string kKey3 = "three";
564 const std::string kKey4 = "four";
565 const std::string kKey5 = "five";
566 const std::string kKey6 = "six";
567
568 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900569 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900570 const double kDoubleValue = 4.9;
571 const std::string kStringValue = "fifty";
572
573 base::ListValue* list_value = new base::ListValue();
574 list_value->AppendBoolean(kBoolValue);
575 list_value->AppendInteger(kInt32Value);
576
577 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
578 dictionary_value->SetBoolean(kKey1, kBoolValue);
579 dictionary_value->SetInteger(kKey2, kDoubleValue);
580
581 base::DictionaryValue test_dictionary;
582 test_dictionary.SetBoolean(kKey1, kBoolValue);
583 test_dictionary.SetInteger(kKey2, kInt32Value);
584 test_dictionary.SetDouble(kKey3, kDoubleValue);
585 test_dictionary.SetString(kKey4, kStringValue);
586 test_dictionary.Set(kKey5, list_value); // takes ownership
587 test_dictionary.Set(kKey6, dictionary_value); // takes ownership
588
dcheng30c5a172016-04-09 07:55:04 +0900589 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900590 MessageWriter writer(response.get());
591 AppendValueDataAsVariant(&writer, test_dictionary);
592 base::FundamentalValue int_value(kInt32Value);
593 AppendValueData(&writer, int_value);
594
595 // Read the data.
596 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900597 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900598 value.reset(PopDataAsValue(&reader));
599 ASSERT_TRUE(value.get() != NULL);
600 EXPECT_TRUE(value->Equals(&test_dictionary));
601 value.reset(PopDataAsValue(&reader));
602 ASSERT_TRUE(value.get() != NULL);
603 EXPECT_TRUE(value->Equals(&int_value));
604}
605
606TEST(ValuesUtilTest, AppendList) {
607 // Set up the input list.
608 const std::string kKey1 = "one";
609 const std::string kKey2 = "two";
610
611 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900612 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900613 const double kDoubleValue = 4.9;
614 const std::string kStringValue = "fifty";
615
616 base::ListValue* list_value = new base::ListValue();
617 list_value->AppendBoolean(kBoolValue);
618 list_value->AppendInteger(kInt32Value);
619
620 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
621 dictionary_value->SetBoolean(kKey1, kBoolValue);
622 dictionary_value->SetInteger(kKey2, kDoubleValue);
623
624 base::ListValue test_list;
625 test_list.AppendBoolean(kBoolValue);
626 test_list.AppendInteger(kInt32Value);
627 test_list.AppendDouble(kDoubleValue);
628 test_list.AppendString(kStringValue);
629 test_list.Append(list_value); // takes ownership
630 test_list.Append(dictionary_value); // takes ownership
631
dcheng30c5a172016-04-09 07:55:04 +0900632 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900633 MessageWriter writer(response.get());
634 AppendValueData(&writer, test_list);
635 base::FundamentalValue int_value(kInt32Value);
636 AppendValueData(&writer, int_value);
637
638 // Read the data.
639 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900640 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900641 value.reset(PopDataAsValue(&reader));
642 ASSERT_TRUE(value.get() != NULL);
643 EXPECT_TRUE(value->Equals(&test_list));
644 value.reset(PopDataAsValue(&reader));
645 ASSERT_TRUE(value.get() != NULL);
646 EXPECT_TRUE(value->Equals(&int_value));
647}
648
649TEST(ValuesUtilTest, AppendListAsVariant) {
650 // Set up the input list.
651 const std::string kKey1 = "one";
652 const std::string kKey2 = "two";
653
654 const bool kBoolValue = true;
avi0ad0ce02015-12-23 03:12:45 +0900655 const int32_t kInt32Value = -45;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900656 const double kDoubleValue = 4.9;
657 const std::string kStringValue = "fifty";
658
659 base::ListValue* list_value = new base::ListValue();
660 list_value->AppendBoolean(kBoolValue);
661 list_value->AppendInteger(kInt32Value);
662
663 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
664 dictionary_value->SetBoolean(kKey1, kBoolValue);
665 dictionary_value->SetInteger(kKey2, kDoubleValue);
666
667 base::ListValue test_list;
668 test_list.AppendBoolean(kBoolValue);
669 test_list.AppendInteger(kInt32Value);
670 test_list.AppendDouble(kDoubleValue);
671 test_list.AppendString(kStringValue);
672 test_list.Append(list_value); // takes ownership
673 test_list.Append(dictionary_value); // takes ownership
674
dcheng30c5a172016-04-09 07:55:04 +0900675 std::unique_ptr<Response> response(Response::CreateEmpty());
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900676 MessageWriter writer(response.get());
677 AppendValueDataAsVariant(&writer, test_list);
678 base::FundamentalValue int_value(kInt32Value);
679 AppendValueData(&writer, int_value);
680
681 // Read the data.
682 MessageReader reader(response.get());
dcheng30c5a172016-04-09 07:55:04 +0900683 std::unique_ptr<base::Value> value;
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900684 value.reset(PopDataAsValue(&reader));
685 ASSERT_TRUE(value.get() != NULL);
686 EXPECT_TRUE(value->Equals(&test_list));
687 value.reset(PopDataAsValue(&reader));
688 ASSERT_TRUE(value.get() != NULL);
689 EXPECT_TRUE(value->Equals(&int_value));
690}
691
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900692} // namespace dbus