Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /dbus /values_util_unittest.cc
blob: 51d2a843e3930f4d8a993e32adcfb53249d578ff [file] [log] [blame] [edit]
// Copyright 2012 The Chromium Authors
// 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<stddef.h>
#include<stdint.h>
#include<array>
#include<cmath>
#include<memory>
#include<utility>
#include<vector>
#include"base/json/json_writer.h"
#include"base/values.h"
#include"dbus/message.h"
#include"testing/gtest/include/gtest/gtest.h"
namespace dbus{
TEST(ValuesUtilTest,PopBasicTypes){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append basic type values.
MessageWriter writer(response.get());
constuint8_t kByteValue=42;
writer.AppendByte(kByteValue);
constbool kBoolValue=true;
writer.AppendBool(kBoolValue);
constint16_t kInt16Value=-43;
writer.AppendInt16(kInt16Value);
constuint16_t kUint16Value=44;
writer.AppendUint16(kUint16Value);
constint32_t kInt32Value=-45;
writer.AppendInt32(kInt32Value);
constuint32_t kUint32Value=46;
writer.AppendUint32(kUint32Value);
constint64_t kInt64Value=-47;
writer.AppendInt64(kInt64Value);
constuint64_t kUint64Value=48;
writer.AppendUint64(kUint64Value);
constdouble kDoubleValue=4.9;
writer.AppendDouble(kDoubleValue);
const std::string kStringValue="fifty";
writer.AppendString(kStringValue);
const std::string kEmptyStringValue;
writer.AppendString(kEmptyStringValue);
constObjectPath kObjectPathValue("/ObjectPath");
writer.AppendObjectPath(kObjectPathValue);
MessageReader reader(response.get());
base::Value value;
// Pop a byte.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kByteValue));
// Pop a bool.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kBoolValue));
// Pop an int16_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kInt16Value));
// Pop a uint16_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kUint16Value));
// Pop an int32_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kInt32Value));
// Pop a uint32_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(static_cast<double>(kUint32Value)));
// Pop an int64_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(static_cast<double>(kInt64Value)));
// Pop a uint64_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(static_cast<double>(kUint64Value)));
// Pop a double.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kDoubleValue));
// Pop a string.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kStringValue));
// Pop an empty string.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kEmptyStringValue));
// Pop an object path.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kObjectPathValue.value()));
}
TEST(ValuesUtilTest,PopVariant){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append variant values.
MessageWriter writer(response.get());
constbool kBoolValue=true;
writer.AppendVariantOfBool(kBoolValue);
constint32_t kInt32Value=-45;
writer.AppendVariantOfInt32(kInt32Value);
constdouble kDoubleValue=4.9;
writer.AppendVariantOfDouble(kDoubleValue);
const std::string kStringValue="fifty";
writer.AppendVariantOfString(kStringValue);
MessageReader reader(response.get());
base::Value value;
// Pop a bool.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kBoolValue));
// Pop an int32_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kInt32Value));
// Pop a double.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kDoubleValue));
// Pop a string.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(kStringValue));
}
// Pop extremely large integers which cannot be precisely represented in
// double.
TEST(ValuesUtilTest,PopExtremelyLargeIntegers){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append large integers.
MessageWriter writer(response.get());
constint64_t kInt64Value=-123456789012345689LL;
writer.AppendInt64(kInt64Value);
constuint64_t kUint64Value=9876543210987654321ULL;
writer.AppendUint64(kUint64Value);
MessageReader reader(response.get());
base::Value value;
// Pop an int64_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(static_cast<double>(kInt64Value)));
ASSERT_TRUE(value.is_double());
EXPECT_NE(kInt64Value,static_cast<int64_t>(value.GetDouble()));
// Pop a uint64_t.
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, base::Value(static_cast<double>(kUint64Value)));
ASSERT_TRUE(value.is_double());
EXPECT_NE(kUint64Value,static_cast<uint64_t>(value.GetDouble()));
}
TEST(ValuesUtilTest,PopIntArray){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append an int32_t array.
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
std::vector<int32_t> 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.
base::Value::List list_value;
for(size_t i=0; i!= data.size();++i)
list_value.Append(data[i]);
// Pop an int32_t array.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, list_value);
}
TEST(ValuesUtilTest,PopStringArray){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append a string array.
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
std::vector<std::string> data;
data.push_back("Dreamlifter");
data.push_back("Beluga");
data.push_back("Mriya");
writer.AppendArrayOfStrings(data);
// Create the expected value.
base::Value::List list_value;
for(size_t i=0; i!= data.size();++i)
list_value.Append(data[i]);
// Pop a string array.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, list_value);
}
TEST(ValuesUtilTest,PopStruct){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append a struct.
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
writer.OpenStruct(&sub_writer);
constbool kBoolValue=true;
sub_writer.AppendBool(kBoolValue);
constint32_t kInt32Value=-123;
sub_writer.AppendInt32(kInt32Value);
constdouble 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.
base::Value::List list_value;
list_value.Append(kBoolValue);
list_value.Append(kInt32Value);
list_value.Append(kDoubleValue);
list_value.Append(kStringValue);
// Pop a struct.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, list_value);
}
TEST(ValuesUtilTest,PopStringToVariantDictionary){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append a dictionary.
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
MessageWriter entry_writer(nullptr);
writer.OpenArray("{sv}",&sub_writer);
sub_writer.OpenDictEntry(&entry_writer);
const std::string kKey1="one";
entry_writer.AppendString(kKey1);
constbool 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);
constint32_t 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);
constdouble 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.
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kInt32Value);
dictionary_value.Set(kKey3, kDoubleValue);
dictionary_value.Set(kKey4, kStringValue);
// Pop a dictinoary.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, dictionary_value);
}
TEST(ValuesUtilTest,PopDictionaryWithDottedStringKey){
std::unique_ptr<Response> response(Response::CreateEmpty());
// Append a dictionary.
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
MessageWriter entry_writer(nullptr);
writer.OpenArray("{sv}",&sub_writer);
sub_writer.OpenDictEntry(&entry_writer);
const std::string kKey1="www.example.com";// String including dots.
entry_writer.AppendString(kKey1);
constbool kBoolValue=true;
entry_writer.AppendVariantOfBool(kBoolValue);
sub_writer.CloseContainer(&entry_writer);
sub_writer.OpenDictEntry(&entry_writer);
const std::string kKey2=".example";// String starting with a dot.
entry_writer.AppendString(kKey2);
constint32_t kInt32Value=-45;
entry_writer.AppendVariantOfInt32(kInt32Value);
sub_writer.CloseContainer(&entry_writer);
sub_writer.OpenDictEntry(&entry_writer);
const std::string kKey3="example.";// String ending with a dot.
entry_writer.AppendString(kKey3);
constdouble kDoubleValue=4.9;
entry_writer.AppendVariantOfDouble(kDoubleValue);
sub_writer.CloseContainer(&entry_writer);
writer.CloseContainer(&sub_writer);
// Create the expected value.
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kInt32Value);
dictionary_value.Set(kKey3, kDoubleValue);
// Pop a dictinoary.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, dictionary_value);
}
TEST(ValuesUtilTest,PopDoubleToIntDictionary){
// Create test data.
constauto kValues= std::to_array<int32_t>({0,1,1,2,3,5,8,13,21});
const std::vector<int32_t> values(
kValues.data(),
base::span<constint32_t>(kValues).subspan(std::size(kValues)).data());
std::vector<double> keys(values.size());
for(size_t i=0; i!= values.size();++i)
keys[i]= std::sqrt(values[i]);
// Append a dictionary.
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
MessageWriter sub_writer(nullptr);
writer.OpenArray("{di}",&sub_writer);
for(size_t i=0; i!= values.size();++i){
MessageWriter entry_writer(nullptr);
sub_writer.OpenDictEntry(&entry_writer);
entry_writer.AppendDouble(keys[i]);
entry_writer.AppendInt32(values[i]);
sub_writer.CloseContainer(&entry_writer);
}
writer.CloseContainer(&sub_writer);
// Create the expected value.
base::Value::Dict dictionary_value;
for(size_t i=0; i!= values.size();++i){
std::string key_string;
base::JSONWriter::Write(base::Value(keys[i]),&key_string);
dictionary_value.Set(key_string, values[i]);
}
// Pop a dictionary.
MessageReader reader(response.get());
base::Value value(PopDataAsValue(&reader));
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, dictionary_value);
}
TEST(ValuesUtilTest,AppendBasicTypes){
const base::Value kBoolValue(false);
const base::Value kIntegerValue(42);
const base::Value kDoubleValue(4.2);
const base::Value kStringValue("string");
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendBasicTypeValueData(&writer, kBoolValue);
AppendBasicTypeValueData(&writer, kIntegerValue);
AppendBasicTypeValueData(&writer, kDoubleValue);
AppendBasicTypeValueData(&writer, kStringValue);
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kBoolValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kIntegerValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kDoubleValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kStringValue);
}
TEST(ValuesUtilTest,AppendBasicTypesAsVariant){
const base::Value kBoolValue(false);
const base::Value kIntegerValue(42);
const base::Value kDoubleValue(4.2);
const base::Value kStringValue("string");
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendBasicTypeValueDataAsVariant(&writer, kBoolValue);
AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue);
AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue);
AppendBasicTypeValueDataAsVariant(&writer, kStringValue);
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kBoolValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kIntegerValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kDoubleValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kStringValue);
}
TEST(ValuesUtilTest,AppendValueDataBasicTypes){
const base::Value kBoolValue(false);
const base::Value kIntegerValue(42);
const base::Value kDoubleValue(4.2);
const base::Value kStringValue("string");
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueData(&writer, kBoolValue);
AppendValueData(&writer, kIntegerValue);
AppendValueData(&writer, kDoubleValue);
AppendValueData(&writer, kStringValue);
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kBoolValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kIntegerValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kDoubleValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kStringValue);
}
TEST(ValuesUtilTest,AppendValueDataAsVariantBasicTypes){
const base::Value kBoolValue(false);
const base::Value kIntegerValue(42);
const base::Value kDoubleValue(4.2);
const base::Value kStringValue("string");
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueDataAsVariant(&writer, kBoolValue);
AppendValueDataAsVariant(&writer, kIntegerValue);
AppendValueDataAsVariant(&writer, kDoubleValue);
AppendValueDataAsVariant(&writer, kStringValue);
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kBoolValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kIntegerValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kDoubleValue);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, kStringValue);
}
TEST(ValuesUtilTest,AppendDictionary){
// Set up the input dictionary.
const std::string kKey1="one";
const std::string kKey2="two";
const std::string kKey3="three";
const std::string kKey4="four";
const std::string kKey5="five";
const std::string kKey6="six";
constbool kBoolValue=true;
constint32_t kInt32Value=-45;
constdouble kDoubleValue=4.9;
const std::string kStringValue="fifty";
base::Value::List list_value;
list_value.Append(kBoolValue);
list_value.Append(kInt32Value);
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kDoubleValue);
base::Value::Dict test_dictionary;
test_dictionary.Set(kKey1, kBoolValue);
test_dictionary.Set(kKey2, kInt32Value);
test_dictionary.Set(kKey3, kDoubleValue);
test_dictionary.Set(kKey4, kStringValue);
test_dictionary.Set(kKey5, std::move(list_value));
test_dictionary.Set(kKey6, std::move(dictionary_value));
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueData(&writer, test_dictionary);
base::Value int_value(kInt32Value);
AppendValueData(&writer, int_value);
// Read the data.
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, test_dictionary);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, int_value);
}
TEST(ValuesUtilTest,AppendDictionaryAsVariant){
// Set up the input dictionary.
const std::string kKey1="one";
const std::string kKey2="two";
const std::string kKey3="three";
const std::string kKey4="four";
const std::string kKey5="five";
const std::string kKey6="six";
constbool kBoolValue=true;
constint32_t kInt32Value=-45;
constdouble kDoubleValue=4.9;
const std::string kStringValue="fifty";
base::Value::List list_value;
list_value.Append(kBoolValue);
list_value.Append(kInt32Value);
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kDoubleValue);
base::Value::Dict test_dictionary;
test_dictionary.Set(kKey1, kBoolValue);
test_dictionary.Set(kKey2, kInt32Value);
test_dictionary.Set(kKey3, kDoubleValue);
test_dictionary.Set(kKey4, kStringValue);
test_dictionary.Set(kKey5, std::move(list_value));
test_dictionary.Set(kKey6, std::move(dictionary_value));
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueDataAsVariant(&writer, test_dictionary);
base::Value int_value(kInt32Value);
AppendValueData(&writer, int_value);
// Read the data.
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, test_dictionary);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, int_value);
}
TEST(ValuesUtilTest,AppendList){
// Set up the input list.
const std::string kKey1="one";
const std::string kKey2="two";
constbool kBoolValue=true;
constint32_t kInt32Value=-45;
constdouble kDoubleValue=4.9;
const std::string kStringValue="fifty";
base::Value::List list_value;
list_value.Append(kBoolValue);
list_value.Append(kInt32Value);
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kDoubleValue);
base::Value::List test_list;
test_list.Append(kBoolValue);
test_list.Append(kInt32Value);
test_list.Append(kDoubleValue);
test_list.Append(kStringValue);
test_list.Append(std::move(list_value));
test_list.Append(std::move(dictionary_value));
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueData(&writer, test_list);
base::Value int_value(kInt32Value);
AppendValueData(&writer, int_value);
// Read the data.
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, test_list);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, int_value);
}
TEST(ValuesUtilTest,AppendListAsVariant){
// Set up the input list.
const std::string kKey1="one";
const std::string kKey2="two";
constbool kBoolValue=true;
constint32_t kInt32Value=-45;
constdouble kDoubleValue=4.9;
const std::string kStringValue="fifty";
base::Value::List list_value;
list_value.Append(kBoolValue);
list_value.Append(kInt32Value);
base::Value::Dict dictionary_value;
dictionary_value.Set(kKey1, kBoolValue);
dictionary_value.Set(kKey2, kDoubleValue);
base::Value::List test_list;
test_list.Append(kBoolValue);
test_list.Append(kInt32Value);
test_list.Append(kDoubleValue);
test_list.Append(kStringValue);
test_list.Append(std::move(list_value));
test_list.Append(std::move(dictionary_value));
std::unique_ptr<Response> response(Response::CreateEmpty());
MessageWriter writer(response.get());
AppendValueDataAsVariant(&writer, test_list);
base::Value int_value(kInt32Value);
AppendValueData(&writer, int_value);
// Read the data.
MessageReader reader(response.get());
base::Value value;
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, test_list);
value=PopDataAsValue(&reader);
ASSERT_FALSE(value.is_none());
EXPECT_EQ(value, int_value);
}
}// namespace dbus

[8]ページ先頭

©2009-2025 Movatter.jp