xref: /rockchip-linux_mpp/mpp/base/test/mpp_cfg_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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