1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
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 #define LOG_TAG "SerializableTest"
16 #include "serializable.h"
17
18 #include <type_traits>
19
20 #include "gtest/gtest.h"
21 #include "logger.h"
22
23 using namespace testing::ext;
24 namespace OHOS::Test {
25 class SerializableTest : public testing::Test {
26 public:
27 struct Normal final : public Serializable {
28 public:
29 std::string name = "Test";
30 int32_t count = 0;
31 uint32_t status = 1;
32 int64_t value = 2;
33 bool isClear = false;
34 std::vector<std::string> cols{ "123", "345", "789" };
35 std::vector<std::vector<int32_t>> colRow{ { 123, 345, 789 }, { 123, 345, 789 } };
36
37 bool Marshal(json &node) const override
38 {
39 SetValue(node[GET_NAME(name)], name);
40 SetValue(node[GET_NAME(count)], count);
41 SetValue(node[GET_NAME(status)], status);
42 SetValue(node[GET_NAME(value)], value);
43 SetValue(node[GET_NAME(isClear)], isClear);
44 SetValue(node[GET_NAME(cols)], cols);
45 SetValue(node[GET_NAME(colRow)], colRow);
46 return true;
47 }
48 bool Unmarshal(const json &node) override
49 {
50 GetValue(node, GET_NAME(name), name);
51 GetValue(node, GET_NAME(count), count);
52 GetValue(node, GET_NAME(status), status);
53 GetValue(node, GET_NAME(value), value);
54 GetValue(node, GET_NAME(isClear), isClear);
55 GetValue(node, GET_NAME(cols), cols);
56 GetValue(node, GET_NAME(colRow), colRow);
57 return true;
58 }
operator ==OHOS::Test::SerializableTest::final59 bool operator==(const Normal &ref) const
60 {
61 return name == ref.name && count == ref.count && status == ref.status && value == ref.value &&
62 isClear == ref.isClear && cols == ref.cols;
63 }
64 };
65
66 struct NormalEx final : public Serializable {
67 public:
68 std::vector<Normal> normals{ Normal(), Normal() };
69 Normal normal;
70 int32_t count = 123;
71 std::string name = "wdt";
72 bool Marshal(json &node) const override
73 {
74 SetValue(node[GET_NAME(normals)], normals);
75 SetValue(node[GET_NAME(normal)], normal);
76 SetValue(node[GET_NAME(count)], count);
77 SetValue(node[GET_NAME(name)], name);
78 return true;
79 }
80 bool Unmarshal(const json &node) override
81 {
82 GetValue(node, GET_NAME(normals), normals);
83 GetValue(node, GET_NAME(normal), normal);
84 GetValue(node, GET_NAME(count), count);
85 GetValue(node, GET_NAME(name), name);
86 return true;
87 }
operator ==OHOS::Test::SerializableTest::final88 bool operator==(const NormalEx &normalEx) const
89 {
90 return normals == normalEx.normals && count == normalEx.count && name == normalEx.name;
91 }
92 };
SetUpTestCase(void)93 static void SetUpTestCase(void)
94 {
95 }
TearDownTestCase(void)96 static void TearDownTestCase(void)
97 {
98 }
SetUp()99 void SetUp()
100 {
101 Test::SetUp();
102 }
TearDown()103 void TearDown()
104 {
105 Test::TearDown();
106 }
107
108 template<typename T>
EqualPtr(const T *src, const T *target)109 static inline bool EqualPtr(const T *src, const T *target)
110 {
111 return (((src) == (target)) || ((src) != nullptr && (target) != nullptr && *(src) == *(target)));
112 }
113 };
114
115 /**
116 * @tc.name: SerializableSuiteGetVal
117 * @tc.desc: Get Value.
118 * @tc.type: FUNC
119 * @tc.require:
120 */
HWTEST_F(SerializableTest, GetNormalVal, TestSize.Level2)121 HWTEST_F(SerializableTest, GetNormalVal, TestSize.Level2)
122 {
123 Normal normal;
124 normal.name = "normal";
125 normal.count = -1;
126 normal.status = 12;
127 normal.value = -56;
128 normal.isClear = true;
129 normal.cols = { "adfasdfas" };
130 auto jstr = to_string(normal.Marshall());
131 Normal normal1;
132 normal1.Unmarshall(jstr);
133 ASSERT_TRUE(normal == normal1) << normal1.name;
134 }
135
136 /**
137 * @tc.name: Delete Serializable
138 * @tc.desc: can delete child class, but not delete parent class point.
139 * @tc.type: FUNC
140 * @tc.require:
141 */
HWTEST_F(SerializableTest, DeleteSerializable, TestSize.Level2)142 HWTEST_F(SerializableTest, DeleteSerializable, TestSize.Level2)
143 {
144 ASSERT_FALSE(std::is_destructible<Serializable>::value);
145 ASSERT_TRUE(std::is_destructible<NormalEx>::value);
146 }
147
148 /**
149 * @tc.name: SerializableSuiteGetMutilVal
150 * @tc.desc: mutil value case.
151 * @tc.type: FUNC
152 * @tc.require:
153 */
HWTEST_F(SerializableTest, GetMutilVal, TestSize.Level2)154 HWTEST_F(SerializableTest, GetMutilVal, TestSize.Level2)
155 {
156 NormalEx normalEx;
157 normalEx.normals = { Normal() };
158 normalEx.name = "normalEx";
159 auto jstr = to_string(normalEx.Marshall());
160 NormalEx normal1;
161 normal1.Unmarshall(jstr);
162 ASSERT_TRUE(normalEx == normal1) << normal1.name;
163 }
164
165 /**
166 * @tc.name: IsJson
167 * @tc.desc: is json.
168 * @tc.type: FUNC
169 */
HWTEST_F(SerializableTest, IsJson, TestSize.Level1)170 HWTEST_F(SerializableTest, IsJson, TestSize.Level1)
171 {
172 std::string str = "test";
173 std::string jsonStr = "\"test\"";
174 ASSERT_FALSE(Serializable::IsJson(str));
175 ASSERT_TRUE(Serializable::IsJson(jsonStr));
176 }
177
178 /**
179 * @tc.name: ToJson_01
180 * @tc.desc: to json.
181 * @tc.type: FUNC
182 */
HWTEST_F(SerializableTest, ToJson_01, TestSize.Level1)183 HWTEST_F(SerializableTest, ToJson_01, TestSize.Level1)
184 {
185 std::string jsonStr = "{\"key\":\"value\"}";
186 Serializable::json result = Serializable::ToJson(jsonStr);
187 ASSERT_FALSE(result.is_discarded());
188 }
189
190 /**
191 * @tc.name: ToJson_02
192 * @tc.desc: to json.
193 * @tc.type: FUNC
194 */
HWTEST_F(SerializableTest, ToJson_02, TestSize.Level1)195 HWTEST_F(SerializableTest, ToJson_02, TestSize.Level1)
196 {
197 std::string jsonStr = "invalid_json";
198 Serializable::json result = Serializable::ToJson(jsonStr);
199 ASSERT_FALSE(result.is_discarded());
200 }
201
202 /**
203 * @tc.name: ToJson_03
204 * @tc.desc: to json.
205 * @tc.type: FUNC
206 */
HWTEST_F(SerializableTest, ToJson_03, TestSize.Level1)207 HWTEST_F(SerializableTest, ToJson_03, TestSize.Level1)
208 {
209 std::string jsonStr = "";
210 Serializable::json result = Serializable::ToJson(jsonStr);
211 ASSERT_TRUE(result.empty());
212 }
213
214 /**
215 * @tc.name: ToJson_04
216 * @tc.desc: to json.
217 * @tc.type: FUNC
218 */
HWTEST_F(SerializableTest, ToJson_04, TestSize.Level1)219 HWTEST_F(SerializableTest, ToJson_04, TestSize.Level1)
220 {
221 std::string jsonStr = "{invalid_json}";
222 Serializable::json result = Serializable::ToJson(jsonStr);
223 ASSERT_FALSE(result.is_discarded());
224 }
225 } // namespace OHOS::Test