buffet: Raw string literals for some JSON constants in tests
Added EXPECT_JSON_EQ() macro to help compare JSON values without being
influenced by string formatting and whitespace. This allows us to use
raw literal strings in conditions which improves readability of the
tests.
BUG=None
TEST=FEATURE=test emerge-gizmo buffet
Change-Id: Ibc6642a053dd3e6f3b667de31ceefa21f03e85bf
Reviewed-on: https://chromium-review.googlesource.com/268961
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/commands/command_dictionary_unittest.cc b/buffet/commands/command_dictionary_unittest.cc
index 6a2c8d7..e31f8cc 100644
--- a/buffet/commands/command_dictionary_unittest.cc
+++ b/buffet/commands/command_dictionary_unittest.cc
@@ -11,6 +11,7 @@
namespace buffet {
using unittests::CreateDictionaryValue;
+using unittests::IsEqualValue;
TEST(CommandDictionary, Empty) {
CommandDictionary dict;
@@ -206,7 +207,7 @@
CommandDictionary base_dict;
base_dict.LoadCommands(*json_base, "base", nullptr, nullptr);
- auto json = unittests::CreateDictionaryValue(R"({
+ auto json = CreateDictionaryValue(R"({
'base': {
'reboot': {
'parameters': {'delay': {'minimum': 10}},
@@ -225,24 +226,51 @@
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) { return true; }, false, nullptr);
- EXPECT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'base':{'reboot':{'parameters':{'delay':{'minimum':10}}}},"
- "'robot':{'_jump':{'parameters':{'_height':'integer'}}}}",
- unittests::ValueToString(json.get()));
+ ASSERT_NE(nullptr, json.get());
+ auto expected = R"({
+ 'base': {
+ 'reboot': {
+ 'parameters': {'delay': {'minimum': 10}}
+ }
+ },
+ 'robot': {
+ '_jump': {
+ 'parameters': {'_height': 'integer'}
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) { return true; }, true, nullptr);
- EXPECT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'base':{'reboot':{'parameters':{'delay':{"
- "'maximum':100,'minimum':10,'type':'integer'}}}},"
- "'robot':{'_jump':{'parameters':{'_height':{'type':'integer'}}}}}",
- unittests::ValueToString(json.get()));
+ ASSERT_NE(nullptr, json.get());
+ expected = R"({
+ 'base': {
+ 'reboot': {
+ 'parameters': {
+ 'delay': {
+ 'maximum': 100,
+ 'minimum': 10,
+ 'type': 'integer'
+ }
+ }
+ }
+ },
+ 'robot': {
+ '_jump': {
+ 'parameters': {
+ '_height': {
+ 'type': 'integer'
+ }
+ }
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
}
TEST(CommandDictionary, GetCommandsAsJsonWithVisibility) {
- auto json = unittests::CreateDictionaryValue(R"({
+ auto json = CreateDictionaryValue(R"({
'test': {
'command1': {
'parameters': {},
@@ -292,56 +320,60 @@
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) { return true; }, false, nullptr);
ASSERT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'test':{"
- "'command1':{'parameters':{}},"
- "'command2':{'parameters':{}},"
- "'command3':{'parameters':{}},"
- "'command4':{'parameters':{}},"
- "'command5':{'parameters':{}},"
- "'command6':{'parameters':{}},"
- "'command7':{'parameters':{}},"
- "'command8':{'parameters':{}}"
- "}}",
- unittests::ValueToString(json.get()));
+ auto expected = R"({
+ 'test': {
+ 'command1': {'parameters': {}},
+ 'command2': {'parameters': {}},
+ 'command3': {'parameters': {}},
+ 'command4': {'parameters': {}},
+ 'command5': {'parameters': {}},
+ 'command6': {'parameters': {}},
+ 'command7': {'parameters': {}},
+ 'command8': {'parameters': {}}
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) { return def->GetVisibility().local; },
false, nullptr);
ASSERT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'test':{"
- "'command2':{'parameters':{}},"
- "'command4':{'parameters':{}},"
- "'command6':{'parameters':{}},"
- "'command8':{'parameters':{}}"
- "}}",
- unittests::ValueToString(json.get()));
+ expected = R"({
+ 'test': {
+ 'command2': {'parameters': {}},
+ 'command4': {'parameters': {}},
+ 'command6': {'parameters': {}},
+ 'command8': {'parameters': {}}
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) { return def->GetVisibility().cloud; },
false, nullptr);
ASSERT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'test':{"
- "'command3':{'parameters':{}},"
- "'command4':{'parameters':{}},"
- "'command7':{'parameters':{}},"
- "'command8':{'parameters':{}}"
- "}}",
- unittests::ValueToString(json.get()));
+ expected = R"({
+ 'test': {
+ 'command3': {'parameters': {}},
+ 'command4': {'parameters': {}},
+ 'command7': {'parameters': {}},
+ 'command8': {'parameters': {}}
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
json = dict.GetCommandsAsJson(
[](const CommandDefinition* def) {
return def->GetVisibility().local && def->GetVisibility().cloud;
}, false, nullptr);
ASSERT_NE(nullptr, json.get());
- EXPECT_EQ(
- "{'test':{"
- "'command4':{'parameters':{}},"
- "'command8':{'parameters':{}}"
- "}}",
- unittests::ValueToString(json.get()));
+ expected = R"({
+ 'test': {
+ 'command4': {'parameters': {}},
+ 'command8': {'parameters': {}}
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *json);
}
TEST(CommandDictionary, LoadCommandsWithVisibility) {
diff --git a/buffet/commands/object_schema_unittest.cc b/buffet/commands/object_schema_unittest.cc
index 06d2ca7..1330099 100644
--- a/buffet/commands/object_schema_unittest.cc
+++ b/buffet/commands/object_schema_unittest.cc
@@ -23,7 +23,6 @@
using unittests::CreateValue;
using unittests::CreateDictionaryValue;
-using unittests::ValueToString;
namespace {
@@ -69,32 +68,26 @@
TEST(CommandSchema, IntPropType_ToJson) {
IntPropType prop;
- EXPECT_EQ("'integer'", ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'type':'integer'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("'integer'", *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'type':'integer'}", *prop.ToJson(true, nullptr));
IntPropType param2;
param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(),
&prop, nullptr);
- EXPECT_EQ("{'minimum':3}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'minimum':3}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(),
&prop, nullptr);
- EXPECT_EQ("{'maximum':-7}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maximum':-7}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
&prop, nullptr);
- EXPECT_EQ("{'maximum':5,'minimum':0}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maximum':5,'minimum':0}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'enum':[1,2,3]}").get(), &prop,
nullptr);
- EXPECT_EQ("[1,2,3]",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("[1,2,3]", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'default':123}").get(),
&prop, nullptr);
- EXPECT_EQ("{'default':123}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'default':123}", *param2.ToJson(false, nullptr));
}
TEST(CommandSchema, IntPropType_FromJson) {
@@ -195,21 +188,19 @@
TEST(CommandSchema, BoolPropType_ToJson) {
BooleanPropType prop;
- EXPECT_EQ("'boolean'", ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'type':'boolean'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("'boolean'", *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'type':'boolean'}", *prop.ToJson(true, nullptr));
BooleanPropType param2;
param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'enum':[true,false]}").get(), &prop,
nullptr);
- EXPECT_EQ("[true,false]", ValueToString(param2.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'enum':[true,false],'type':'boolean'}",
- ValueToString(param2.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("[true,false]", *param2.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'enum':[true,false],'type':'boolean'}",
+ *param2.ToJson(true, nullptr));
param2.FromJson(CreateDictionaryValue("{'default':true}").get(),
&prop, nullptr);
- EXPECT_EQ("{'default':true}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'default':true}", *param2.ToJson(false, nullptr));
}
TEST(CommandSchema, BoolPropType_FromJson) {
@@ -288,28 +279,24 @@
TEST(CommandSchema, DoublePropType_ToJson) {
DoublePropType prop;
- EXPECT_EQ("'number'", ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'type':'number'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("'number'", *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'type':'number'}", *prop.ToJson(true, nullptr));
DoublePropType param2;
param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(), &prop,
nullptr);
- EXPECT_EQ("{'minimum':3.0}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'minimum':3.0}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(), &prop,
nullptr);
- EXPECT_EQ("{'maximum':-7.0}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maximum':-7.0}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
&prop, nullptr);
- EXPECT_EQ("{'maximum':5.0,'minimum':0.0}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maximum':5.0,'minimum':0.0}",
+ *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'default':12.3}").get(),
&prop, nullptr);
- EXPECT_EQ("{'default':12.3}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'default':12.3}", *param2.ToJson(false, nullptr));
}
TEST(CommandSchema, DoublePropType_FromJson) {
@@ -411,28 +398,24 @@
TEST(CommandSchema, StringPropType_ToJson) {
StringPropType prop;
- EXPECT_EQ("'string'", ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'type':'string'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("'string'", *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'type':'string'}", *prop.ToJson(true, nullptr));
StringPropType param2;
param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minLength':3}").get(), &prop,
nullptr);
- EXPECT_EQ("{'minLength':3}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'minLength':3}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'maxLength':7}").get(), &prop,
nullptr);
- EXPECT_EQ("{'maxLength':7}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maxLength':7}", *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'minLength':0,'maxLength':5}").get(),
&prop, nullptr);
- EXPECT_EQ("{'maxLength':5,'minLength':0}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'maxLength':5,'minLength':0}",
+ *param2.ToJson(false, nullptr));
param2.FromJson(CreateDictionaryValue("{'default':'abcd'}").get(),
&prop, nullptr);
- EXPECT_EQ("{'default':'abcd'}",
- ValueToString(param2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{'default':'abcd'}", *param2.ToJson(false, nullptr));
}
TEST(CommandSchema, StringPropType_FromJson) {
@@ -538,14 +521,15 @@
TEST(CommandSchema, ObjectPropType_ToJson) {
ObjectPropType prop;
- EXPECT_EQ("{'additionalProperties':false,'properties':{}}",
- ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'additionalProperties':false,'properties':{},'type':'object'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("{'additionalProperties':false,'properties':{}}",
+ *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ(
+ "{'additionalProperties':false,'properties':{},'type':'object'}",
+ *prop.ToJson(true, nullptr));
EXPECT_FALSE(prop.IsBasedOnSchema());
ObjectPropType prop2;
prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *prop2.ToJson(false, nullptr));
EXPECT_TRUE(prop2.IsBasedOnSchema());
auto schema = ObjectSchema::Create();
@@ -554,44 +538,106 @@
pw->GetString()->AddLengthConstraint(6, 100);
schema->AddProp("password", std::move(pw));
prop2.SetObjectSchema(std::move(schema));
- EXPECT_EQ("{'additionalProperties':false,'properties':{'expires':'integer',"
- "'password':{'maxLength':100,'minLength':6}}}",
- ValueToString(prop2.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'additionalProperties':false,'properties':{"
- "'expires':{'type':'integer'},"
- "'password':{'maxLength':100,'minLength':6,'type':'string'}},"
- "'type':'object'}",
- ValueToString(prop2.ToJson(true, nullptr).get()));
+ auto expected = R"({
+ 'additionalProperties': false,
+ 'properties': {
+ 'expires': 'integer',
+ 'password': {
+ 'maxLength': 100,
+ 'minLength': 6
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *prop2.ToJson(false, nullptr));
+
+ expected = R"({
+ 'additionalProperties': false,
+ 'properties': {
+ 'expires': {
+ 'type': 'integer'
+ },
+ 'password': {
+ 'maxLength': 100,
+ 'minLength': 6,
+ 'type': 'string'
+ }
+ },
+ 'type': 'object'
+ })";
+ EXPECT_JSON_EQ(expected, *prop2.ToJson(true, nullptr));
ObjectPropType prop3;
ASSERT_TRUE(prop3.FromJson(CreateDictionaryValue(
"{'default':{'expires':3,'password':'abracadabra'}}").get(), &prop2,
nullptr));
- EXPECT_EQ("{'default':{'expires':3,'password':'abracadabra'}}",
- ValueToString(prop3.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'additionalProperties':false,"
- "'default':{'expires':3,'password':'abracadabra'},"
- "'properties':{'expires':{'type':'integer'},"
- "'password':{'maxLength':100,'minLength':6,'type':'string'}},"
- "'type':'object'}",
- ValueToString(prop3.ToJson(true, nullptr).get()));
+ expected = R"({
+ 'default': {
+ 'expires': 3,
+ 'password': 'abracadabra'
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *prop3.ToJson(false, nullptr));
+
+ expected = R"({
+ 'additionalProperties': false,
+ 'default': {
+ 'expires': 3,
+ 'password': 'abracadabra'
+ },
+ 'properties': {
+ 'expires': {
+ 'type': 'integer'
+ },
+ 'password': {
+ 'maxLength': 100,
+ 'minLength': 6,
+ 'type': 'string'
+ }
+ },
+ 'type': 'object'
+ })";
+ EXPECT_JSON_EQ(expected, *prop3.ToJson(true, nullptr));
ObjectPropType prop4;
ASSERT_TRUE(prop4.FromJson(CreateDictionaryValue(
"{'additionalProperties':true,"
"'default':{'expires':3,'password':'abracadabra'}}").get(), &prop2,
nullptr));
- EXPECT_EQ("{'additionalProperties':true,"
- "'default':{'expires':3,'password':'abracadabra'},"
- "'properties':{'expires':'integer',"
- "'password':{'maxLength':100,'minLength':6}}}",
- ValueToString(prop4.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'additionalProperties':true,"
- "'default':{'expires':3,'password':'abracadabra'},"
- "'properties':{'expires':{'type':'integer'},"
- "'password':{'maxLength':100,'minLength':6,'type':'string'}},"
- "'type':'object'}",
- ValueToString(prop4.ToJson(true, nullptr).get()));
+ expected = R"({
+ 'additionalProperties': true,
+ 'default': {
+ 'expires': 3,
+ 'password': 'abracadabra'
+ },
+ 'properties': {
+ 'expires': 'integer',
+ 'password': {
+ 'maxLength': 100,
+ 'minLength': 6
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *prop4.ToJson(false, nullptr));
+
+ expected = R"({
+ 'additionalProperties': true,
+ 'default': {
+ 'expires': 3,
+ 'password': 'abracadabra'
+ },
+ 'properties': {
+ 'expires': {
+ 'type': 'integer'
+ },
+ 'password': {
+ 'maxLength': 100,
+ 'minLength': 6,
+ 'type': 'string'
+ }
+ },
+ 'type': 'object'
+ })";
+ EXPECT_JSON_EQ(expected, *prop4.ToJson(true, nullptr));
}
TEST(CommandSchema, ObjectPropType_FromJson) {
@@ -725,21 +771,20 @@
TEST(CommandSchema, ArrayPropType_ToJson) {
ArrayPropType prop;
prop.SetItemType(PropType::Create(ValueType::Int));
- EXPECT_EQ("{'items':'integer'}",
- ValueToString(prop.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'items':{'type':'integer'},'type':'array'}",
- ValueToString(prop.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("{'items':'integer'}", *prop.ToJson(false, nullptr));
+ EXPECT_JSON_EQ("{'items':{'type':'integer'},'type':'array'}",
+ *prop.ToJson(true, nullptr));
EXPECT_FALSE(prop.IsBasedOnSchema());
ArrayPropType prop2;
prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
- EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("{}", *prop2.ToJson(false, nullptr));
EXPECT_TRUE(prop2.IsBasedOnSchema());
prop2.FromJson(CreateDictionaryValue("{'default':[1,2,3]}").get(),
&prop, nullptr);
- EXPECT_EQ("{'default':[1,2,3]}",
- ValueToString(prop2.ToJson(false, nullptr).get()));
- EXPECT_EQ("{'default':[1,2,3],'items':{'type':'integer'},'type':'array'}",
- ValueToString(prop2.ToJson(true, nullptr).get()));
+ EXPECT_JSON_EQ("{'default':[1,2,3]}", *prop2.ToJson(false, nullptr));
+ EXPECT_JSON_EQ(
+ "{'default':[1,2,3],'items':{'type':'integer'},'type':'array'}",
+ *prop2.ToJson(true, nullptr));
}
TEST(CommandSchema, ArrayPropType_FromJson) {
@@ -816,7 +861,7 @@
ASSERT_NE(nullptr, val.get());
EXPECT_EQ(nullptr, error.get());
EXPECT_EQ(arr, val->GetValueAsAny().Get<native_types::Array>());
- EXPECT_EQ("[]", ValueToString(val->ToJson(nullptr).get()));
+ EXPECT_JSON_EQ("[]", *val->ToJson(nullptr));
IntPropType int_type;
ObjectPropType obj_type;
@@ -840,8 +885,8 @@
ASSERT_NE(nullptr, val.get());
EXPECT_EQ(nullptr, error.get());
EXPECT_EQ(arr, val->GetValueAsAny().Get<native_types::Array>());
- EXPECT_EQ("[{'height':20,'width':10},{'height':18,'width':17}]",
- ValueToString(val->ToJson(nullptr).get()));
+ EXPECT_JSON_EQ("[{'height':20,'width':10},{'height':18,'width':17}]",
+ *val->ToJson(nullptr));
val = prop.CreateValue("blah", &error);
EXPECT_EQ(nullptr, val.get());
diff --git a/buffet/commands/schema_utils_unittest.cc b/buffet/commands/schema_utils_unittest.cc
index 9698317..d872995 100644
--- a/buffet/commands/schema_utils_unittest.cc
+++ b/buffet/commands/schema_utils_unittest.cc
@@ -22,38 +22,32 @@
using unittests::CreateDictionaryValue;
using unittests::CreateValue;
-using unittests::ValueToString;
using chromeos::VariantDictionary;
TEST(CommandSchemaUtils, TypedValueToJson_Scalar) {
- EXPECT_EQ("true", ValueToString(TypedValueToJson(true, nullptr).get()));
- EXPECT_EQ("false", ValueToString(TypedValueToJson(false, nullptr).get()));
+ EXPECT_JSON_EQ("true", *TypedValueToJson(true, nullptr));
+ EXPECT_JSON_EQ("false", *TypedValueToJson(false, nullptr));
- EXPECT_EQ("0", ValueToString(TypedValueToJson(0, nullptr).get()));
- EXPECT_EQ("-10", ValueToString(TypedValueToJson(-10, nullptr).get()));
- EXPECT_EQ("20", ValueToString(TypedValueToJson(20, nullptr).get()));
+ EXPECT_JSON_EQ("0", *TypedValueToJson(0, nullptr));
+ EXPECT_JSON_EQ("-10", *TypedValueToJson(-10, nullptr));
+ EXPECT_JSON_EQ("20", *TypedValueToJson(20, nullptr));
- EXPECT_EQ("0.0", ValueToString(TypedValueToJson(0.0, nullptr).get()));
- EXPECT_EQ("1.2", ValueToString(TypedValueToJson(1.2, nullptr).get()));
+ EXPECT_JSON_EQ("0.0", *TypedValueToJson(0.0, nullptr));
+ EXPECT_JSON_EQ("1.2", *TypedValueToJson(1.2, nullptr));
- EXPECT_EQ("'abc'",
- ValueToString(TypedValueToJson(std::string("abc"), nullptr).get()));
+ EXPECT_JSON_EQ("'abc'", *TypedValueToJson(std::string("abc"), nullptr));
std::vector<bool> bool_array{true, false};
- EXPECT_EQ("[true,false]",
- ValueToString(TypedValueToJson(bool_array, nullptr).get()));
+ EXPECT_JSON_EQ("[true,false]", *TypedValueToJson(bool_array, nullptr));
std::vector<int> int_array{1, 2, 5};
- EXPECT_EQ("[1,2,5]",
- ValueToString(TypedValueToJson(int_array, nullptr).get()));
+ EXPECT_JSON_EQ("[1,2,5]", *TypedValueToJson(int_array, nullptr));
std::vector<double> dbl_array{1.1, 2.2};
- EXPECT_EQ("[1.1,2.2]",
- ValueToString(TypedValueToJson(dbl_array, nullptr).get()));
+ EXPECT_JSON_EQ("[1.1,2.2]", *TypedValueToJson(dbl_array, nullptr));
std::vector<std::string> str_array{"a", "bc"};
- EXPECT_EQ("['a','bc']",
- ValueToString(TypedValueToJson(str_array, nullptr).get()));
+ EXPECT_JSON_EQ("['a','bc']", *TypedValueToJson(str_array, nullptr));
}
TEST(CommandSchemaUtils, TypedValueToJson_Object) {
@@ -62,8 +56,8 @@
object.insert(std::make_pair("width", int_type.CreateValue(640, nullptr)));
object.insert(std::make_pair("height", int_type.CreateValue(480, nullptr)));
- EXPECT_EQ("{'height':480,'width':640}",
- ValueToString(TypedValueToJson(object, nullptr).get()));
+ EXPECT_JSON_EQ("{'height':480,'width':640}",
+ *TypedValueToJson(object, nullptr));
}
TEST(CommandSchemaUtils, TypedValueToJson_Array) {
@@ -72,7 +66,7 @@
arr.push_back(int_type.CreateValue(640, nullptr));
arr.push_back(int_type.CreateValue(480, nullptr));
- EXPECT_EQ("[640,480]", ValueToString(TypedValueToJson(arr, nullptr).get()));
+ EXPECT_JSON_EQ("[640,480]", *TypedValueToJson(arr, nullptr));
}
TEST(CommandSchemaUtils, TypedValueFromJson_Bool) {
diff --git a/buffet/commands/unittest_utils.cc b/buffet/commands/unittest_utils.cc
index db8aa4a..be4d4e7 100644
--- a/buffet/commands/unittest_utils.cc
+++ b/buffet/commands/unittest_utils.cc
@@ -14,25 +14,22 @@
std::string json2(json);
// Convert apostrophes to double-quotes so JSONReader can parse the string.
std::replace(json2.begin(), json2.end(), '\'', '"');
- return std::unique_ptr<base::Value>(base::JSONReader::Read(json2));
+ int error = 0;
+ std::string message;
+ std::unique_ptr<base::Value> value{base::JSONReader::ReadAndReturnError(
+ json2, base::JSON_PARSE_RFC, &error, &message)};
+ CHECK(value) << "Failed to load JSON: " << message << ", " << json;
+ return value;
}
std::unique_ptr<base::DictionaryValue> CreateDictionaryValue(const char* json) {
- std::string json2(json);
- std::replace(json2.begin(), json2.end(), '\'', '"');
- base::Value* value = base::JSONReader::Read(json2);
- CHECK(value) << "Failed to load JSON: " << json2;
+ std::unique_ptr<base::Value> value = CreateValue(json);
base::DictionaryValue* dict = nullptr;
value->GetAsDictionary(&dict);
+ CHECK(dict) << "Value is not dictionary: " << json;
+ value.release();
return std::unique_ptr<base::DictionaryValue>(dict);
}
-std::string ValueToString(const base::Value* value) {
- std::string json;
- base::JSONWriter::Write(value, &json);
- std::replace(json.begin(), json.end(), '"', '\'');
- return json;
-}
-
} // namespace unittests
} // namespace buffet
diff --git a/buffet/commands/unittest_utils.h b/buffet/commands/unittest_utils.h
index 25db6b2..3a9dcc1 100644
--- a/buffet/commands/unittest_utils.h
+++ b/buffet/commands/unittest_utils.h
@@ -9,6 +9,7 @@
#include <string>
#include <base/values.h>
+#include <gtest/gtest.h>
#include "buffet/commands/prop_types.h"
#include "buffet/commands/prop_values.h"
@@ -24,9 +25,9 @@
// Helper method to create a JSON dictionary object from a string.
std::unique_ptr<base::DictionaryValue> CreateDictionaryValue(const char* json);
-// Converts a JSON value to a string. It also converts double-quotes to
-// apostrophes for easy comparisons in C++ source code.
-std::string ValueToString(const base::Value* value);
+inline bool IsEqualValue(const base::Value& val1, const base::Value& val2) {
+ return val1.Equals(&val2);
+}
template <typename PropVal, typename T>
std::unique_ptr<const PropVal> make_prop_value(const T& value) {
@@ -56,4 +57,8 @@
} // namespace unittests
} // namespace buffet
+#define EXPECT_JSON_EQ(expected, actual) \
+ EXPECT_PRED2(buffet::unittests::IsEqualValue, \
+ *buffet::unittests::CreateValue(expected), actual)
+
#endif // BUFFET_COMMANDS_UNITTEST_UTILS_H_
diff --git a/buffet/device_registration_info_unittest.cc b/buffet/device_registration_info_unittest.cc
index f82a39b..1800da1 100644
--- a/buffet/device_registration_info_unittest.cc
+++ b/buffet/device_registration_info_unittest.cc
@@ -400,12 +400,29 @@
base::DictionaryValue* commandDefs = nullptr;
EXPECT_TRUE(json->GetDictionary("deviceDraft.commandDefs", &commandDefs));
EXPECT_FALSE(commandDefs->empty());
- EXPECT_EQ(
- "{'base':{'reboot':{'parameters':{"
- "'delay':{'minimum':10,'type':'integer'}}}},"
- "'robot':{'_jump':{'parameters':{"
- "'_height':{'type':'integer'}}}}}",
- unittests::ValueToString(commandDefs));
+
+ auto expected = R"({
+ 'base': {
+ 'reboot': {
+ 'parameters': {
+ 'delay': {
+ 'minimum': 10,
+ 'type': 'integer'
+ }
+ }
+ }
+ },
+ 'robot': {
+ '_jump': {
+ 'parameters': {
+ '_height': {
+ 'type': 'integer'
+ }
+ }
+ }
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *commandDefs);
base::DictionaryValue json_resp;
json_resp.SetString("id", test_data::kClaimTicketId);
diff --git a/buffet/states/state_manager_unittest.cc b/buffet/states/state_manager_unittest.cc
index 12d3845..d71ebb6 100644
--- a/buffet/states/state_manager_unittest.cc
+++ b/buffet/states/state_manager_unittest.cc
@@ -21,7 +21,6 @@
using testing::_;
using testing::Return;
using unittests::CreateDictionaryValue;
-using unittests::ValueToString;
namespace {
std::unique_ptr<base::DictionaryValue> GetTestSchema() {
@@ -53,16 +52,14 @@
// Initial expectations.
EXPECT_CALL(mock_state_change_queue_, IsEmpty()).Times(0);
EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(_, _))
- .Times(0);
+ .Times(0);
EXPECT_CALL(mock_state_change_queue_, GetAndClearRecordedStateChanges())
- .Times(0);
+ .Times(0);
mgr_.reset(new StateManager(&mock_state_change_queue_));
LoadStateDefinition(GetTestSchema().get(), "default", nullptr);
ASSERT_TRUE(mgr_->LoadStateDefaults(*GetTestValues().get(), nullptr));
}
- void TearDown() override {
- mgr_.reset();
- }
+ void TearDown() override { mgr_.reset(); }
void LoadStateDefinition(const base::DictionaryValue* json,
const std::string& category,
@@ -82,9 +79,16 @@
TEST_F(StateManagerTest, Initialized) {
EXPECT_EQ(std::set<std::string>{"default"}, mgr_->GetCategories());
- EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
- "'terminator':{'target':''}}",
- ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
+ auto expected = R"({
+ 'base': {
+ 'manufacturer': 'Skynet',
+ 'serialNumber': 'T1000'
+ },
+ 'terminator': {
+ 'target': ''
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson(nullptr));
}
TEST_F(StateManagerTest, LoadStateDefinition) {
@@ -96,27 +100,42 @@
LoadStateDefinition(dict.get(), "powerd", nullptr);
EXPECT_EQ((std::set<std::string>{"default", "powerd"}),
mgr_->GetCategories());
- EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
- "'power':{'battery_level':0},"
- "'terminator':{'target':''}}",
- ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
+
+ auto expected = R"({
+ 'base': {
+ 'manufacturer': 'Skynet',
+ 'serialNumber': 'T1000'
+ },
+ 'power': {
+ 'battery_level': 0
+ },
+ 'terminator': {
+ 'target': ''
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson(nullptr));
}
TEST_F(StateManagerTest, SetPropertyValue) {
native_types::Object expected_prop_set{
- {"terminator.target", unittests::make_string_prop_value("John Connor")},
+ {"terminator.target", unittests::make_string_prop_value("John Connor")},
};
base::Time timestamp = base::Time::Now();
EXPECT_CALL(mock_state_change_queue_,
NotifyPropertiesUpdated(timestamp, expected_prop_set))
.WillOnce(Return(true));
- ASSERT_TRUE(mgr_->SetPropertyValue("terminator.target",
- std::string{"John Connor"},
- timestamp,
- nullptr));
- EXPECT_EQ("{'base':{'manufacturer':'Skynet','serialNumber':'T1000'},"
- "'terminator':{'target':'John Connor'}}",
- ValueToString(mgr_->GetStateValuesAsJson(nullptr).get()));
+ ASSERT_TRUE(mgr_->SetPropertyValue(
+ "terminator.target", std::string{"John Connor"}, timestamp, nullptr));
+ auto expected = R"({
+ 'base': {
+ 'manufacturer': 'Skynet',
+ 'serialNumber': 'T1000'
+ },
+ 'terminator': {
+ 'target': 'John Connor'
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *mgr_->GetStateValuesAsJson(nullptr));
}
TEST_F(StateManagerTest, SetPropertyValue_Error_NoName) {
@@ -129,8 +148,8 @@
TEST_F(StateManagerTest, SetPropertyValue_Error_NoPackage) {
chromeos::ErrorPtr error;
- ASSERT_FALSE(mgr_->SetPropertyValue("target", int{0}, base::Time::Now(),
- &error));
+ ASSERT_FALSE(
+ mgr_->SetPropertyValue("target", int{0}, base::Time::Now(), &error));
EXPECT_EQ(errors::state::kDomain, error->GetDomain());
EXPECT_EQ(errors::state::kPackageNameMissing, error->GetCode());
EXPECT_EQ("Package name is missing in the property name",
@@ -139,8 +158,8 @@
TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownPackage) {
chromeos::ErrorPtr error;
- ASSERT_FALSE(mgr_->SetPropertyValue("power.level", int{0}, base::Time::Now(),
- &error));
+ ASSERT_FALSE(
+ mgr_->SetPropertyValue("power.level", int{0}, base::Time::Now(), &error));
EXPECT_EQ(errors::state::kDomain, error->GetDomain());
EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode());
EXPECT_EQ("Unknown state property package 'power'", error->GetMessage());
@@ -148,8 +167,8 @@
TEST_F(StateManagerTest, SetPropertyValue_Error_UnknownProperty) {
chromeos::ErrorPtr error;
- ASSERT_FALSE(mgr_->SetPropertyValue("base.level", int{0}, base::Time::Now(),
- &error));
+ ASSERT_FALSE(
+ mgr_->SetPropertyValue("base.level", int{0}, base::Time::Now(), &error));
EXPECT_EQ(errors::state::kDomain, error->GetDomain());
EXPECT_EQ(errors::state::kPropertyNotDefined, error->GetCode());
EXPECT_EQ("State property 'base.level' is not defined", error->GetMessage());
@@ -159,10 +178,8 @@
base::Time timestamp = base::Time::Now();
EXPECT_CALL(mock_state_change_queue_, NotifyPropertiesUpdated(timestamp, _))
.WillOnce(Return(true));
- ASSERT_TRUE(mgr_->SetPropertyValue("terminator.target",
- std::string{"John Connor"},
- timestamp,
- nullptr));
+ ASSERT_TRUE(mgr_->SetPropertyValue(
+ "terminator.target", std::string{"John Connor"}, timestamp, nullptr));
std::vector<StateChange> expected_val;
expected_val.emplace_back(
timestamp,
diff --git a/buffet/states/state_package_unittest.cc b/buffet/states/state_package_unittest.cc
index 7856531..179d206 100644
--- a/buffet/states/state_package_unittest.cc
+++ b/buffet/states/state_package_unittest.cc
@@ -18,7 +18,6 @@
namespace buffet {
using unittests::CreateDictionaryValue;
-using unittests::ValueToString;
class StatePackageTestHelper {
public:
@@ -86,16 +85,41 @@
ASSERT_TRUE(package.AddSchemaFromJson(GetTestSchema().get(), nullptr));
EXPECT_EQ(4, GetTypes(package).GetProps().size());
EXPECT_EQ(4, GetValues(package).size());
- EXPECT_EQ("{'color':{'type':'string'},"
- "'direction':{'additionalProperties':false,'properties':{"
- "'altitude':{'maximum':90.0,'type':'number'},"
- "'azimuth':{'type':'number'}},"
- "'type':'object'},"
- "'iso':{'enum':[50,100,200,400],'type':'integer'},"
- "'light':{'type':'boolean'}}",
- ValueToString(GetTypes(package).ToJson(true, nullptr).get()));
- EXPECT_EQ("{'color':'','direction':{},'iso':0,'light':false}",
- ValueToString(package.GetValuesAsJson(nullptr).get()));
+
+ auto expected = R"({
+ 'color': {
+ 'type': 'string'
+ },
+ 'direction': {
+ 'additionalProperties': false,
+ 'properties': {
+ 'altitude': {
+ 'maximum': 90.0,
+ 'type': 'number'
+ },
+ 'azimuth': {
+ 'type': 'number'
+ }
+ },
+ 'type': 'object'
+ },
+ 'iso': {
+ 'enum': [50, 100, 200, 400],
+ 'type': 'integer'
+ },
+ 'light': {
+ 'type': 'boolean'
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *GetTypes(package).ToJson(true, nullptr));
+
+ expected = R"({
+ 'color': '',
+ 'direction': {},
+ 'iso': 0,
+ 'light': false
+ })";
+ EXPECT_JSON_EQ(expected, *package.GetValuesAsJson(nullptr));
}
TEST(StatePackage, AddValuesFromJson_OnEmpty) {
@@ -103,11 +127,16 @@
ASSERT_TRUE(package.AddSchemaFromJson(GetTestSchema().get(), nullptr));
ASSERT_TRUE(package.AddValuesFromJson(GetTestValues().get(), nullptr));
EXPECT_EQ(4, GetValues(package).size());
- EXPECT_EQ("{'color':'white',"
- "'direction':{'altitude':89.9,'azimuth':57.2957795},"
- "'iso':200,"
- "'light':true}",
- ValueToString(package.GetValuesAsJson(nullptr).get()));
+ auto expected = R"({
+ 'color': 'white',
+ 'direction': {
+ 'altitude': 89.9,
+ 'azimuth': 57.2957795
+ },
+ 'iso': 200,
+ 'light': true
+ })";
+ EXPECT_JSON_EQ(expected, *package.GetValuesAsJson(nullptr));
}
TEST_F(StatePackageTest, AddSchemaFromJson_AddMore) {
@@ -115,21 +144,48 @@
ASSERT_TRUE(package_->AddSchemaFromJson(dict.get(), nullptr));
EXPECT_EQ(5, GetTypes(*package_).GetProps().size());
EXPECT_EQ(5, GetValues(*package_).size());
- EXPECT_EQ("{'brightness':{'enum':['low','medium','high'],'type':'string'},"
- "'color':{'type':'string'},"
- "'direction':{'additionalProperties':false,'properties':{"
- "'altitude':{'maximum':90.0,'type':'number'},"
- "'azimuth':{'type':'number'}},"
- "'type':'object'},"
- "'iso':{'enum':[50,100,200,400],'type':'integer'},"
- "'light':{'type':'boolean'}}",
- ValueToString(GetTypes(*package_).ToJson(true, nullptr).get()));
- EXPECT_EQ("{'brightness':'',"
- "'color':'white',"
- "'direction':{'altitude':89.9,'azimuth':57.2957795},"
- "'iso':200,"
- "'light':true}",
- ValueToString(package_->GetValuesAsJson(nullptr).get()));
+ auto expected = R"({
+ 'brightness': {
+ 'enum': ['low', 'medium', 'high'],
+ 'type': 'string'
+ },
+ 'color': {
+ 'type': 'string'
+ },
+ 'direction': {
+ 'additionalProperties': false,
+ 'properties': {
+ 'altitude': {
+ 'maximum': 90.0,
+ 'type': 'number'
+ },
+ 'azimuth': {
+ 'type': 'number'
+ }
+ },
+ 'type': 'object'
+ },
+ 'iso': {
+ 'enum': [50, 100, 200, 400],
+ 'type': 'integer'
+ },
+ 'light': {
+ 'type': 'boolean'
+ }
+ })";
+ EXPECT_JSON_EQ(expected, *GetTypes(*package_).ToJson(true, nullptr));
+
+ expected = R"({
+ 'brightness': '',
+ 'color': 'white',
+ 'direction': {
+ 'altitude': 89.9,
+ 'azimuth': 57.2957795
+ },
+ 'iso': 200,
+ 'light': true
+ })";
+ EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson(nullptr));
}
TEST_F(StatePackageTest, AddValuesFromJson_AddMore) {
@@ -138,12 +194,17 @@
dict = CreateDictionaryValue("{'brightness':'medium'}");
ASSERT_TRUE(package_->AddValuesFromJson(dict.get(), nullptr));
EXPECT_EQ(5, GetValues(*package_).size());
- EXPECT_EQ("{'brightness':'medium',"
- "'color':'white',"
- "'direction':{'altitude':89.9,'azimuth':57.2957795},"
- "'iso':200,"
- "'light':true}",
- ValueToString(package_->GetValuesAsJson(nullptr).get()));
+ auto expected = R"({
+ 'brightness': 'medium',
+ 'color': 'white',
+ 'direction': {
+ 'altitude': 89.9,
+ 'azimuth': 57.2957795
+ },
+ 'iso': 200,
+ 'light': true
+ })";
+ EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson(nullptr));
}
TEST_F(StatePackageTest, AddSchemaFromJson_Error_Redefined) {
@@ -214,11 +275,17 @@
{"azimuth", double{15.0}},
};
EXPECT_TRUE(package_->SetPropertyValue("direction", direction, nullptr));
- EXPECT_EQ("{'color':'white',"
- "'direction':{'altitude':45.0,'azimuth':15.0},"
- "'iso':200,"
- "'light':true}",
- ValueToString(package_->GetValuesAsJson(nullptr).get()));
+
+ auto expected = R"({
+ 'color': 'white',
+ 'direction': {
+ 'altitude': 45.0,
+ 'azimuth': 15.0
+ },
+ 'iso': 200,
+ 'light': true
+ })";
+ EXPECT_JSON_EQ(expected, *package_->GetValuesAsJson(nullptr));
}
TEST_F(StatePackageTest, SetPropertyValue_Error_TypeMismatch) {