Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2009 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/base/json.h"
     12 
     13 #include <vector>
     14 
     15 #include "webrtc/base/gunit.h"
     16 
     17 namespace rtc {
     18 
     19 static Json::Value in_s("foo");
     20 static Json::Value in_sn("99");
     21 static Json::Value in_si("-99");
     22 static Json::Value in_sb("true");
     23 static Json::Value in_sd("1.2");
     24 static Json::Value in_n(12);
     25 static Json::Value in_i(-12);
     26 static Json::Value in_u(34U);
     27 static Json::Value in_b(true);
     28 static Json::Value in_d(1.2);
     29 static Json::Value big_sn("12345678901234567890");
     30 static Json::Value big_si("-12345678901234567890");
     31 static Json::Value big_u(0xFFFFFFFF);
     32 static Json::Value bad_a(Json::arrayValue);
     33 static Json::Value bad_o(Json::objectValue);
     34 
     35 TEST(JsonTest, GetString) {
     36   std::string out;
     37   EXPECT_TRUE(GetStringFromJson(in_s, &out));
     38   EXPECT_EQ("foo", out);
     39   EXPECT_TRUE(GetStringFromJson(in_sn, &out));
     40   EXPECT_EQ("99", out);
     41   EXPECT_TRUE(GetStringFromJson(in_si, &out));
     42   EXPECT_EQ("-99", out);
     43   EXPECT_TRUE(GetStringFromJson(in_i, &out));
     44   EXPECT_EQ("-12", out);
     45   EXPECT_TRUE(GetStringFromJson(in_n, &out));
     46   EXPECT_EQ("12", out);
     47   EXPECT_TRUE(GetStringFromJson(in_u, &out));
     48   EXPECT_EQ("34", out);
     49   EXPECT_TRUE(GetStringFromJson(in_b, &out));
     50   EXPECT_EQ("true", out);
     51   // Not supported here yet.
     52   EXPECT_FALSE(GetStringFromJson(bad_a, &out));
     53   EXPECT_FALSE(GetStringFromJson(bad_o, &out));
     54 }
     55 
     56 TEST(JsonTest, GetInt) {
     57   int out;
     58   EXPECT_TRUE(GetIntFromJson(in_sn, &out));
     59   EXPECT_EQ(99, out);
     60   EXPECT_TRUE(GetIntFromJson(in_si, &out));
     61   EXPECT_EQ(-99, out);
     62   EXPECT_TRUE(GetIntFromJson(in_n, &out));
     63   EXPECT_EQ(12, out);
     64   EXPECT_TRUE(GetIntFromJson(in_i, &out));
     65   EXPECT_EQ(-12, out);
     66   EXPECT_TRUE(GetIntFromJson(in_u, &out));
     67   EXPECT_EQ(34, out);
     68   EXPECT_TRUE(GetIntFromJson(in_b, &out));
     69   EXPECT_EQ(1, out);
     70   EXPECT_FALSE(GetIntFromJson(in_s, &out));
     71   EXPECT_FALSE(GetIntFromJson(big_sn, &out));
     72   EXPECT_FALSE(GetIntFromJson(big_si, &out));
     73   EXPECT_FALSE(GetIntFromJson(big_u, &out));
     74   EXPECT_FALSE(GetIntFromJson(bad_a, &out));
     75   EXPECT_FALSE(GetIntFromJson(bad_o, &out));
     76 }
     77 
     78 TEST(JsonTest, GetUInt) {
     79   unsigned int out;
     80   EXPECT_TRUE(GetUIntFromJson(in_sn, &out));
     81   EXPECT_EQ(99U, out);
     82   EXPECT_TRUE(GetUIntFromJson(in_n, &out));
     83   EXPECT_EQ(12U, out);
     84   EXPECT_TRUE(GetUIntFromJson(in_u, &out));
     85   EXPECT_EQ(34U, out);
     86   EXPECT_TRUE(GetUIntFromJson(in_b, &out));
     87   EXPECT_EQ(1U, out);
     88   EXPECT_TRUE(GetUIntFromJson(big_u, &out));
     89   EXPECT_EQ(0xFFFFFFFFU, out);
     90   EXPECT_FALSE(GetUIntFromJson(in_s, &out));
     91   // TODO: Fail reading negative strings.
     92   // EXPECT_FALSE(GetUIntFromJson(in_si, &out));
     93   EXPECT_FALSE(GetUIntFromJson(in_i, &out));
     94   EXPECT_FALSE(GetUIntFromJson(big_sn, &out));
     95   EXPECT_FALSE(GetUIntFromJson(big_si, &out));
     96   EXPECT_FALSE(GetUIntFromJson(bad_a, &out));
     97   EXPECT_FALSE(GetUIntFromJson(bad_o, &out));
     98 }
     99 
    100 TEST(JsonTest, GetBool) {
    101   bool out;
    102   EXPECT_TRUE(GetBoolFromJson(in_sb, &out));
    103   EXPECT_EQ(true, out);
    104   EXPECT_TRUE(GetBoolFromJson(in_n, &out));
    105   EXPECT_EQ(true, out);
    106   EXPECT_TRUE(GetBoolFromJson(in_i, &out));
    107   EXPECT_EQ(true, out);
    108   EXPECT_TRUE(GetBoolFromJson(in_u, &out));
    109   EXPECT_EQ(true, out);
    110   EXPECT_TRUE(GetBoolFromJson(in_b, &out));
    111   EXPECT_EQ(true, out);
    112   EXPECT_TRUE(GetBoolFromJson(big_u, &out));
    113   EXPECT_EQ(true, out);
    114   EXPECT_FALSE(GetBoolFromJson(in_s, &out));
    115   EXPECT_FALSE(GetBoolFromJson(in_sn, &out));
    116   EXPECT_FALSE(GetBoolFromJson(in_si, &out));
    117   EXPECT_FALSE(GetBoolFromJson(big_sn, &out));
    118   EXPECT_FALSE(GetBoolFromJson(big_si, &out));
    119   EXPECT_FALSE(GetBoolFromJson(bad_a, &out));
    120   EXPECT_FALSE(GetBoolFromJson(bad_o, &out));
    121 }
    122 
    123 TEST(JsonTest, GetDouble) {
    124   double out;
    125   EXPECT_TRUE(GetDoubleFromJson(in_sn, &out));
    126   EXPECT_EQ(99, out);
    127   EXPECT_TRUE(GetDoubleFromJson(in_si, &out));
    128   EXPECT_EQ(-99, out);
    129   EXPECT_TRUE(GetDoubleFromJson(in_sd, &out));
    130   EXPECT_EQ(1.2, out);
    131   EXPECT_TRUE(GetDoubleFromJson(in_n, &out));
    132   EXPECT_EQ(12, out);
    133   EXPECT_TRUE(GetDoubleFromJson(in_i, &out));
    134   EXPECT_EQ(-12, out);
    135   EXPECT_TRUE(GetDoubleFromJson(in_u, &out));
    136   EXPECT_EQ(34, out);
    137   EXPECT_TRUE(GetDoubleFromJson(in_b, &out));
    138   EXPECT_EQ(1, out);
    139   EXPECT_TRUE(GetDoubleFromJson(in_d, &out));
    140   EXPECT_EQ(1.2, out);
    141   EXPECT_FALSE(GetDoubleFromJson(in_s, &out));
    142 }
    143 
    144 TEST(JsonTest, GetFromArray) {
    145   Json::Value a, out;
    146   a.append(in_s);
    147   a.append(in_i);
    148   a.append(in_u);
    149   a.append(in_b);
    150   EXPECT_TRUE(GetValueFromJsonArray(a, 0, &out));
    151   EXPECT_TRUE(GetValueFromJsonArray(a, 3, &out));
    152   EXPECT_FALSE(GetValueFromJsonArray(a, 99, &out));
    153   EXPECT_FALSE(GetValueFromJsonArray(a, 0xFFFFFFFF, &out));
    154 }
    155 
    156 TEST(JsonTest, GetFromObject) {
    157   Json::Value o, out;
    158   o["string"] = in_s;
    159   o["int"] = in_i;
    160   o["uint"] = in_u;
    161   o["bool"] = in_b;
    162   EXPECT_TRUE(GetValueFromJsonObject(o, "int", &out));
    163   EXPECT_TRUE(GetValueFromJsonObject(o, "bool", &out));
    164   EXPECT_FALSE(GetValueFromJsonObject(o, "foo", &out));
    165   EXPECT_FALSE(GetValueFromJsonObject(o, "", &out));
    166 }
    167 
    168 namespace {
    169 template <typename T>
    170 std::vector<T> VecOf3(const T& a, const T& b, const T& c) {
    171   std::vector<T> in;
    172   in.push_back(a);
    173   in.push_back(b);
    174   in.push_back(c);
    175   return in;
    176 }
    177 template <typename T>
    178 Json::Value JsonVecOf3(const T& a, const T& b, const T& c) {
    179   Json::Value in(Json::arrayValue);
    180   in.append(a);
    181   in.append(b);
    182   in.append(c);
    183   return in;
    184 }
    185 }  // unnamed namespace
    186 
    187 TEST(JsonTest, ValueVectorToFromArray) {
    188   std::vector<Json::Value> in = VecOf3<Json::Value>("a", "b", "c");
    189   Json::Value out = ValueVectorToJsonArray(in);
    190   EXPECT_EQ(in.size(), out.size());
    191   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    192     EXPECT_EQ(in[i].asString(), out[i].asString());
    193   }
    194   Json::Value inj = JsonVecOf3<Json::Value>("a", "b", "c");
    195   EXPECT_EQ(inj, out);
    196   std::vector<Json::Value> outj;
    197   EXPECT_TRUE(JsonArrayToValueVector(inj, &outj));
    198   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    199     EXPECT_EQ(in[i], outj[i]);
    200   }
    201 }
    202 
    203 TEST(JsonTest, IntVectorToFromArray) {
    204   std::vector<int> in = VecOf3<int>(1, 2, 3);
    205   Json::Value out = IntVectorToJsonArray(in);
    206   EXPECT_EQ(in.size(), out.size());
    207   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    208     EXPECT_EQ(in[i], out[i].asInt());
    209   }
    210   Json::Value inj = JsonVecOf3<int>(1, 2, 3);
    211   EXPECT_EQ(inj, out);
    212   std::vector<int> outj;
    213   EXPECT_TRUE(JsonArrayToIntVector(inj, &outj));
    214   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    215     EXPECT_EQ(in[i], outj[i]);
    216   }
    217 }
    218 
    219 TEST(JsonTest, UIntVectorToFromArray) {
    220   std::vector<unsigned int> in = VecOf3<unsigned int>(1, 2, 3);
    221   Json::Value out = UIntVectorToJsonArray(in);
    222   EXPECT_EQ(in.size(), out.size());
    223   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    224     EXPECT_EQ(in[i], out[i].asUInt());
    225   }
    226   Json::Value inj = JsonVecOf3<unsigned int>(1, 2, 3);
    227   EXPECT_EQ(inj, out);
    228   std::vector<unsigned int> outj;
    229   EXPECT_TRUE(JsonArrayToUIntVector(inj, &outj));
    230   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    231     EXPECT_EQ(in[i], outj[i]);
    232   }
    233 }
    234 
    235 TEST(JsonTest, StringVectorToFromArray) {
    236   std::vector<std::string> in = VecOf3<std::string>("a", "b", "c");
    237   Json::Value out = StringVectorToJsonArray(in);
    238   EXPECT_EQ(in.size(), out.size());
    239   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    240     EXPECT_EQ(in[i], out[i].asString());
    241   }
    242   Json::Value inj = JsonVecOf3<std::string>("a", "b", "c");
    243   EXPECT_EQ(inj, out);
    244   std::vector<std::string> outj;
    245   EXPECT_TRUE(JsonArrayToStringVector(inj, &outj));
    246   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    247     EXPECT_EQ(in[i], outj[i]);
    248   }
    249 }
    250 
    251 TEST(JsonTest, BoolVectorToFromArray) {
    252   std::vector<bool> in = VecOf3<bool>(false, true, false);
    253   Json::Value out = BoolVectorToJsonArray(in);
    254   EXPECT_EQ(in.size(), out.size());
    255   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    256     EXPECT_EQ(in[i], out[i].asBool());
    257   }
    258   Json::Value inj = JsonVecOf3<bool>(false, true, false);
    259   EXPECT_EQ(inj, out);
    260   std::vector<bool> outj;
    261   EXPECT_TRUE(JsonArrayToBoolVector(inj, &outj));
    262   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    263     EXPECT_EQ(in[i], outj[i]);
    264   }
    265 }
    266 
    267 TEST(JsonTest, DoubleVectorToFromArray) {
    268   std::vector<double> in = VecOf3<double>(1.0, 2.0, 3.0);
    269   Json::Value out = DoubleVectorToJsonArray(in);
    270   EXPECT_EQ(in.size(), out.size());
    271   for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
    272     EXPECT_EQ(in[i], out[i].asDouble());
    273   }
    274   Json::Value inj = JsonVecOf3<double>(1.0, 2.0, 3.0);
    275   EXPECT_EQ(inj, out);
    276   std::vector<double> outj;
    277   EXPECT_TRUE(JsonArrayToDoubleVector(inj, &outj));
    278   for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    279     EXPECT_EQ(in[i], outj[i]);
    280   }
    281 }
    282 
    283 }  // namespace rtc
    284