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