1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3 * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4 */
5
6 #define MODULE_TAG "mpp_cfg_test"
7
8 #include <fcntl.h>
9 #include <unistd.h>
10 #include <sys/stat.h>
11 #include <sys/mman.h>
12 #include <string.h>
13
14 #include "mpp_mem.h"
15 #include "mpp_debug.h"
16
17 #include "mpp_cfg_io.h"
18
19 static const char *str_fmt[] = {
20 "log",
21 "json",
22 "toml",
23 "invalid"
24 };
25
test_to_from(MppCfgObj obj,MppCfgStrFmt fmt)26 static rk_s32 test_to_from(MppCfgObj obj, MppCfgStrFmt fmt)
27 {
28 MppCfgObj out = NULL;
29 char *std = NULL;
30 char *str = NULL;
31 rk_s32 ret = rk_nok;
32
33 ret = mpp_cfg_to_string(obj, fmt, &std);
34 if (ret) {
35 mpp_loge("mpp_cfg obj to %s string failed\n", str_fmt[fmt]);
36 goto DONE;
37 }
38
39 ret = mpp_cfg_from_string(&out, fmt, std);
40 if (ret) {
41 mpp_loge("mpp_cfg out from %s string failed\n", str_fmt[fmt]);
42 goto DONE;
43 }
44
45 ret = mpp_cfg_to_string(out, fmt, &str);
46 if (ret) {
47 mpp_loge("mpp_cfg out to %s string failed\n", str_fmt[fmt]);
48 goto DONE;
49 }
50
51 if (strcmp(std, str)) {
52 mpp_loge("mpp_cfg mismatch on from / to %s string\n", str_fmt[fmt]);
53 mpp_logi("string std:\n");
54 mpp_cfg_print_string(std);
55 mpp_logi("string out:\n");
56 mpp_cfg_print_string(out);
57 ret = rk_nok;
58 }
59
60 DONE:
61 MPP_FREE(std);
62 MPP_FREE(str);
63 mpp_cfg_put_all(out);
64
65 return ret;
66 }
67
main(int argc,char * argv[])68 int main(int argc, char *argv[])
69 {
70 MppCfgObj root = NULL;
71 MppCfgObj array = NULL;
72 MppCfgObj obj = NULL;
73 MppCfgVal val;
74 rk_s32 array_size = 4;
75 rk_s32 ret = rk_nok;
76 rk_s32 i;
77
78 mpp_logi("start\n");
79
80 if (argc > 1) {
81 char *path = argv[1];
82 void *buf = NULL;
83 rk_s32 fd = -1;
84 rk_s32 size = 0;
85
86 fd = open(path, O_RDWR);
87 if (fd < 0) {
88 mpp_loge("open %s failed\n", path);
89 goto FILE_DONE;
90 }
91
92 mpp_logi("open file %s\n", path);
93
94 size = lseek(fd, 0, SEEK_END);
95 if (size < 0) {
96 mpp_loge("lseek failed\n");
97 goto FILE_DONE;
98 }
99
100 lseek(fd, 0, SEEK_SET);
101 mpp_logi("get file size %d\n", size);
102
103 buf = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
104 if (!buf) {
105 mpp_loge("mmap fd %d size %d failed\n", fd, size);
106 goto FILE_DONE;
107 }
108
109 mpp_logi("mmap size %d to %p content:\n", size, buf);
110 mpp_logi("%s", buf);
111
112 ret = mpp_cfg_from_string(&root, MPP_CFG_STR_FMT_JSON, buf);
113 if (ret) {
114 mpp_loge("mpp_cfg_from_string failed\n");
115 goto FILE_DONE;
116 }
117
118 mpp_logi("get cfg object %p from file\n", root);
119
120 mpp_cfg_dump_f(root);
121
122 ret = test_to_from(root, MPP_CFG_STR_FMT_LOG);
123 mpp_logi("test to / from log string %s\n", ret ? "failed" : "success");
124 if (ret)
125 goto FILE_DONE;
126
127 ret = test_to_from(root, MPP_CFG_STR_FMT_JSON);
128 mpp_logi("test to / from json string %s\n", ret ? "failed" : "success");
129 if (ret)
130 goto FILE_DONE;
131
132 ret = test_to_from(root, MPP_CFG_STR_FMT_TOML);
133 mpp_logi("test to / from toml string %s\n", ret ? "failed" : "success");
134 if (ret)
135 goto FILE_DONE;
136
137 FILE_DONE:
138 if (buf) {
139 munmap(buf, size);
140 buf = NULL;
141 }
142 if (fd >= 0) {
143 close(fd);
144 fd = -1;
145 }
146
147 mpp_cfg_put_all(root);
148 root = NULL;
149
150 if (ret)
151 return ret;
152 }
153
154 ret = mpp_cfg_get_object(&root, NULL, MPP_CFG_TYPE_OBJECT, NULL);
155 if (ret) {
156 mpp_loge("mpp_cfg_get_object failed\n");
157 goto DONE;
158 }
159
160 mpp_logi("get root object\n");
161
162 ret = mpp_cfg_get_array(&array, NULL, array_size);
163 if (ret) {
164 mpp_loge("mpp_cfg_get_array failed\n");
165 goto DONE;
166 }
167
168 mpp_logi("get array\n");
169
170 for (i = 0; i < array_size; i++) {
171 obj = NULL;
172 val.s32 = i;
173 ret = mpp_cfg_get_object(&obj, NULL, MPP_CFG_TYPE_s32, &val);
174 if (ret) {
175 mpp_loge("mpp_cfg_get_object array element failed\n");
176 goto DONE;
177 }
178
179 ret = mpp_cfg_add(array, obj);
180 if (ret) {
181 mpp_loge("mpp_cfg_add array element failed\n");
182 goto DONE;
183 }
184 }
185
186 ret = mpp_cfg_add(root, array);
187 if (ret) {
188 mpp_loge("mpp_cfg_add failed\n");
189 goto DONE;
190 }
191
192 mpp_logi("add array to root\n");
193
194 obj = NULL;
195 val.s32 = 1920;
196 ret = mpp_cfg_get_object(&obj, "width", MPP_CFG_TYPE_s32, &val);
197 if (ret) {
198 mpp_loge("mpp_cfg_get s32 failed\n");
199 goto DONE;
200 }
201
202 ret = mpp_cfg_add(root, obj);
203 if (ret) {
204 mpp_loge("mpp_cfg_add s32 failed\n");
205 goto DONE;
206 }
207
208 mpp_logi("add s32 to root\n");
209
210 obj = NULL;
211 val.u32 = 1080;
212 ret = mpp_cfg_get_object(&obj, "height", MPP_CFG_TYPE_u32, &val);
213 if (ret) {
214 mpp_loge("mpp_cfg_get u32 failed\n");
215 goto DONE;
216 }
217
218 ret = mpp_cfg_add(root, obj);
219 if (ret) {
220 mpp_loge("mpp_cfg_add u32 failed\n");
221 goto DONE;
222 }
223
224 mpp_logi("set u32 to root\n");
225
226 obj = NULL;
227 val.str = "hello world";
228 ret = mpp_cfg_get_object(&obj, "test", MPP_CFG_TYPE_STRING, &val);
229 if (ret) {
230 mpp_loge("mpp_cfg_get string failed\n");
231 goto DONE;
232 }
233
234 ret = mpp_cfg_add(root, obj);
235 if (ret) {
236 mpp_loge("mpp_cfg_add string failed\n");
237 goto DONE;
238 }
239
240 mpp_logi("set string to root\n");
241
242 mpp_cfg_dump_f(root);
243
244 ret = test_to_from(root, MPP_CFG_STR_FMT_LOG);
245 mpp_logi("test to / from log string %s\n", ret ? "failed" : "success");
246 if (ret)
247 goto DONE;
248
249 ret = test_to_from(root, MPP_CFG_STR_FMT_JSON);
250 mpp_logi("test to / from json string %s\n", ret ? "failed" : "success");
251 if (ret)
252 goto DONE;
253
254 ret = mpp_cfg_del(array);
255 if (ret) {
256 mpp_loge("mpp_cfg_del failed\n");
257 goto DONE;
258 }
259
260 mpp_logi("del array from root\n");
261
262 DONE:
263 if (root) {
264 mpp_cfg_put_all(root);
265 root = NULL;
266 }
267 if (array) {
268 mpp_cfg_put_all(array);
269 array = NULL;
270 }
271
272 mpp_logi("done %s\n", ret ? "failed" : "success");
273
274 return ret;
275 }
276