xref: /rockchip-linux_mpp/mpp/base/test/mpp_trie_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "mpp_trie_test"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_log.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_time.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "mpp_trie.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka typedef void *(*TestProc)(void *, RK_S64 time);
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka typedef struct TestAction_t {
31*437bfbebSnyanmisaka     const char          *name;
32*437bfbebSnyanmisaka     void                *ctx;
33*437bfbebSnyanmisaka     TestProc            proc;
34*437bfbebSnyanmisaka } TestAction;
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka typedef struct TestCase_t {
37*437bfbebSnyanmisaka     const char          *name;
38*437bfbebSnyanmisaka     MPP_RET             ret;
39*437bfbebSnyanmisaka } TestCase;
40*437bfbebSnyanmisaka 
print_opt(void * ctx,RK_S64 time)41*437bfbebSnyanmisaka void *print_opt(void *ctx, RK_S64 time)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka     RK_U8 **str = (RK_U8 **)ctx;
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka     if (str && *str)
46*437bfbebSnyanmisaka         mpp_log("get option %-16s time %lld us\n", *str, time);
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     return NULL;
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka TestAction test_info[] = {
52*437bfbebSnyanmisaka     { "rc:mode",        &test_info[0],  print_opt},
53*437bfbebSnyanmisaka     { "rc:bps_target",  &test_info[1],  print_opt},
54*437bfbebSnyanmisaka     { "rc:bps_max",     &test_info[2],  print_opt},
55*437bfbebSnyanmisaka     { "rc:bps_min",     &test_info[3],  print_opt},
56*437bfbebSnyanmisaka     /* test valid info end in the middle */
57*437bfbebSnyanmisaka     { "rc:bps",         &test_info[4],  print_opt},
58*437bfbebSnyanmisaka };
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka TestCase test_case[] = {
61*437bfbebSnyanmisaka     { "rc:mode",                    MPP_OK, },
62*437bfbebSnyanmisaka     { "rc:bps_target",              MPP_OK, },
63*437bfbebSnyanmisaka     { "rc:bps_max",                 MPP_OK, },
64*437bfbebSnyanmisaka     { "rc:bps",                     MPP_OK, },
65*437bfbebSnyanmisaka     { "this is an error string",    MPP_NOK, },
66*437bfbebSnyanmisaka     { "",                           MPP_NOK, },
67*437bfbebSnyanmisaka };
68*437bfbebSnyanmisaka 
main()69*437bfbebSnyanmisaka int main()
70*437bfbebSnyanmisaka {
71*437bfbebSnyanmisaka     MppTrie trie = NULL;
72*437bfbebSnyanmisaka     RK_S32 i;
73*437bfbebSnyanmisaka     RK_S64 end = 0;
74*437bfbebSnyanmisaka     RK_S64 start = 0;
75*437bfbebSnyanmisaka     RK_S32 info_cnt = MPP_ARRAY_ELEMS(test_info);
76*437bfbebSnyanmisaka     RK_S32 ret = MPP_OK;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     mpp_log("mpp_trie_test start\n");
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     mpp_trie_init(&trie, "test_trie");
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     start = mpp_time();
83*437bfbebSnyanmisaka     for (i = 0; i < info_cnt; i++)
84*437bfbebSnyanmisaka         mpp_trie_add_info(trie, test_info[i].name, &test_info[i], sizeof(test_info[i]));
85*437bfbebSnyanmisaka     end = mpp_time();
86*437bfbebSnyanmisaka     mpp_log("add act time %lld us\n", end - start);
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     ret = mpp_trie_add_info(trie, NULL, NULL, 0);
89*437bfbebSnyanmisaka     if (ret) {
90*437bfbebSnyanmisaka         mpp_loge("mpp_trie_add_info last failed\n");
91*437bfbebSnyanmisaka         goto DONE;
92*437bfbebSnyanmisaka     }
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(test_case); i++) {
95*437bfbebSnyanmisaka         MppTrieInfo *info = NULL;
96*437bfbebSnyanmisaka         TestAction *act = NULL;
97*437bfbebSnyanmisaka         const char *name = test_case[i].name;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka         start = mpp_time();
100*437bfbebSnyanmisaka         info = mpp_trie_get_info(trie, name);
101*437bfbebSnyanmisaka         end = mpp_time();
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka         if (info)
104*437bfbebSnyanmisaka             act = (TestAction *)mpp_trie_info_ctx(info);
105*437bfbebSnyanmisaka 
106*437bfbebSnyanmisaka         if (act && act->proc)
107*437bfbebSnyanmisaka             act->proc(act->ctx, end - start);
108*437bfbebSnyanmisaka         else
109*437bfbebSnyanmisaka             mpp_loge("search %s failed time %lld us\n", name, end - start);
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka         ret |= ((info && !test_case[i].ret) ||
112*437bfbebSnyanmisaka                 (!info && test_case[i].ret)) ? MPP_OK : MPP_NOK;
113*437bfbebSnyanmisaka     }
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     mpp_trie_deinit(trie);
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka DONE:
118*437bfbebSnyanmisaka     mpp_log("mpp_trie_test ret %s\n", ret ? "failed" : "success");
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     return ret;
121*437bfbebSnyanmisaka }
122