blob: 336d771400e4dacb251d2fa78f8fcd5095ffc9e7 [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
7#include <vector>
8
9#include "base/float_util.h"
10#include "base/json/json_writer.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/values.h"
13#include "dbus/message.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090016namespace dbus {
17
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090018TEST(ValuesUtilTest, PopBasicTypes) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090019 scoped_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090020 // Append basic type values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090021 MessageWriter writer(response.get());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090022 const uint8 kByteValue = 42;
23 writer.AppendByte(kByteValue);
24 const bool kBoolValue = true;
25 writer.AppendBool(kBoolValue);
26 const int16 kInt16Value = -43;
27 writer.AppendInt16(kInt16Value);
28 const uint16 kUint16Value = 44;
29 writer.AppendUint16(kUint16Value);
30 const int32 kInt32Value = -45;
31 writer.AppendInt32(kInt32Value);
32 const uint32 kUint32Value = 46;
33 writer.AppendUint32(kUint32Value);
34 const int64 kInt64Value = -47;
35 writer.AppendInt64(kInt64Value);
36 const uint64 kUint64Value = 48;
37 writer.AppendUint64(kUint64Value);
38 const double kDoubleValue = 4.9;
39 writer.AppendDouble(kDoubleValue);
40 const std::string kStringValue = "fifty";
41 writer.AppendString(kStringValue);
42 const std::string kEmptyStringValue;
43 writer.AppendString(kEmptyStringValue);
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090044 const ObjectPath kObjectPathValue("/ObjectPath");
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090045 writer.AppendObjectPath(kObjectPathValue);
46
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090047 MessageReader reader(response.get());
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090048 scoped_ptr<base::Value> value;
49 scoped_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090050 // Pop a byte.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090051 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090052 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090053 expected_value.reset(new base::FundamentalValue(kByteValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090054 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090055 // Pop a bool.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090056 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090057 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090058 expected_value.reset(new base::FundamentalValue(kBoolValue));
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 an int16.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090061 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090062 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090063 expected_value.reset(new base::FundamentalValue(kInt16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090064 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090065 // Pop a uint16.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090066 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090067 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090068 expected_value.reset(new base::FundamentalValue(kUint16Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090069 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090070 // Pop an int32.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090071 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090072 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090073 expected_value.reset(new base::FundamentalValue(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090074 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090075 // Pop a uint32.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090076 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090077 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090078 expected_value.reset(
79 new base::FundamentalValue(static_cast<double>(kUint32Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090080 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090081 // Pop an int64.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090082 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090083 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090084 expected_value.reset(
85 new base::FundamentalValue(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090086 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090087 // Pop a uint64.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090088 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090089 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090090 expected_value.reset(
91 new base::FundamentalValue(static_cast<double>(kUint64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090092 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090093 // Pop a double.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090094 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +090095 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +090096 expected_value.reset(new base::FundamentalValue(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +090097 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +090098 // Pop a string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +090099 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900100 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900101 expected_value.reset(new base::StringValue(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900102 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900103 // Pop an empty string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900104 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900105 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900106 expected_value.reset(new base::StringValue(kEmptyStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900107 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900108 // Pop an object path.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900109 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900110 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900111 expected_value.reset(new base::StringValue(kObjectPathValue.value()));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900112 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900113}
114
115TEST(ValuesUtilTest, PopVariant) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900116 scoped_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900117 // Append variant values.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900118 MessageWriter writer(response.get());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900119 const bool kBoolValue = true;
120 writer.AppendVariantOfBool(kBoolValue);
121 const int32 kInt32Value = -45;
122 writer.AppendVariantOfInt32(kInt32Value);
123 const double kDoubleValue = 4.9;
124 writer.AppendVariantOfDouble(kDoubleValue);
125 const std::string kStringValue = "fifty";
126 writer.AppendVariantOfString(kStringValue);
127
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900128 MessageReader reader(response.get());
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900129 scoped_ptr<base::Value> value;
130 scoped_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900131 // Pop a bool.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900132 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900133 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900134 expected_value.reset(new base::FundamentalValue(kBoolValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900135 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900136 // Pop an int32.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900137 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900138 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900139 expected_value.reset(new base::FundamentalValue(kInt32Value));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900140 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900141 // Pop a double.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900142 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900143 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900144 expected_value.reset(new base::FundamentalValue(kDoubleValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900145 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900146 // Pop a string.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900147 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900148 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900149 expected_value.reset(new base::StringValue(kStringValue));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900150 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900151}
152
153// Pop extremely large integers which cannot be precisely represented in
154// double.
155TEST(ValuesUtilTest, PopExtremelyLargeIntegers) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900156 scoped_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900157 // Append large integers.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900158 MessageWriter writer(response.get());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900159 const int64 kInt64Value = -123456789012345689LL;
160 writer.AppendInt64(kInt64Value);
161 const uint64 kUint64Value = 9876543210987654321ULL;
162 writer.AppendUint64(kUint64Value);
163
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900164 MessageReader reader(response.get());
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900165 scoped_ptr<base::Value> value;
166 scoped_ptr<base::Value> expected_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900167 double double_value = 0;
168 // Pop an int64.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900169 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900170 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900171 expected_value.reset(
172 new base::FundamentalValue(static_cast<double>(kInt64Value)));
satorux@chromium.org5e612da2012-05-31 15:55:53 +0900173 EXPECT_TRUE(value->Equals(expected_value.get()));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900174 ASSERT_TRUE(value->GetAsDouble(&double_value));
175 EXPECT_NE(kInt64Value, static_cast<int64>(double_value));
176 // Pop a uint64.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900177 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900178 ASSERT_TRUE(value.get() != NULL);
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900179 expected_value.reset(
180 new base::FundamentalValue(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));
183 EXPECT_NE(kUint64Value, static_cast<uint64>(double_value));
184}
185
186TEST(ValuesUtilTest, PopIntArray) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900187 scoped_ptr<Response> response(Response::CreateEmpty());
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900188 // Append an int32 array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900189 MessageWriter writer(response.get());
190 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900191 std::vector<int32> data;
192 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.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900201 scoped_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)
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900203 list_value->Append(new base::FundamentalValue(data[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900204
205 // Pop an int32 array.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900206 MessageReader reader(response.get());
207 scoped_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) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900213 scoped_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.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900224 scoped_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)
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900226 list_value->Append(new base::StringValue(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());
230 scoped_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) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900236 scoped_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);
243 const int32 kInt32Value = -123;
244 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;
253 list_value.Append(new base::FundamentalValue(kBoolValue));
254 list_value.Append(new base::FundamentalValue(kInt32Value));
255 list_value.Append(new base::FundamentalValue(kDoubleValue));
256 list_value.Append(new base::StringValue(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());
260 scoped_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) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900266 scoped_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);
281 const int32 kInt32Value = -45;
282 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());
307 scoped_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) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900313 scoped_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);
328 const int32 kInt32Value = -45;
329 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;
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900341 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900342 kKey1, new base::FundamentalValue(kBoolValue));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900343 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900344 kKey2, new base::FundamentalValue(kInt32Value));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900345 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900346 kKey3, new base::FundamentalValue(kDoubleValue));
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900347
348 // Pop a dictinoary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900349 MessageReader reader(response.get());
350 scoped_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900351 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900352 EXPECT_TRUE(value->Equals(&dictionary_value));
353}
354
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900355TEST(ValuesUtilTest, PopDoubleToIntDictionary) {
356 // Create test data.
357 const int32 kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
358 const std::vector<int32> values(kValues, kValues + arraysize(kValues));
359 std::vector<double> keys(values.size());
360 for (size_t i = 0; i != values.size(); ++i)
361 keys[i] = sqrt(values[i]);
362
363 // Append a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900364 scoped_ptr<Response> response(Response::CreateEmpty());
365 MessageWriter writer(response.get());
366 MessageWriter sub_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900367 writer.OpenArray("{di}", &sub_writer);
368 for (size_t i = 0; i != values.size(); ++i) {
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900369 MessageWriter entry_writer(NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900370 sub_writer.OpenDictEntry(&entry_writer);
371 entry_writer.AppendDouble(keys[i]);
372 entry_writer.AppendInt32(values[i]);
373 sub_writer.CloseContainer(&entry_writer);
374 }
375 writer.CloseContainer(&sub_writer);
376
377 // Create the expected value.
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900378 base::DictionaryValue dictionary_value;
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900379 for (size_t i = 0; i != values.size(); ++i) {
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900380 scoped_ptr<base::Value> key_value(new base::FundamentalValue(keys[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900381 std::string key_string;
382 base::JSONWriter::Write(key_value.get(), &key_string);
hashimoto@chromium.org9a576b02012-03-21 03:18:57 +0900383 dictionary_value.SetWithoutPathExpansion(
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900384 key_string, new base::FundamentalValue(values[i]));
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900385 }
386
387 // Pop a dictionary.
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900388 MessageReader reader(response.get());
389 scoped_ptr<base::Value> value(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900390 ASSERT_TRUE(value.get() != NULL);
hashimoto@chromium.org8fb5a2b2012-03-17 08:08:42 +0900391 EXPECT_TRUE(value->Equals(&dictionary_value));
392}
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900393
394TEST(ValuesUtilTest, AppendBasicTypes) {
395 const base::FundamentalValue kBoolValue(false);
396 const base::FundamentalValue kIntegerValue(42);
397 const base::FundamentalValue kDoubleValue(4.2);
398 const base::StringValue kStringValue("string");
399
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900400 scoped_ptr<Response> response(Response::CreateEmpty());
401 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900402 AppendBasicTypeValueData(&writer, kBoolValue);
403 AppendBasicTypeValueData(&writer, kIntegerValue);
404 AppendBasicTypeValueData(&writer, kDoubleValue);
405 AppendBasicTypeValueData(&writer, kStringValue);
406
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900407 MessageReader reader(response.get());
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900408 scoped_ptr<base::Value> value;
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900409 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900410 ASSERT_TRUE(value.get() != NULL);
411 EXPECT_TRUE(value->Equals(&kBoolValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900412 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900413 ASSERT_TRUE(value.get() != NULL);
414 EXPECT_TRUE(value->Equals(&kIntegerValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900415 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900416 ASSERT_TRUE(value.get() != NULL);
417 EXPECT_TRUE(value->Equals(&kDoubleValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900418 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900419 ASSERT_TRUE(value.get() != NULL);
420 EXPECT_TRUE(value->Equals(&kStringValue));
421}
422
423TEST(ValuesUtilTest, AppendBasicTypesAsVariant) {
424 const base::FundamentalValue kBoolValue(false);
425 const base::FundamentalValue kIntegerValue(42);
426 const base::FundamentalValue kDoubleValue(4.2);
427 const base::StringValue kStringValue("string");
428
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900429 scoped_ptr<Response> response(Response::CreateEmpty());
430 MessageWriter writer(response.get());
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900431 AppendBasicTypeValueDataAsVariant(&writer, kBoolValue);
432 AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue);
433 AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue);
434 AppendBasicTypeValueDataAsVariant(&writer, kStringValue);
435
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900436 MessageReader reader(response.get());
thestig@chromium.orge1acdf82013-02-13 05:06:15 +0900437 scoped_ptr<base::Value> value;
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900438 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900439 ASSERT_TRUE(value.get() != NULL);
440 EXPECT_TRUE(value->Equals(&kBoolValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900441 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900442 ASSERT_TRUE(value.get() != NULL);
443 EXPECT_TRUE(value->Equals(&kIntegerValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900444 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900445 ASSERT_TRUE(value.get() != NULL);
446 EXPECT_TRUE(value->Equals(&kDoubleValue));
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900447 value.reset(PopDataAsValue(&reader));
hashimoto@chromium.orgea599822012-03-25 05:37:18 +0900448 ASSERT_TRUE(value.get() != NULL);
449 EXPECT_TRUE(value->Equals(&kStringValue));
450}
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900451
armansito@chromium.org39d51b92014-05-22 20:52:55 +0900452TEST(ValuesUtilTest, AppendValueDataBasicTypes) {
453 const base::FundamentalValue kBoolValue(false);
454 const base::FundamentalValue kIntegerValue(42);
455 const base::FundamentalValue kDoubleValue(4.2);
456 const base::StringValue kStringValue("string");
457
458 scoped_ptr<Response> response(Response::CreateEmpty());
459 MessageWriter writer(response.get());
460 AppendValueData(&writer, kBoolValue);
461 AppendValueData(&writer, kIntegerValue);
462 AppendValueData(&writer, kDoubleValue);
463 AppendValueData(&writer, kStringValue);
464
465 MessageReader reader(response.get());
466 scoped_ptr<base::Value> value;
467 value.reset(PopDataAsValue(&reader));
468 ASSERT_TRUE(value.get() != NULL);
469 EXPECT_TRUE(value->Equals(&kBoolValue));
470 value.reset(PopDataAsValue(&reader));
471 ASSERT_TRUE(value.get() != NULL);
472 EXPECT_TRUE(value->Equals(&kIntegerValue));
473 value.reset(PopDataAsValue(&reader));
474 ASSERT_TRUE(value.get() != NULL);
475 EXPECT_TRUE(value->Equals(&kDoubleValue));
476 value.reset(PopDataAsValue(&reader));
477 ASSERT_TRUE(value.get() != NULL);
478 EXPECT_TRUE(value->Equals(&kStringValue));
479}
480
481TEST(ValuesUtilTest, AppendValueDataAsVariantBasicTypes) {
482 const base::FundamentalValue kBoolValue(false);
483 const base::FundamentalValue kIntegerValue(42);
484 const base::FundamentalValue kDoubleValue(4.2);
485 const base::StringValue kStringValue("string");
486
487 scoped_ptr<Response> response(Response::CreateEmpty());
488 MessageWriter writer(response.get());
489 AppendValueDataAsVariant(&writer, kBoolValue);
490 AppendValueDataAsVariant(&writer, kIntegerValue);
491 AppendValueDataAsVariant(&writer, kDoubleValue);
492 AppendValueDataAsVariant(&writer, kStringValue);
493
494 MessageReader reader(response.get());
495 scoped_ptr<base::Value> value;
496 value.reset(PopDataAsValue(&reader));
497 ASSERT_TRUE(value.get() != NULL);
498 EXPECT_TRUE(value->Equals(&kBoolValue));
499 value.reset(PopDataAsValue(&reader));
500 ASSERT_TRUE(value.get() != NULL);
501 EXPECT_TRUE(value->Equals(&kIntegerValue));
502 value.reset(PopDataAsValue(&reader));
503 ASSERT_TRUE(value.get() != NULL);
504 EXPECT_TRUE(value->Equals(&kDoubleValue));
505 value.reset(PopDataAsValue(&reader));
506 ASSERT_TRUE(value.get() != NULL);
507 EXPECT_TRUE(value->Equals(&kStringValue));
508}
509
510TEST(ValuesUtilTest, AppendDictionary) {
511 // Set up the input dictionary.
512 const std::string kKey1 = "one";
513 const std::string kKey2 = "two";
514 const std::string kKey3 = "three";
515 const std::string kKey4 = "four";
516 const std::string kKey5 = "five";
517 const std::string kKey6 = "six";
518
519 const bool kBoolValue = true;
520 const int32 kInt32Value = -45;
521 const double kDoubleValue = 4.9;
522 const std::string kStringValue = "fifty";
523
524 base::ListValue* list_value = new base::ListValue();
525 list_value->AppendBoolean(kBoolValue);
526 list_value->AppendInteger(kInt32Value);
527
528 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
529 dictionary_value->SetBoolean(kKey1, kBoolValue);
530 dictionary_value->SetInteger(kKey2, kDoubleValue);
531
532 base::DictionaryValue test_dictionary;
533 test_dictionary.SetBoolean(kKey1, kBoolValue);
534 test_dictionary.SetInteger(kKey2, kInt32Value);
535 test_dictionary.SetDouble(kKey3, kDoubleValue);
536 test_dictionary.SetString(kKey4, kStringValue);
537 test_dictionary.Set(kKey5, list_value); // takes ownership
538 test_dictionary.Set(kKey6, dictionary_value); // takes ownership
539
540 scoped_ptr<Response> response(Response::CreateEmpty());
541 MessageWriter writer(response.get());
542 AppendValueData(&writer, test_dictionary);
543 base::FundamentalValue int_value(kInt32Value);
544 AppendValueData(&writer, int_value);
545
546 // Read the data.
547 MessageReader reader(response.get());
548 scoped_ptr<base::Value> value;
549 value.reset(PopDataAsValue(&reader));
550 ASSERT_TRUE(value.get() != NULL);
551 EXPECT_TRUE(value->Equals(&test_dictionary));
552 value.reset(PopDataAsValue(&reader));
553 ASSERT_TRUE(value.get() != NULL);
554 EXPECT_TRUE(value->Equals(&int_value));
555}
556
557TEST(ValuesUtilTest, AppendDictionaryAsVariant) {
558 // Set up the input dictionary.
559 const std::string kKey1 = "one";
560 const std::string kKey2 = "two";
561 const std::string kKey3 = "three";
562 const std::string kKey4 = "four";
563 const std::string kKey5 = "five";
564 const std::string kKey6 = "six";
565
566 const bool kBoolValue = true;
567 const int32 kInt32Value = -45;
568 const double kDoubleValue = 4.9;
569 const std::string kStringValue = "fifty";
570
571 base::ListValue* list_value = new base::ListValue();
572 list_value->AppendBoolean(kBoolValue);
573 list_value->AppendInteger(kInt32Value);
574
575 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
576 dictionary_value->SetBoolean(kKey1, kBoolValue);
577 dictionary_value->SetInteger(kKey2, kDoubleValue);
578
579 base::DictionaryValue test_dictionary;
580 test_dictionary.SetBoolean(kKey1, kBoolValue);
581 test_dictionary.SetInteger(kKey2, kInt32Value);
582 test_dictionary.SetDouble(kKey3, kDoubleValue);
583 test_dictionary.SetString(kKey4, kStringValue);
584 test_dictionary.Set(kKey5, list_value); // takes ownership
585 test_dictionary.Set(kKey6, dictionary_value); // takes ownership
586
587 scoped_ptr<Response> response(Response::CreateEmpty());
588 MessageWriter writer(response.get());
589 AppendValueDataAsVariant(&writer, test_dictionary);
590 base::FundamentalValue int_value(kInt32Value);
591 AppendValueData(&writer, int_value);
592
593 // Read the data.
594 MessageReader reader(response.get());
595 scoped_ptr<base::Value> value;
596 value.reset(PopDataAsValue(&reader));
597 ASSERT_TRUE(value.get() != NULL);
598 EXPECT_TRUE(value->Equals(&test_dictionary));
599 value.reset(PopDataAsValue(&reader));
600 ASSERT_TRUE(value.get() != NULL);
601 EXPECT_TRUE(value->Equals(&int_value));
602}
603
604TEST(ValuesUtilTest, AppendList) {
605 // Set up the input list.
606 const std::string kKey1 = "one";
607 const std::string kKey2 = "two";
608
609 const bool kBoolValue = true;
610 const int32 kInt32Value = -45;
611 const double kDoubleValue = 4.9;
612 const std::string kStringValue = "fifty";
613
614 base::ListValue* list_value = new base::ListValue();
615 list_value->AppendBoolean(kBoolValue);
616 list_value->AppendInteger(kInt32Value);
617
618 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
619 dictionary_value->SetBoolean(kKey1, kBoolValue);
620 dictionary_value->SetInteger(kKey2, kDoubleValue);
621
622 base::ListValue test_list;
623 test_list.AppendBoolean(kBoolValue);
624 test_list.AppendInteger(kInt32Value);
625 test_list.AppendDouble(kDoubleValue);
626 test_list.AppendString(kStringValue);
627 test_list.Append(list_value); // takes ownership
628 test_list.Append(dictionary_value); // takes ownership
629
630 scoped_ptr<Response> response(Response::CreateEmpty());
631 MessageWriter writer(response.get());
632 AppendValueData(&writer, test_list);
633 base::FundamentalValue int_value(kInt32Value);
634 AppendValueData(&writer, int_value);
635
636 // Read the data.
637 MessageReader reader(response.get());
638 scoped_ptr<base::Value> value;
639 value.reset(PopDataAsValue(&reader));
640 ASSERT_TRUE(value.get() != NULL);
641 EXPECT_TRUE(value->Equals(&test_list));
642 value.reset(PopDataAsValue(&reader));
643 ASSERT_TRUE(value.get() != NULL);
644 EXPECT_TRUE(value->Equals(&int_value));
645}
646
647TEST(ValuesUtilTest, AppendListAsVariant) {
648 // Set up the input list.
649 const std::string kKey1 = "one";
650 const std::string kKey2 = "two";
651
652 const bool kBoolValue = true;
653 const int32 kInt32Value = -45;
654 const double kDoubleValue = 4.9;
655 const std::string kStringValue = "fifty";
656
657 base::ListValue* list_value = new base::ListValue();
658 list_value->AppendBoolean(kBoolValue);
659 list_value->AppendInteger(kInt32Value);
660
661 base::DictionaryValue* dictionary_value = new base::DictionaryValue();
662 dictionary_value->SetBoolean(kKey1, kBoolValue);
663 dictionary_value->SetInteger(kKey2, kDoubleValue);
664
665 base::ListValue test_list;
666 test_list.AppendBoolean(kBoolValue);
667 test_list.AppendInteger(kInt32Value);
668 test_list.AppendDouble(kDoubleValue);
669 test_list.AppendString(kStringValue);
670 test_list.Append(list_value); // takes ownership
671 test_list.Append(dictionary_value); // takes ownership
672
673 scoped_ptr<Response> response(Response::CreateEmpty());
674 MessageWriter writer(response.get());
675 AppendValueDataAsVariant(&writer, test_list);
676 base::FundamentalValue int_value(kInt32Value);
677 AppendValueData(&writer, int_value);
678
679 // Read the data.
680 MessageReader reader(response.get());
681 scoped_ptr<base::Value> value;
682 value.reset(PopDataAsValue(&reader));
683 ASSERT_TRUE(value.get() != NULL);
684 EXPECT_TRUE(value->Equals(&test_list));
685 value.reset(PopDataAsValue(&reader));
686 ASSERT_TRUE(value.get() != NULL);
687 EXPECT_TRUE(value->Equals(&int_value));
688}
689
thestig@chromium.orgf0b7eac2013-06-13 15:37:19 +0900690} // namespace dbus