1// Copyright 2015 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15#include <brillo/value_conversion.h> 16 17#include <algorithm> 18#include <limits> 19#include <memory> 20#include <string> 21#include <vector> 22 23#include <base/json/json_reader.h> 24#include <base/json/json_writer.h> 25#include <gtest/gtest.h> 26 27namespace brillo { 28 29namespace { 30 31std::unique_ptr<base::Value> ParseValue(std::string json) { 32 std::replace(json.begin(), json.end(), '\'', '"'); 33 std::string message; 34 auto value = base::JSONReader::ReadAndReturnError(json, base::JSON_PARSE_RFC, 35 nullptr, &message); 36 CHECK(value) << "Failed to load JSON: " << message << ", " << json; 37 return value; 38} 39 40inline bool IsEqualValue(const base::Value& val1, const base::Value& val2) { 41 return val1.Equals(&val2); 42} 43 44#define EXPECT_JSON_EQ(expected, actual) \ 45 EXPECT_PRED2(IsEqualValue, *ParseValue(expected), actual) 46 47} // namespace 48 49TEST(ValueConversionTest, FromValueInt) { 50 int actual; 51 EXPECT_TRUE(FromValue(*ParseValue("123"), &actual)); 52 EXPECT_EQ(123, actual); 53 54 EXPECT_TRUE(FromValue(*ParseValue("-123"), &actual)); 55 EXPECT_EQ(-123, actual); 56 57 EXPECT_FALSE(FromValue(*ParseValue("true"), &actual)); 58} 59 60TEST(ValueConversionTest, FromValueBool) { 61 bool actual; 62 EXPECT_TRUE(FromValue(*ParseValue("false"), &actual)); 63 EXPECT_FALSE(actual); 64 65 EXPECT_TRUE(FromValue(*ParseValue("true"), &actual)); 66 EXPECT_TRUE(actual); 67 68 EXPECT_FALSE(FromValue(*ParseValue("0"), &actual)); 69 EXPECT_FALSE(FromValue(*ParseValue("1"), &actual)); 70} 71 72TEST(ValueConversionTest, FromValueDouble) { 73 double actual; 74 EXPECT_TRUE(FromValue(*ParseValue("12.5"), &actual)); 75 EXPECT_DOUBLE_EQ(12.5, actual); 76 77 EXPECT_TRUE(FromValue(*ParseValue("-0.1"), &actual)); 78 EXPECT_DOUBLE_EQ(-0.1, actual); 79 80 EXPECT_TRUE(FromValue(*ParseValue("17"), &actual)); 81 EXPECT_DOUBLE_EQ(17.0, actual); 82 83 EXPECT_FALSE(FromValue(*ParseValue("'1.0'"), &actual)); 84} 85 86TEST(ValueConversionTest, FromValueString) { 87 std::string actual; 88 EXPECT_TRUE(FromValue(*ParseValue("'foo'"), &actual)); 89 EXPECT_EQ("foo", actual); 90 91 EXPECT_TRUE(FromValue(*ParseValue("'bar'"), &actual)); 92 EXPECT_EQ("bar", actual); 93 94 EXPECT_TRUE(FromValue(*ParseValue("''"), &actual)); 95 EXPECT_TRUE(actual.empty()); 96 97 EXPECT_FALSE(FromValue(*ParseValue("1"), &actual)); 98} 99 100TEST(ValueConversionTest, FromValueListValue) { 101 const base::ListValue* list = nullptr; 102 auto in_value = ParseValue("[1, 2, 'foo']"); 103 EXPECT_TRUE(FromValue(*in_value, &list)); 104 EXPECT_JSON_EQ("[1, 2, 'foo']", *list); 105} 106 107TEST(ValueConversionTest, FromValueDictValue) { 108 const base::DictionaryValue* dict = nullptr; 109 auto in_value = ParseValue("{'foo':'bar','baz': 1}"); 110 EXPECT_TRUE(FromValue(*in_value, &dict)); 111 EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict); 112} 113 114TEST(ValueConversionTest, FromValueListValueUniquePtr) { 115 std::unique_ptr<base::ListValue> list; 116 EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 'bar']"), &list)); 117 EXPECT_JSON_EQ("[1, 2, 'bar']", *list); 118} 119 120TEST(ValueConversionTest, FromValueDictValueUniquePtr) { 121 std::unique_ptr<base::DictionaryValue> dict; 122 EXPECT_TRUE(FromValue(*ParseValue("{'foo':'bar','baz': 1}"), &dict)); 123 EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict); 124} 125 126TEST(ValueConversionTest, FromValueVectorOfInt) { 127 std::vector<int> actual; 128 EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 3, 4]"), &actual)); 129 EXPECT_EQ((std::vector<int>{1, 2, 3, 4}), actual); 130 131 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 132 EXPECT_TRUE(actual.empty()); 133 134 EXPECT_FALSE(FromValue(*ParseValue("[1, 2, 3, '4']"), &actual)); 135} 136 137TEST(ValueConversionTest, FromValueVectorOfBool) { 138 std::vector<bool> actual; 139 EXPECT_TRUE(FromValue(*ParseValue("[true, true, false]"), &actual)); 140 EXPECT_EQ((std::vector<bool>{true, true, false}), actual); 141 142 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 143 EXPECT_TRUE(actual.empty()); 144 145 EXPECT_FALSE(FromValue(*ParseValue("[true, 0]"), &actual)); 146} 147 148TEST(ValueConversionTest, FromValueVectorOfDouble) { 149 std::vector<double> actual; 150 EXPECT_TRUE(FromValue(*ParseValue("[1, 2.0, 6.5, -11.2]"), &actual)); 151 EXPECT_EQ((std::vector<double>{1.0, 2.0, 6.5, -11.2}), actual); 152 153 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 154 EXPECT_TRUE(actual.empty()); 155 156 EXPECT_FALSE(FromValue(*ParseValue("['s']"), &actual)); 157} 158 159TEST(ValueConversionTest, FromValueVectorOfString) { 160 std::vector<std::string> actual; 161 EXPECT_TRUE(FromValue(*ParseValue("['', 'foo', 'bar']"), &actual)); 162 EXPECT_EQ((std::vector<std::string>{"", "foo", "bar"}), actual); 163 164 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 165 EXPECT_TRUE(actual.empty()); 166 167 EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual)); 168} 169 170TEST(ValueConversionTest, FromValueVectorOfVectors) { 171 std::vector<std::vector<int>> actual; 172 EXPECT_TRUE(FromValue(*ParseValue("[[1,2], [], [3]]"), &actual)); 173 EXPECT_EQ((std::vector<std::vector<int>>{{1,2}, {}, {3}}), actual); 174 175 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 176 EXPECT_TRUE(actual.empty()); 177 178 EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual)); 179} 180 181TEST(ValueConversionTest, FromValueMap) { 182 std::map<std::string, int> actual; 183 EXPECT_TRUE(FromValue(*ParseValue("{'foo':1, 'bar':2, 'baz':3}"), &actual)); 184 EXPECT_EQ((std::map<std::string, int>{{"foo", 1}, {"bar", 2}, {"baz", 3}}), 185 actual); 186 187 EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual)); 188 EXPECT_TRUE(actual.empty()); 189 190 EXPECT_FALSE(FromValue(*ParseValue("{'foo':1, 'bar':'2'}"), &actual)); 191} 192 193TEST(ValueConversionTest, FromValueMapOfVectors) { 194 std::map<std::string, std::vector<int>> actual; 195 EXPECT_TRUE(FromValue(*ParseValue("{'foo':[1,2], 'bar':[]}"), &actual)); 196 std::map<std::string, std::vector<int>> expected{ 197 {"foo", {1, 2}}, {"bar", {}}}; 198 EXPECT_EQ(expected, actual); 199 200 EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual)); 201 EXPECT_TRUE(actual.empty()); 202 203 EXPECT_FALSE(FromValue(*ParseValue("{'foo':[1], 'bar':[2,'3']}"), &actual)); 204} 205 206TEST(ValueConversionTest, FromValueVectorOfMaps) { 207 std::vector<std::map<std::string, int>> actual; 208 EXPECT_TRUE(FromValue(*ParseValue("[{'foo':1,'bar':2},{'baz':3}]"), &actual)); 209 std::vector<std::map<std::string, int>> expected{ 210 {{"foo", 1}, {"bar", 2}}, {{"baz", 3}}}; 211 EXPECT_EQ(expected, actual); 212 213 EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual)); 214 EXPECT_TRUE(actual.empty()); 215 216 EXPECT_FALSE(FromValue(*ParseValue("[{'foo':1}, 'bar']"), &actual)); 217} 218 219TEST(ValueConversionTest, FromValueVectorOfLists) { 220 std::vector<std::unique_ptr<base::ListValue>> actual; 221 EXPECT_TRUE(FromValue(*ParseValue("[['foo',1],['bar',2],[true]]"), &actual)); 222 ASSERT_EQ(3, actual.size()); 223 EXPECT_JSON_EQ("['foo', 1]", *actual[0]); 224 EXPECT_JSON_EQ("['bar', 2]", *actual[1]); 225 EXPECT_JSON_EQ("[true]", *actual[2]); 226} 227 228TEST(ValueConversionTest, FromValueVectorOfDicts) { 229 std::vector<std::unique_ptr<base::DictionaryValue>> actual; 230 EXPECT_TRUE(FromValue(*ParseValue("[{'foo': 1}, {'bar': 2}]"), &actual)); 231 ASSERT_EQ(2, actual.size()); 232 EXPECT_JSON_EQ("{'foo': 1}", *actual[0]); 233 EXPECT_JSON_EQ("{'bar': 2}", *actual[1]); 234} 235 236TEST(ValueConversionTest, ToValueScalar) { 237 EXPECT_JSON_EQ("1234", *ToValue(1234)); 238 EXPECT_JSON_EQ("true", *ToValue(true)); 239 EXPECT_JSON_EQ("false", *ToValue(false)); 240 EXPECT_JSON_EQ("12.5", *ToValue(12.5)); 241 EXPECT_JSON_EQ("'foobar'", *ToValue("foobar")); 242} 243 244TEST(ValueConversionTest, ToValueVector) { 245 EXPECT_JSON_EQ("[1, 2, 3]", *ToValue(std::vector<int>{1, 2, 3})); 246 EXPECT_JSON_EQ("[]", *ToValue(std::vector<int>{})); 247 EXPECT_JSON_EQ("[true, false]", *ToValue(std::vector<bool>{true, false})); 248 EXPECT_JSON_EQ("['foo', 'bar']", 249 *ToValue(std::vector<std::string>{"foo", "bar"})); 250 EXPECT_JSON_EQ("[[1,2],[3]]", 251 *ToValue(std::vector<std::vector<int>>{{1, 2}, {3}})); 252} 253 254TEST(ValueConversionTest, ToValueMap) { 255 EXPECT_JSON_EQ("{'foo': 1, 'bar': 2}", 256 *ToValue(std::map<std::string, int>{{"foo", 1}, {"bar", 2}})); 257 EXPECT_JSON_EQ("{}", *ToValue(std::map<std::string, int>{})); 258 EXPECT_JSON_EQ("{'foo': true}", 259 *ToValue(std::map<std::string, bool>{{"foo", true}})); 260 EXPECT_JSON_EQ("{'foo': 1.1, 'bar': 2.2}", 261 *ToValue(std::map<std::string, double>{{"foo", 1.1}, 262 {"bar", 2.2}})); 263} 264 265} // namespace brillo 266