Software APIs
example_test.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/lib/ujson/example.h"
6 
7 #include <cstring>
8 #include <gtest/gtest.h>
9 #include <string>
10 
11 #include "sw/device/lib/base/status.h"
12 #include "sw/device/lib/ujson/test_helpers.h"
13 #include "sw/device/lib/ujson/ujson.h"
14 namespace {
16 
17 TEST(Derive, FooSerialize) {
18  foo foo = {-5, 150000, "Kilroy was here"};
19  SourceSink ss;
20  ujson_t uj = ss.UJson();
21  EXPECT_TRUE(status_ok(ujson_serialize_foo(&uj, &foo)));
22  EXPECT_EQ(ss.Sink(),
23  R"json({"foo":-5,"bar":150000,"message":"Kilroy was here"})json");
24  EXPECT_EQ(ujson_crc32_finish(&uj), 0x1e31c20e);
25 }
26 
27 TEST(Derive, FooDeserialize) {
28  foo expected = {-5, 150000, "Kilroy was here"};
29  foo foo{};
30  SourceSink ss(
31  R"json({"foo":-5,"bar":150000,"message":"Kilroy was here"})json");
32  ujson_t uj = ss.UJson();
33  EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
34  EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
35  EXPECT_EQ(ujson_crc32_finish(&uj), 0x1e31c20e);
36 }
37 
38 TEST(Derive, FooDeserializeNoFoo) {
39  foo expected = {0, 150000, "Kilroy was here"};
40  foo foo{};
41  SourceSink ss(R"json({"bar":150000,"message":"Kilroy was here"})json");
42  ujson_t uj = ss.UJson();
43  EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
44  EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
45  EXPECT_EQ(ujson_crc32_finish(&uj), 0x431acc08);
46 }
47 
48 TEST(Derive, FooDeserializeNoMessage) {
49  foo expected = {
50  -5,
51  150000,
52  };
53  foo foo{};
54  SourceSink ss(R"json({"foo":-5,"bar":150000})json");
55  ujson_t uj = ss.UJson();
56  EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
57  EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
58  EXPECT_EQ(ujson_crc32_finish(&uj), 0xded4ce6);
59 }
60 
61 TEST(Derive, FooDeserializeMessageToLong) {
62  foo expected = {-5, 150000, "abcdefghijklmnopqrs"};
63  foo foo{};
64  SourceSink ss(
65  R"json({"foo":-5,"bar":150000,"message":"abcdefghijklmnopqrstuvwxyz"})json");
66  ujson_t uj = ss.UJson();
67  EXPECT_TRUE(status_ok(ujson_deserialize_foo(&uj, &foo)));
68  EXPECT_EQ(memcmp(&foo, &expected, sizeof(foo)), 0);
69  EXPECT_EQ(ujson_crc32_finish(&uj), 0xfaebc314);
70 }
71 
72 TEST(Derive, FooDeserializeBogusKey) {
73  foo foo{};
74  SourceSink ss(
75  R"json({"bar":150000,"message":"Kilroy was here","bogus":99})json");
76  ujson_t uj = ss.UJson();
77  EXPECT_EQ(status_err(ujson_deserialize_foo(&uj, &foo)), kInvalidArgument);
78 }
79 
80 TEST(Derive, RectSerialize) {
81  rect r = {{10, 10}, {60, 40}};
82  SourceSink ss;
83  ujson_t uj = ss.UJson();
84  EXPECT_TRUE(status_ok(ujson_serialize_rect(&uj, &r)));
85  EXPECT_EQ(
86  ss.Sink(),
87  R"json({"top_left":{"x":10,"y":10},"bottom_right":{"x":60,"y":40}})json");
88  EXPECT_EQ(ujson_crc32_finish(&uj), 0x4b9a0fb1);
89 }
90 
91 TEST(Derive, RectDeserialize) {
92  rect expected = {{10, 20}, {30, 40}};
93  rect r{};
94  SourceSink ss(
95  R"json({"top_left":{"x":10,"y":20},"bottom_right":{"x":30,"y":40}})json");
96  ujson_t uj = ss.UJson();
97  EXPECT_TRUE(status_ok(ujson_deserialize_rect(&uj, &r)));
98  EXPECT_EQ(memcmp(&r, &expected, sizeof(r)), 0);
99  EXPECT_EQ(ujson_crc32_finish(&uj), 0xb11e9dea);
100 }
101 
102 TEST(Derive, MatrixSerialize) {
103  matrix m = {
104  {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {-1, -2, -3, -4, -5}},
105  };
106  SourceSink ss;
107  ujson_t uj = ss.UJson();
108  EXPECT_TRUE(status_ok(ujson_serialize_matrix(&uj, &m)));
109  EXPECT_EQ(ss.Sink(),
110  R"json({"k":[[0,1,2,3,4],[5,6,7,8,9],[-1,-2,-3,-4,-5]]})json");
111  EXPECT_EQ(ujson_crc32_finish(&uj), 0x927a936);
112 }
113 
114 TEST(Derive, MatrixDeserialize) {
115  matrix expected = {
116  {{0, 1, 0, 0, 0}, {2, 3, 4, 5, 0}, {-1, 0, 0, 0, 0}},
117  };
118  matrix m{};
119  SourceSink ss(R"json({"k":[[0,1],[2, 3, 4, 5],[-1]]})json");
120  ujson_t uj = ss.UJson();
121  EXPECT_TRUE(status_ok(ujson_deserialize_matrix(&uj, &m)));
122  EXPECT_EQ(ujson_crc32_finish(&uj), 0xca69b105);
123  ujson_serialize_matrix(&uj, &m);
124  std::cout << ss.Sink() << "\n\n";
125  EXPECT_EQ(memcmp(&m, &expected, sizeof(m)), 0);
126 }
127 
128 TEST(Derive, DirectionSerialize) {
129  direction d = kDirectionEast;
130  SourceSink ss;
131  ujson_t uj = ss.UJson();
132  EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
133  EXPECT_EQ(ss.Sink(), R"json("East")json");
134  EXPECT_EQ(ujson_crc32_finish(&uj), 0x20ab69de);
135 
136  ss.Reset();
137  ujson_crc32_reset(&uj);
138  d = kDirectionSouth;
139  EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
140  EXPECT_EQ(ss.Sink(), R"json("South")json");
141  EXPECT_EQ(ujson_crc32_finish(&uj), 0x236b5d67);
142 
143  ss.Reset();
144  ujson_crc32_reset(&uj);
145  d = static_cast<direction>(120);
146  EXPECT_TRUE(status_ok(ujson_serialize_direction(&uj, &d)));
147  EXPECT_EQ(ss.Sink(), R"json({"IntValue":120})json");
148  EXPECT_EQ(ujson_crc32_finish(&uj), 0x63cb5f57);
149 }
150 
151 TEST(Derive, DirectionDeserialize) {
152  direction d;
153  SourceSink ss(R"json("West")json");
154  ujson_t uj = ss.UJson();
155  EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
156  EXPECT_EQ(d, kDirectionWest);
157  EXPECT_EQ(ujson_crc32_finish(&uj), 0xb5e93a6b);
158 
159  ss.Reset(R"json("North")json");
160  ujson_crc32_reset(&uj);
161  EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
162  EXPECT_EQ(d, kDirectionNorth);
163  EXPECT_EQ(ujson_crc32_finish(&uj), 0x1f4749b);
164 
165  ss.Reset(R"json({"IntValue":35})json");
166  ujson_crc32_reset(&uj);
167  EXPECT_TRUE(status_ok(ujson_deserialize_direction(&uj, &d)));
168  EXPECT_EQ(d, static_cast<direction>(35));
169  EXPECT_EQ(ujson_crc32_finish(&uj), 0x86f181c2);
170 }
171 
172 TEST(Derive, FuzzyBoolSerialize) {
173  fuzzy_bool d = kFuzzyBoolTrue;
174  SourceSink ss;
175  ujson_t uj = ss.UJson();
176  EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
177  EXPECT_EQ(ss.Sink(), R"json("True")json");
178  EXPECT_EQ(ujson_crc32_finish(&uj), 0x68d3703f);
179 
180  ss.Reset();
181  ujson_crc32_reset(&uj);
182  d = kFuzzyBoolFalse;
183  EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
184  EXPECT_EQ(ss.Sink(), R"json("False")json");
185  EXPECT_EQ(ujson_crc32_finish(&uj), 0x52b000f3);
186 
187  ss.Reset();
188  ujson_crc32_reset(&uj);
189  d = static_cast<fuzzy_bool>(75);
190  EXPECT_TRUE(status_ok(ujson_serialize_fuzzy_bool(&uj, &d)));
191  EXPECT_EQ(ss.Sink(), R"json(75)json");
192  EXPECT_EQ(ujson_crc32_finish(&uj), 0x876d76e8);
193 }
194 
195 TEST(Derive, FuzzyBoolDeserialize) {
196  fuzzy_bool d;
197  SourceSink ss(R"json("False")json");
198  ujson_t uj = ss.UJson();
199  EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
200  EXPECT_EQ(d, kFuzzyBoolFalse);
201  EXPECT_EQ(ujson_crc32_finish(&uj), 0x52b000f3);
202 
203  ujson_crc32_reset(&uj);
204  ss.Reset(R"json("True")json");
205  EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
206  EXPECT_EQ(d, kFuzzyBoolTrue);
207  EXPECT_EQ(ujson_crc32_finish(&uj), 0x68d3703f);
208 
209  ujson_crc32_reset(&uj);
210  ss.Reset(R"json(35)json");
211  EXPECT_TRUE(status_ok(ujson_deserialize_fuzzy_bool(&uj, &d)));
212  EXPECT_EQ(d, static_cast<fuzzy_bool>(35));
213  EXPECT_EQ(ujson_crc32_finish(&uj), 0xe301b3ec);
214 }
215 
216 } // namespace