Chromium Code Reviews| Index: dbus/values_util_unittest.cc |
| diff --git a/dbus/values_util_unittest.cc b/dbus/values_util_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a80d54d3b7b75727fba1cc769199fecc43c93885 |
| --- /dev/null |
| +++ b/dbus/values_util_unittest.cc |
| @@ -0,0 +1,293 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "dbus/values_util.h" |
| + |
| +#include <vector> |
| + |
| +#include "base/float_util.h" |
| +#include "base/json/json_writer.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/values.h" |
| +#include "dbus/message.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +TEST(ValuesUtilTest, PopBasicTypes) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append basic type values. |
| + dbus::MessageWriter writer(response.get()); |
| + const uint8 kByteValue = 42; |
| + writer.AppendByte(kByteValue); |
| + const bool kBoolValue = true; |
| + writer.AppendBool(kBoolValue); |
| + const int16 kInt16Value = -43; |
| + writer.AppendInt16(kInt16Value); |
| + const uint16 kUint16Value = 44; |
| + writer.AppendUint16(kUint16Value); |
| + const int32 kInt32Value = -45; |
| + writer.AppendInt32(kInt32Value); |
| + const uint32 kUint32Value = 46; |
| + writer.AppendUint32(kUint32Value); |
| + const int64 kInt64Value = -47; |
| + writer.AppendInt64(kInt64Value); |
| + const uint64 kUint64Value = 48; |
| + writer.AppendUint64(kUint64Value); |
| + const double kDoubleValue = 4.9; |
| + writer.AppendDouble(kDoubleValue); |
| + const std::string kStringValue = "fifty"; |
| + writer.AppendString(kStringValue); |
| + const std::string kEmptyStringValue; |
| + writer.AppendString(kEmptyStringValue); |
| + const dbus::ObjectPath kObjectPathValue("ObjectPath"); |
| + writer.AppendObjectPath(kObjectPathValue); |
| + |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value; |
| + // Pop a byte. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kByteValue))); |
| + // Pop a bool. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateBooleanValue(kBoolValue))); |
| + // Pop an int16. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt16Value))); |
| + // Pop a uint16. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kUint16Value))); |
| + // Pop an int32. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt32Value))); |
| + // Pop a uint32. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kUint32Value))); |
| + // Pop an int64. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kInt64Value))); |
| + // Pop a uint64. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kUint64Value))); |
| + // Pop a double. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kDoubleValue))); |
| + // Pop a string. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateStringValue(kStringValue))); |
| + // Pop an empty string. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateStringValue(kEmptyStringValue))); |
| + // Pop an object path. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE( |
| + value->Equals(Value::CreateStringValue(kObjectPathValue.value()))); |
| +} |
| + |
| +TEST(ValuesUtilTest, PopVariant) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append variant values. |
| + dbus::MessageWriter writer(response.get()); |
| + const bool kBoolValue = true; |
| + writer.AppendVariantOfBool(kBoolValue); |
| + const int32 kInt32Value = -45; |
| + writer.AppendVariantOfInt32(kInt32Value); |
| + const double kDoubleValue = 4.9; |
| + writer.AppendVariantOfDouble(kDoubleValue); |
| + const std::string kStringValue = "fifty"; |
| + writer.AppendVariantOfString(kStringValue); |
| + |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value; |
| + // Pop a bool. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateBooleanValue(kBoolValue))); |
| + // Pop an int32. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt32Value))); |
| + // Pop a double. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kDoubleValue))); |
| + // Pop a string. |
| + value.reset(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(Value::CreateStringValue(kStringValue))); |
| +} |
| + |
| +TEST(ValuesUtilTest, PopIntArray) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append an int32 array. |
| + dbus::MessageWriter writer(response.get()); |
| + dbus::MessageWriter sub_writer(NULL); |
| + std::vector<int32> data; |
| + data.push_back(0); |
| + data.push_back(1); |
| + data.push_back(2); |
| + writer.OpenArray("i", &sub_writer); |
| + for (size_t i = 0; i != data.size(); ++i) |
| + sub_writer.AppendInt32(data[i]); |
| + writer.CloseContainer(&sub_writer); |
| + |
| + // Create the expected value. |
| + ListValue* list_value = new ListValue; |
| + for (size_t i = 0; i != data.size(); ++i) |
| + list_value->Append(Value::CreateIntegerValue(data[i])); |
| + |
| + // Pop an int32 array. |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(list_value)); |
| +} |
| + |
| +TEST(ValuesUtilTest, PopStringArray) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append a string array. |
| + dbus::MessageWriter writer(response.get()); |
| + dbus::MessageWriter sub_writer(NULL); |
| + std::vector<std::string> data; |
| + data.push_back("Dreamlifter"); |
| + data.push_back("Beluga"); |
| + data.push_back("Mriya"); |
| + writer.AppendArrayOfStrings(data); |
| + |
| + // Create the expected value. |
| + ListValue* list_value = new ListValue; |
| + for (size_t i = 0; i != data.size(); ++i) |
| + list_value->Append(Value::CreateStringValue(data[i])); |
| + |
| + // Pop a string array. |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(list_value)); |
| +} |
| + |
| +TEST(ValuesUtilTest, PopStruct) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append a struct. |
| + dbus::MessageWriter writer(response.get()); |
| + dbus::MessageWriter sub_writer(NULL); |
| + writer.OpenStruct(&sub_writer); |
| + const bool kBoolValue = true; |
| + sub_writer.AppendBool(kBoolValue); |
| + const int32 kInt32Value = -123; |
| + sub_writer.AppendInt32(kInt32Value); |
| + const double kDoubleValue = 1.23; |
| + sub_writer.AppendDouble(kDoubleValue); |
| + const std::string kStringValue = "one two three"; |
| + sub_writer.AppendString(kStringValue); |
| + writer.CloseContainer(&sub_writer); |
| + |
| + // Create the expected value. |
| + ListValue list_value; |
| + list_value.Append(Value::CreateBooleanValue(kBoolValue)); |
| + list_value.Append(Value::CreateIntegerValue(kInt32Value)); |
| + list_value.Append(Value::CreateDoubleValue(kDoubleValue)); |
| + list_value.Append(Value::CreateStringValue(kStringValue)); |
| + |
| + // Pop a struct. |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(&list_value)); |
| +} |
| + |
| +TEST(ValuesUtilTest, PopStringToVariantDictionary) { |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + // Append a dictionary. |
| + dbus::MessageWriter writer(response.get()); |
| + dbus::MessageWriter sub_writer(NULL); |
| + dbus::MessageWriter entry_writer(NULL); |
| + writer.OpenArray("{sv}", &sub_writer); |
| + sub_writer.OpenDictEntry(&entry_writer); |
| + const std::string kKey1 = "one"; |
| + entry_writer.AppendString(kKey1); |
| + const bool kBoolValue = true; |
| + entry_writer.AppendVariantOfBool(kBoolValue); |
| + sub_writer.CloseContainer(&entry_writer); |
| + sub_writer.OpenDictEntry(&entry_writer); |
| + const std::string kKey2 = "two"; |
| + entry_writer.AppendString(kKey2); |
| + const int32 kInt32Value = -45; |
| + entry_writer.AppendVariantOfInt32(kInt32Value); |
| + sub_writer.CloseContainer(&entry_writer); |
| + sub_writer.OpenDictEntry(&entry_writer); |
| + const std::string kKey3 = "three"; |
| + entry_writer.AppendString(kKey3); |
| + const double kDoubleValue = 4.9; |
| + entry_writer.AppendVariantOfDouble(kDoubleValue); |
| + sub_writer.CloseContainer(&entry_writer); |
| + sub_writer.OpenDictEntry(&entry_writer); |
| + const std::string kKey4 = "four"; |
| + entry_writer.AppendString(kKey4); |
| + const std::string kStringValue = "fifty"; |
| + entry_writer.AppendVariantOfString(kStringValue); |
| + sub_writer.CloseContainer(&entry_writer); |
| + writer.CloseContainer(&sub_writer); |
| + |
| + // Create the expected value. |
| + DictionaryValue dictionary_value; |
| + dictionary_value.SetBoolean(kKey1, kBoolValue); |
| + dictionary_value.SetInteger(kKey2, kInt32Value); |
| + dictionary_value.SetDouble(kKey3, kDoubleValue); |
| + dictionary_value.SetString(kKey4, kStringValue); |
| + |
| + // Pop a dictinoary. |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(&dictionary_value)); |
| +} |
|
satorux1
2012/03/16 18:28:12
we might want to test a dictionary with non-string
hashimoto
2012/03/16 19:21:44
PopDoubleToIntDictionary is doing it.
|
| + |
| +TEST(ValuesUtilTest, PopDoubleToIntDictionary) { |
| + // Create test data. |
| + static const int32 kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21}; |
|
stevenjb
2012/03/16 18:37:41
Avoid static here, it's not necessary and could ca
hashimoto
2012/03/16 19:21:44
Done.
|
| + static const size_t length = arraysize(kValues); |
|
stevenjb
2012/03/16 18:37:41
Here too.
hashimoto
2012/03/16 19:21:44
Done.
|
| + double keys[length]; |
|
satorux1
2012/03/16 18:28:12
I may be wrong, but this is probably not allowed i
stevenjb
2012/03/16 18:37:41
Yes, you could use arraysize(kValues) directly, bu
hashimoto
2012/03/16 19:21:44
Done.
|
| + for (size_t i = 0; i != length; ++i) |
| + keys[i] = sqrt(kValues[i]); |
| + |
| + // Append a dictionary. |
| + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
| + dbus::MessageWriter writer(response.get()); |
| + dbus::MessageWriter sub_writer(NULL); |
| + writer.OpenArray("{di}", &sub_writer); |
| + for (size_t i = 0; i != length; ++i) { |
| + dbus::MessageWriter entry_writer(NULL); |
| + sub_writer.OpenDictEntry(&entry_writer); |
| + entry_writer.AppendDouble(keys[i]); |
| + entry_writer.AppendInt32(kValues[i]); |
| + sub_writer.CloseContainer(&entry_writer); |
| + } |
| + writer.CloseContainer(&sub_writer); |
| + |
| + // Create the expected value. |
| + DictionaryValue dictionary_value; |
| + for (size_t i = 0; i != length; ++i) { |
| + scoped_ptr<Value> key_value(Value::CreateDoubleValue(keys[i])); |
| + std::string key_string; |
| + base::JSONWriter::Write(key_value.get(), &key_string); |
| + dictionary_value.SetInteger(key_string, kValues[i]); |
| + } |
| + |
| + // Pop a dictionary. |
| + dbus::MessageReader reader(response.get()); |
| + scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); |
| + EXPECT_TRUE(value.get() != NULL); |
| + EXPECT_TRUE(value->Equals(&dictionary_value)); |
|
satorux1
2012/03/16 18:28:12
do we have a test for int64 that cannot be precise
hashimoto
2012/03/16 19:21:44
Added PopExtremelyLargeIntegers.
|
| +} |