// Copyright 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include namespace brillo { namespace { std::unique_ptr ParseValue(std::string json) { std::replace(json.begin(), json.end(), '\'', '"'); std::string message; auto value = base::JSONReader::ReadAndReturnError(json, base::JSON_PARSE_RFC, nullptr, &message); CHECK(value) << "Failed to load JSON: " << message << ", " << json; return value; } inline bool IsEqualValue(const base::Value& val1, const base::Value& val2) { return val1.Equals(&val2); } #define EXPECT_JSON_EQ(expected, actual) \ EXPECT_PRED2(IsEqualValue, *ParseValue(expected), actual) } // namespace TEST(ValueConversionTest, FromValueInt) { int actual; EXPECT_TRUE(FromValue(*ParseValue("123"), &actual)); EXPECT_EQ(123, actual); EXPECT_TRUE(FromValue(*ParseValue("-123"), &actual)); EXPECT_EQ(-123, actual); EXPECT_FALSE(FromValue(*ParseValue("true"), &actual)); } TEST(ValueConversionTest, FromValueBool) { bool actual; EXPECT_TRUE(FromValue(*ParseValue("false"), &actual)); EXPECT_FALSE(actual); EXPECT_TRUE(FromValue(*ParseValue("true"), &actual)); EXPECT_TRUE(actual); EXPECT_FALSE(FromValue(*ParseValue("0"), &actual)); EXPECT_FALSE(FromValue(*ParseValue("1"), &actual)); } TEST(ValueConversionTest, FromValueDouble) { double actual; EXPECT_TRUE(FromValue(*ParseValue("12.5"), &actual)); EXPECT_DOUBLE_EQ(12.5, actual); EXPECT_TRUE(FromValue(*ParseValue("-0.1"), &actual)); EXPECT_DOUBLE_EQ(-0.1, actual); EXPECT_TRUE(FromValue(*ParseValue("17"), &actual)); EXPECT_DOUBLE_EQ(17.0, actual); EXPECT_FALSE(FromValue(*ParseValue("'1.0'"), &actual)); } TEST(ValueConversionTest, FromValueString) { std::string actual; EXPECT_TRUE(FromValue(*ParseValue("'foo'"), &actual)); EXPECT_EQ("foo", actual); EXPECT_TRUE(FromValue(*ParseValue("'bar'"), &actual)); EXPECT_EQ("bar", actual); EXPECT_TRUE(FromValue(*ParseValue("''"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("1"), &actual)); } TEST(ValueConversionTest, FromValueListValue) { const base::ListValue* list = nullptr; auto in_value = ParseValue("[1, 2, 'foo']"); EXPECT_TRUE(FromValue(*in_value, &list)); EXPECT_JSON_EQ("[1, 2, 'foo']", *list); } TEST(ValueConversionTest, FromValueDictValue) { const base::DictionaryValue* dict = nullptr; auto in_value = ParseValue("{'foo':'bar','baz': 1}"); EXPECT_TRUE(FromValue(*in_value, &dict)); EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict); } TEST(ValueConversionTest, FromValueListValueUniquePtr) { std::unique_ptr list; EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 'bar']"), &list)); EXPECT_JSON_EQ("[1, 2, 'bar']", *list); } TEST(ValueConversionTest, FromValueDictValueUniquePtr) { std::unique_ptr dict; EXPECT_TRUE(FromValue(*ParseValue("{'foo':'bar','baz': 1}"), &dict)); EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict); } TEST(ValueConversionTest, FromValueVectorOfInt) { std::vector actual; EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 3, 4]"), &actual)); EXPECT_EQ((std::vector{1, 2, 3, 4}), actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("[1, 2, 3, '4']"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfBool) { std::vector actual; EXPECT_TRUE(FromValue(*ParseValue("[true, true, false]"), &actual)); EXPECT_EQ((std::vector{true, true, false}), actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("[true, 0]"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfDouble) { std::vector actual; EXPECT_TRUE(FromValue(*ParseValue("[1, 2.0, 6.5, -11.2]"), &actual)); EXPECT_EQ((std::vector{1.0, 2.0, 6.5, -11.2}), actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("['s']"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfString) { std::vector actual; EXPECT_TRUE(FromValue(*ParseValue("['', 'foo', 'bar']"), &actual)); EXPECT_EQ((std::vector{"", "foo", "bar"}), actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfVectors) { std::vector> actual; EXPECT_TRUE(FromValue(*ParseValue("[[1,2], [], [3]]"), &actual)); EXPECT_EQ((std::vector>{{1, 2}, {}, {3}}), actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual)); } TEST(ValueConversionTest, FromValueMap) { std::map actual; EXPECT_TRUE(FromValue(*ParseValue("{'foo':1, 'bar':2, 'baz':3}"), &actual)); EXPECT_EQ((std::map{{"foo", 1}, {"bar", 2}, {"baz", 3}}), actual); EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("{'foo':1, 'bar':'2'}"), &actual)); } TEST(ValueConversionTest, FromValueMapOfVectors) { std::map> actual; EXPECT_TRUE(FromValue(*ParseValue("{'foo':[1,2], 'bar':[]}"), &actual)); std::map> expected{ {"foo", {1, 2}}, {"bar", {}}}; EXPECT_EQ(expected, actual); EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("{'foo':[1], 'bar':[2,'3']}"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfMaps) { std::vector> actual; EXPECT_TRUE(FromValue(*ParseValue("[{'foo':1,'bar':2},{'baz':3}]"), &actual)); std::vector> expected{ {{"foo", 1}, {"bar", 2}}, {{"baz", 3}}}; EXPECT_EQ(expected, actual); EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); EXPECT_TRUE(actual.empty()); EXPECT_FALSE(FromValue(*ParseValue("[{'foo':1}, 'bar']"), &actual)); } TEST(ValueConversionTest, FromValueVectorOfLists) { std::vector> actual; EXPECT_TRUE(FromValue(*ParseValue("[['foo',1],['bar',2],[true]]"), &actual)); ASSERT_EQ(3, actual.size()); EXPECT_JSON_EQ("['foo', 1]", *actual[0]); EXPECT_JSON_EQ("['bar', 2]", *actual[1]); EXPECT_JSON_EQ("[true]", *actual[2]); } TEST(ValueConversionTest, FromValueVectorOfDicts) { std::vector> actual; EXPECT_TRUE(FromValue(*ParseValue("[{'foo': 1}, {'bar': 2}]"), &actual)); ASSERT_EQ(2, actual.size()); EXPECT_JSON_EQ("{'foo': 1}", *actual[0]); EXPECT_JSON_EQ("{'bar': 2}", *actual[1]); } TEST(ValueConversionTest, ToValueScalar) { EXPECT_JSON_EQ("1234", *ToValue(1234)); EXPECT_JSON_EQ("true", *ToValue(true)); EXPECT_JSON_EQ("false", *ToValue(false)); EXPECT_JSON_EQ("12.5", *ToValue(12.5)); EXPECT_JSON_EQ("'foobar'", *ToValue("foobar")); } TEST(ValueConversionTest, ToValueVector) { EXPECT_JSON_EQ("[1, 2, 3]", *ToValue(std::vector{1, 2, 3})); EXPECT_JSON_EQ("[]", *ToValue(std::vector{})); EXPECT_JSON_EQ("[true, false]", *ToValue(std::vector{true, false})); EXPECT_JSON_EQ("['foo', 'bar']", *ToValue(std::vector{"foo", "bar"})); EXPECT_JSON_EQ("[[1,2],[3]]", *ToValue(std::vector>{{1, 2}, {3}})); } TEST(ValueConversionTest, ToValueMap) { EXPECT_JSON_EQ("{'foo': 1, 'bar': 2}", *ToValue(std::map{{"foo", 1}, {"bar", 2}})); EXPECT_JSON_EQ("{}", *ToValue(std::map{})); EXPECT_JSON_EQ("{'foo': true}", *ToValue(std::map{{"foo", true}})); EXPECT_JSON_EQ("{'foo': 1.1, 'bar': 2.2}", *ToValue(std::map{{"foo", 1.1}, {"bar", 2.2}})); } } // namespace brillo