15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/values_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/float_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace dbus {
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopBasicTypes) {
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append basic type values.
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kByteValue = 42;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendByte(kByteValue);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kBoolValue = true;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendBool(kBoolValue);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int16 kInt16Value = -43;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt16(kInt16Value);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint16 kUint16Value = 44;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint16(kUint16Value);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kInt32Value = -45;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt32(kInt32Value);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kUint32Value = 46;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint32(kUint32Value);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 kInt64Value = -47;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt64(kInt64Value);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint64 kUint64Value = 48;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint64(kUint64Value);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const double kDoubleValue = 4.9;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendDouble(kDoubleValue);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kStringValue = "fifty";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(kStringValue);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kEmptyStringValue;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(kEmptyStringValue);
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ObjectPath kObjectPathValue("/ObjectPath");
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendObjectPath(kObjectPathValue);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> expected_value;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a byte.
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kByteValue));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a bool.
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kBoolValue));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int16.
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kInt16Value));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a uint16.
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kUint16Value));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int32.
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kInt32Value));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a uint32.
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(static_cast<double>(kUint32Value)));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int64.
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(static_cast<double>(kInt64Value)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a uint64.
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(static_cast<double>(kUint64Value)));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a double.
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kDoubleValue));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a string.
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::StringValue(kStringValue));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an empty string.
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::StringValue(kEmptyStringValue));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an object path.
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::StringValue(kObjectPathValue.value()));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopVariant) {
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append variant values.
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kBoolValue = true;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendVariantOfBool(kBoolValue);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kInt32Value = -45;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendVariantOfInt32(kInt32Value);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const double kDoubleValue = 4.9;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendVariantOfDouble(kDoubleValue);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kStringValue = "fifty";
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendVariantOfString(kStringValue);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> expected_value;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a bool.
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kBoolValue));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int32.
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kInt32Value));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a double.
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::FundamentalValue(kDoubleValue));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a string.
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(new base::StringValue(kStringValue));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pop extremely large integers which cannot be precisely represented in
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// double.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopExtremelyLargeIntegers) {
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append large integers.
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 kInt64Value = -123456789012345689LL;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendInt64(kInt64Value);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint64 kUint64Value = 9876543210987654321ULL;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendUint64(kUint64Value);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> expected_value;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double double_value = 0;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int64.
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(static_cast<double>(kInt64Value)));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value->GetAsDouble(&double_value));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(kInt64Value, static_cast<int64>(double_value));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a uint64.
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_value.reset(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(static_cast<double>(kUint64Value)));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(expected_value.get()));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value->GetAsDouble(&double_value));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(kUint64Value, static_cast<uint64>(double_value));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopIntArray) {
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append an int32 array.
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> data;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back(0);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back(1);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back(2);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.OpenArray("i", &sub_writer);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != data.size(); ++i)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.AppendInt32(data[i]);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.CloseContainer(&sub_writer);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> list_value(new base::ListValue);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != data.size(); ++i)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list_value->Append(new base::FundamentalValue(data[i]));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop an int32 array.
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(list_value.get()));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopStringArray) {
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a string array.
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> data;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back("Dreamlifter");
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back("Beluga");
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.push_back("Mriya");
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendArrayOfStrings(data);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> list_value(new base::ListValue);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != data.size(); ++i)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list_value->Append(new base::StringValue(data[i]));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a string array.
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(list_value.get()));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopStruct) {
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a struct.
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.OpenStruct(&sub_writer);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kBoolValue = true;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.AppendBool(kBoolValue);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kInt32Value = -123;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.AppendInt32(kInt32Value);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const double kDoubleValue = 1.23;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.AppendDouble(kDoubleValue);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kStringValue = "one two three";
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.AppendString(kStringValue);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.CloseContainer(&sub_writer);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue list_value;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list_value.Append(new base::FundamentalValue(kBoolValue));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list_value.Append(new base::FundamentalValue(kInt32Value));
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list_value.Append(new base::FundamentalValue(kDoubleValue));
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list_value.Append(new base::StringValue(kStringValue));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a struct.
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&list_value));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopStringToVariantDictionary) {
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a dictionary.
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter entry_writer(NULL);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.OpenArray("{sv}", &sub_writer);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey1 = "one";
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey1);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kBoolValue = true;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfBool(kBoolValue);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey2 = "two";
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey2);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kInt32Value = -45;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfInt32(kInt32Value);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey3 = "three";
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey3);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const double kDoubleValue = 4.9;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfDouble(kDoubleValue);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey4 = "four";
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey4);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kStringValue = "fifty";
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfString(kStringValue);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.CloseContainer(&sub_writer);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dictionary_value;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetBoolean(kKey1, kBoolValue);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetInteger(kKey2, kInt32Value);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetDouble(kKey3, kDoubleValue);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetString(kKey4, kStringValue);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a dictinoary.
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&dictionary_value));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopDictionaryWithDottedStringKey) {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a dictionary.
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter entry_writer(NULL);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.OpenArray("{sv}", &sub_writer);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey1 = "www.example.com";  // String including dots.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey1);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kBoolValue = true;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfBool(kBoolValue);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey2 = ".example";  // String starting with a dot.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey2);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kInt32Value = -45;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfInt32(kInt32Value);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.OpenDictEntry(&entry_writer);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kKey3 = "example.";  // String ending with a dot.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendString(kKey3);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const double kDoubleValue = 4.9;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_writer.AppendVariantOfDouble(kDoubleValue);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sub_writer.CloseContainer(&entry_writer);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.CloseContainer(&sub_writer);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dictionary_value;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetWithoutPathExpansion(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kKey1, new base::FundamentalValue(kBoolValue));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetWithoutPathExpansion(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kKey2, new base::FundamentalValue(kInt32Value));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dictionary_value.SetWithoutPathExpansion(
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kKey3, new base::FundamentalValue(kDoubleValue));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a dictinoary.
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&dictionary_value));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, PopDoubleToIntDictionary) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create test data.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<int32> values(kValues, kValues + arraysize(kValues));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<double> keys(values.size());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != values.size(); ++i)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keys[i] = sqrt(values[i]);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append a dictionary.
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter sub_writer(NULL);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.OpenArray("{di}", &sub_writer);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != values.size(); ++i) {
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MessageWriter entry_writer(NULL);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.OpenDictEntry(&entry_writer);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_writer.AppendDouble(keys[i]);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_writer.AppendInt32(values[i]);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_writer.CloseContainer(&entry_writer);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.CloseContainer(&sub_writer);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the expected value.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dictionary_value;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != values.size(); ++i) {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::Value> key_value(new base::FundamentalValue(keys[i]));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key_string;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(key_value.get(), &key_string);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dictionary_value.SetWithoutPathExpansion(
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        key_string, new base::FundamentalValue(values[i]));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pop a dictionary.
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<base::Value> value(PopDataAsValue(&reader));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&dictionary_value));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, AppendBasicTypes) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kBoolValue(false);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kIntegerValue(42);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kDoubleValue(4.2);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::StringValue kStringValue("string");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueData(&writer, kBoolValue);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueData(&writer, kIntegerValue);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueData(&writer, kDoubleValue);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueData(&writer, kStringValue);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value;
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kBoolValue));
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kIntegerValue));
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kDoubleValue));
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kStringValue));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesUtilTest, AppendBasicTypesAsVariant) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kBoolValue(false);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kIntegerValue(42);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FundamentalValue kDoubleValue(4.2);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::StringValue kStringValue("string");
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageWriter writer(response.get());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueDataAsVariant(&writer, kBoolValue);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendBasicTypeValueDataAsVariant(&writer, kStringValue);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MessageReader reader(response.get());
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value;
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kBoolValue));
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kIntegerValue));
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kDoubleValue));
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kStringValue));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendValueDataBasicTypes) {
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kBoolValue(false);
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kIntegerValue(42);
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kDoubleValue(4.2);
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::StringValue kStringValue("string");
457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, kBoolValue);
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, kIntegerValue);
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, kDoubleValue);
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, kStringValue);
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kBoolValue));
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kIntegerValue));
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kDoubleValue));
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kStringValue));
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendValueDataAsVariantBasicTypes) {
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kBoolValue(false);
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kIntegerValue(42);
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FundamentalValue kDoubleValue(4.2);
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::StringValue kStringValue("string");
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, kBoolValue);
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, kIntegerValue);
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, kDoubleValue);
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, kStringValue);
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kBoolValue));
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kIntegerValue));
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kDoubleValue));
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&kStringValue));
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendDictionary) {
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set up the input dictionary.
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey1 = "one";
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey2 = "two";
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey3 = "three";
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey4 = "four";
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey5 = "five";
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey6 = "six";
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool kBoolValue = true;
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int32 kInt32Value = -45;
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const double kDoubleValue = 4.9;
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kStringValue = "fifty";
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue* list_value = new base::ListValue();
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendBoolean(kBoolValue);
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendInteger(kInt32Value);
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue* dictionary_value = new base::DictionaryValue();
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetBoolean(kKey1, kBoolValue);
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetInteger(kKey2, kDoubleValue);
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue test_dictionary;
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetBoolean(kKey1, kBoolValue);
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetInteger(kKey2, kInt32Value);
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetDouble(kKey3, kDoubleValue);
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetString(kKey4, kStringValue);
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.Set(kKey5, list_value);  // takes ownership
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.Set(kKey6, dictionary_value);  // takes ownership
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, test_dictionary);
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FundamentalValue int_value(kInt32Value);
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, int_value);
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Read the data.
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&test_dictionary));
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&int_value));
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendDictionaryAsVariant) {
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set up the input dictionary.
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey1 = "one";
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey2 = "two";
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey3 = "three";
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey4 = "four";
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey5 = "five";
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey6 = "six";
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool kBoolValue = true;
567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int32 kInt32Value = -45;
568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const double kDoubleValue = 4.9;
569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kStringValue = "fifty";
570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue* list_value = new base::ListValue();
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendBoolean(kBoolValue);
573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendInteger(kInt32Value);
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue* dictionary_value = new base::DictionaryValue();
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetBoolean(kKey1, kBoolValue);
577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetInteger(kKey2, kDoubleValue);
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue test_dictionary;
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetBoolean(kKey1, kBoolValue);
581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetInteger(kKey2, kInt32Value);
582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetDouble(kKey3, kDoubleValue);
583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.SetString(kKey4, kStringValue);
584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.Set(kKey5, list_value);  // takes ownership
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_dictionary.Set(kKey6, dictionary_value);  // takes ownership
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, test_dictionary);
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FundamentalValue int_value(kInt32Value);
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, int_value);
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Read the data.
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&test_dictionary));
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&int_value));
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendList) {
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set up the input list.
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey1 = "one";
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey2 = "two";
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool kBoolValue = true;
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int32 kInt32Value = -45;
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const double kDoubleValue = 4.9;
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kStringValue = "fifty";
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue* list_value = new base::ListValue();
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendBoolean(kBoolValue);
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendInteger(kInt32Value);
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue* dictionary_value = new base::DictionaryValue();
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetBoolean(kKey1, kBoolValue);
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetInteger(kKey2, kDoubleValue);
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue test_list;
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendBoolean(kBoolValue);
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendInteger(kInt32Value);
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendDouble(kDoubleValue);
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendString(kStringValue);
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.Append(list_value);  // takes ownership
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.Append(dictionary_value);  // takes ownership
629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, test_list);
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FundamentalValue int_value(kInt32Value);
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, int_value);
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Read the data.
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&test_list));
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&int_value));
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ValuesUtilTest, AppendListAsVariant) {
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set up the input list.
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey1 = "one";
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kKey2 = "two";
651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool kBoolValue = true;
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int32 kInt32Value = -45;
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const double kDoubleValue = 4.9;
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string kStringValue = "fifty";
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue* list_value = new base::ListValue();
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendBoolean(kBoolValue);
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  list_value->AppendInteger(kInt32Value);
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue* dictionary_value = new base::DictionaryValue();
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetBoolean(kKey1, kBoolValue);
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dictionary_value->SetInteger(kKey2, kDoubleValue);
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ListValue test_list;
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendBoolean(kBoolValue);
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendInteger(kInt32Value);
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendDouble(kDoubleValue);
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.AppendString(kStringValue);
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.Append(list_value);  // takes ownership
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_list.Append(dictionary_value);  // takes ownership
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<Response> response(Response::CreateEmpty());
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageWriter writer(response.get());
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueDataAsVariant(&writer, test_list);
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FundamentalValue int_value(kInt32Value);
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppendValueData(&writer, int_value);
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Read the data.
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageReader reader(response.get());
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::Value> value;
682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&test_list));
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  value.reset(PopDataAsValue(&reader));
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(value.get() != NULL);
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(value->Equals(&int_value));
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace dbus
691