5 #include "sw/device/lib/ujson/ujson.h"
7 #include <gtest/gtest.h>
10 #include "sw/device/lib/base/status.h"
11 #include "sw/device/lib/ujson/test_helpers.h"
17 SourceSink ss(
"abc123");
20 EXPECT_EQ(ujson_getc(&uj).value,
'a');
21 EXPECT_EQ(ujson_getc(&uj).value,
'b');
22 EXPECT_EQ(ujson_getc(&uj).value,
'c');
23 EXPECT_EQ(status_err(ujson_ungetc(&uj,
'd')), kOk);
24 EXPECT_EQ(ujson_getc(&uj).value,
'd');
25 EXPECT_EQ(ujson_getc(&uj).value,
'1');
26 EXPECT_EQ(ujson_getc(&uj).value,
'2');
27 EXPECT_EQ(ujson_getc(&uj).value,
'3');
28 EXPECT_EQ(status_err(ujson_getc(&uj)), kResourceExhausted);
35 EXPECT_TRUE(status_ok(ujson_putbuf(&uj,
"abc", 3)));
36 EXPECT_TRUE(status_ok(ujson_putbuf(&uj,
"123", 3)));
37 EXPECT_EQ(ss.Sink(),
"abc123");
40 TEST(UJson, Consume) {
41 SourceSink ss(
" \t\r\nax");
44 EXPECT_EQ(status_err(ujson_consume(&uj,
'a')), kOk);
45 EXPECT_EQ(status_err(ujson_consume(&uj,
'b')), kNotFound);
48 TEST(UJson, ParseQuotedString) {
56 s = ujson_parse_qs(&uj, buf,
sizeof(buf));
57 EXPECT_TRUE(status_ok(s));
58 EXPECT_EQ(s.value, 13);
59 std::string vala(buf);
60 EXPECT_EQ(vala,
"Hello World\r\n");
63 s = ujson_parse_qs(&uj, buf, 6);
64 EXPECT_TRUE(status_ok(s));
65 EXPECT_EQ(s.value, 5);
66 std::string valb(buf);
67 EXPECT_EQ(valb,
"Hello");
70 TEST(UJson, ParseQuotedStringInvalidString) {
76 s = ujson_parse_qs(&uj, buf,
sizeof(buf));
77 EXPECT_EQ(status_err(s), kNotFound);
80 TEST(UJson, ParseQuotedStringShortBuffer) {
81 SourceSink ss(
"\"abc");
86 s = ujson_parse_qs(&uj, buf,
sizeof(buf));
87 EXPECT_EQ(status_err(s), kResourceExhausted);
90 TEST(UJson, ParseBoolean) {
91 SourceSink ss(
"true");
97 s = ujson_deserialize_bool(&uj, &val);
98 EXPECT_TRUE(status_ok(s));
104 s = ujson_deserialize_bool(&uj, &val);
105 EXPECT_TRUE(status_ok(s));
110 s = ujson_deserialize_bool(&uj, &val);
111 EXPECT_FALSE(status_ok(s));
113 s = ujson_deserialize_bool(&uj, &val);
114 EXPECT_FALSE(status_ok(s));
116 s = ujson_deserialize_bool(&uj, &val);
117 EXPECT_FALSE(status_ok(s));
120 #define INT(type_, str_, value_) \
122 SourceSink ss(str_); \
123 ujson_t uj = ss.UJson(); \
125 status_t s = ujson_parse_integer(&uj, (void *)&t, sizeof(t)); \
126 EXPECT_EQ(status_err(s), kOk); \
127 EXPECT_EQ(t, value_); \
130 #define SIMPLE_INT(type_, value_) INT(type_, #value_, value_)
132 TEST(UJson, ParseInteger) {
133 SIMPLE_INT(int64_t, -1);
134 SIMPLE_INT(uint64_t, 9223372036854775808);
135 SIMPLE_INT(uint32_t, 12345678);
136 SIMPLE_INT(int32_t, -12345678);
137 SIMPLE_INT(int16_t, -1);
138 SIMPLE_INT(int8_t, -1);
141 INT(uint8_t,
"256", 0);
143 INT(int64_t,
"9223372036854775808", -9223372036854775808);
148 TEST(UJson, ParseIntegerError) {
150 ujson uj = ss.UJson();
155 s = ujson_parse_integer(&uj, (
void *)&t,
sizeof(t));
156 EXPECT_EQ(status_err(s), kResourceExhausted);
160 s = ujson_parse_integer(&uj, (
void *)&t,
sizeof(t));
161 EXPECT_EQ(status_err(s), kNotFound);
165 ss.Reset(
"18446744073709551616");
166 s = ujson_parse_integer(&uj, (
void *)&t,
sizeof(t));
167 EXPECT_EQ(status_err(s), kOutOfRange);
171 ss.Reset(
"18446744073709551620");
172 s = ujson_parse_integer(&uj, (
void *)&t,
sizeof(t));
173 EXPECT_EQ(status_err(s), kOutOfRange);
176 ss.Reset(
"-9223372036854775809");
177 s = ujson_parse_integer(&uj, (
void *)&t,
sizeof(t));
178 EXPECT_EQ(status_err(s), kOutOfRange);
181 TEST(UJson, SerializeString) {
183 ujson uj = ss.UJson();
185 EXPECT_TRUE(status_ok(ujson_serialize_string(&uj,
"abc123")));
186 EXPECT_EQ(ss.Sink(), R
"json("abc123")json");
189 EXPECT_TRUE(status_ok(ujson_serialize_string(&uj, "\"\\\b\f\n\r\t")));
190 EXPECT_EQ(ss.Sink(), R
"json("\"\\\b\f\n\r\t")json");
193 EXPECT_TRUE(status_ok(ujson_serialize_string(&uj, "\xFF\x01\x99")));
194 EXPECT_EQ(ss.Sink(), R
"json("\u00ff\u0001\u0099")json");
197 TEST(UJson, SerializeBool) {
199 ujson uj = ss.UJson();
203 EXPECT_TRUE(status_ok(ujson_serialize_bool(&uj, &val)));
204 EXPECT_EQ(ss.Sink(), R
"json(true)json");
208 EXPECT_TRUE(status_ok(ujson_serialize_bool(&uj, &val)));
209 EXPECT_EQ(ss.Sink(), R
"json(false)json");
212 #define INT(type_, str_, value_) \
215 ujson_t uj = ss.UJson(); \
217 status_t s = ujson_serialize_##type_(&uj, &t); \
218 EXPECT_EQ(status_err(s), kOk); \
219 EXPECT_EQ(ss.Sink(), str_); \
222 TEST(UJson, SerializeIntegers) {
223 INT(uint64_t,
"9223372036854775808", 1UL << 63);
224 INT(uint32_t,
"4294967295", 0xFFFFFFFF);
225 INT(uint16_t,
"32768", 0x8000);
226 INT(uint8_t,
"129", 129);
228 INT(int64_t,
"-9223372036854775808", 1UL << 63);
229 INT(int32_t,
"-1", 0xFFFFFFFF);
230 INT(int16_t,
"-32768", 0x8000);
231 INT(int8_t,
"-2", 0xfe);
234 TEST(UJson, SerializeStatus) {
236 ujson uj = ss.UJson();
239 val = OK_STATUS(1234);
240 EXPECT_TRUE(status_ok(ujson_serialize_status_t(&uj, &val)));
241 EXPECT_EQ(ss.Sink(), R
"json({"Ok":1234})json");
244 TEST(UJson, DeerializeStatus) {
245 SourceSink ss(R"json({"Ok":1234})json");
246 ujson uj = ss.UJson();
249 char mod_id[4] = {0};
253 EXPECT_TRUE(status_ok(ujson_deserialize_status_t(&uj, &val)));
254 OT_DISCARD(status_extract(val, &code, &arg, mod_id));
255 EXPECT_EQ(status_err(val), kOk);
256 EXPECT_EQ(arg, 1234);
260 ss.Reset(R
"json({"InvalidArgument": ["foobar", 77]})json");
261 EXPECT_TRUE(status_ok(ujson_deserialize_status_t(&uj, &val)));
262 OT_DISCARD(status_extract(val, &code, &arg, mod_id));
263 EXPECT_EQ(status_err(val), kInvalidArgument);
264 EXPECT_EQ(std::string(mod_id), "FOO");