4545#include "kpb_mock.h"
4646#include <sof/list.h>
4747
48- /* local data types */
49- enum kpb_test_type {
50- KPB_TEST_COPY_TWO_BUFFERS = 0 ,
51- KPB_TEST_COPY_ONE_BUFFER ,
52- };
53-
48+ /*! Local data types */
5449enum kpb_test_buff_type {
5550 KPB_SOURCE_BUFFER = 0 ,
5651 KPB_SINK_BUFFER ,
5752};
5853
54+ /*! Parameters for test case */
5955struct test_case {
60- enum kpb_test_type type ;
6156 int no_buffers ;
6257 int lp_buff_size ;
6358 int hp_buff_size ;
6459 int source_period_bytes ;
6560 int sink_period_bytes ;
6661};
6762
68- /* dummy component driver & device */
63+ /* Dummy IPC structure, used to create KPB component */
64+ struct sof_ipc_comp_kpb_mock {
65+ struct sof_ipc_comp comp ;
66+ struct sof_ipc_comp_config config ;
67+ uint32_t size ; /**< size of bespoke data section in bytes */
68+ uint32_t type ; /**< sof_ipc_effect_type */
69+
70+ /* reserved for future use */
71+ uint32_t reserved [7 ];
72+ /* sof_kpb_config */
73+ uint32_t not_used ; /**< kpb size in bytes */
74+ uint32_t caps ; /**< SOF_MEM_CAPS_ */
75+ uint32_t no_channels ; /**< no of channels */
76+ uint32_t history_depth ; /**< time of buffering in milliseconds */
77+ uint32_t sampling_freq ; /**< frequency in hertz */
78+ uint32_t sampling_width ; /**< number of bits */
79+ };
80+
81+ /* Dummy component driver & device */
6982struct comp_driver kpb_drv_mock ;
7083struct comp_dev * kpb_dev_mock ;
7184struct comp_buffer * source ;
7285struct comp_buffer * sink ;
7386
74- /* dummy memory buffers and data pointers */
87+ /* Dummy memory buffers and data pointers */
7588void * source_data ;
7689void * sink_data ;
7790void * his_buf_lp ;
7891void * his_buf_hp ;
7992
80- /* local function declarations */
81- static struct comp_buffer * mock_comp_buffer (void * * state ,
82- enum kpb_test_buff_type buff_type );
83- static struct kpb_comp_data * mock_comp_kpb (void * * state , void * hp_buf ,
84- void * lp_buf );
85- static struct comp_dev * mock_comp_dev (void );
86-
93+ /* Initialize KPB for test */
8794static int buffering_test_setup (void * * state )
8895{
89- struct test_case * test_case_data = (struct test_case * )* state ;
90- int lp_buff_size = test_case_data -> lp_buff_size ;
91- int hp_buff_size = test_case_data -> hp_buff_size ;
92- int entire_buff_size = hp_buff_size + lp_buff_size ;
93- /* allocate memory for components */
94- if (test_case_data -> no_buffers == 2 ) {
95- his_buf_lp = test_malloc (lp_buff_size );
96- his_buf_hp = test_malloc (hp_buff_size );
97- } else if (test_case_data -> type == KPB_TEST_COPY_ONE_BUFFER ) {
98- his_buf_hp = test_malloc (hp_buff_size );
99- } else {
100- return -1 ;
101- }
96+ (void )state ;
97+
98+ /* Dummy IPC structue to create new KPB component */
99+ struct sof_ipc_comp_kpb_mock kpb = {
100+ .comp = {
101+ .type = SOF_COMP_KPB ,
102+ },
103+ .config = {
104+ .hdr = {
105+ .size = sizeof (struct sof_ipc_comp_config ),
106+ },
107+ },
108+ .size = sizeof (struct sof_kpb_config ),
109+ .no_channels = 2 ,
110+ .sampling_freq = KPB_SAMPLNG_FREQUENCY ,
111+ .sampling_width = KPB_SAMPLING_WIDTH ,
112+ };
102113
103- source_data = test_malloc (entire_buff_size );
104- sink_data = test_malloc (entire_buff_size );
105- kpb_dev_mock = mock_comp_dev ();
114+ /* Register KPB component to use its internal functions */
115+ sys_comp_kpb_init ();
106116
107- /* create mocks */
108- kpb_dev_mock -> private = mock_comp_kpb (state , his_buf_hp , his_buf_lp );
109- source = mock_comp_buffer (state , KPB_SOURCE_BUFFER );
110- sink = mock_comp_buffer (state , KPB_SINK_BUFFER );
117+ /* Create KPB component */
118+ kpb_dev_mock = kpb_drv_mock .ops .new ((struct sof_ipc_comp * )& kpb );
111119
112- /* mount coponents for test */
113- source -> source = kpb_dev_mock ;
114- source -> sink = kpb_dev_mock ;
115- source -> r_ptr = source_data ;
116- sink -> w_ptr = sink_data ;
117- kpb_dev_mock -> bsource_list .next = & source -> sink_list ;
118- kpb_dev_mock -> bsink_list .next = & sink -> source_list ;
119- ((struct kpb_comp_data * )kpb_dev_mock -> private )-> rt_sink = sink ;
120+ /* Was device created properly? */
121+ assert_non_null (kpb_dev_mock );
122+ /* Verify if config was properly set */
123+ assert_int_equal (((struct comp_data * )
124+ kpb_dev_mock -> private )-> config .sampling_freq ,
125+ KPB_SAMPLNG_FREQUENCY );
120126
121127 return 0 ;
122128}
123129
124130static int buffering_test_teardown (void * * state )
125131{
126- /* free components memory */
127- struct test_case * test_case_data = (struct test_case * )* state ;
128- struct kpb_comp_data * cd = comp_get_drvdata (kpb_dev_mock );
129-
130- test_free (cd );
131- test_free (source_data );
132- test_free (sink_data );
133- test_free (source );
134- test_free (sink );
135-
136- if (test_case_data -> type == KPB_TEST_COPY_TWO_BUFFERS ) {
137- test_free (his_buf_lp );
138- test_free (his_buf_hp );
139- } else if (test_case_data -> type == KPB_TEST_COPY_ONE_BUFFER ) {
140- test_free (his_buf_hp );
141- } else {
142- return -1 ;
143- }
144-
145- test_free (kpb_dev_mock );
146132 return 0 ;
147133}
148134
149- static struct comp_dev * mock_comp_dev (void )
150- {
151- struct comp_dev * dev = test_malloc (sizeof (struct comp_dev ));
152-
153- dev -> is_dma_connected = 0 ;
154- return dev ;
155- }
156-
157- static struct kpb_comp_data * mock_comp_kpb (void * * state , void * hp_buf ,
158- void * lp_buf )
159- {
160- struct kpb_comp_data * kpb = test_malloc (sizeof (struct kpb_comp_data ));
161- struct test_case * test_case_data = (struct test_case * )* state ;
162-
163- kpb -> source_period_bytes = test_case_data -> source_period_bytes ;
164- kpb -> sink_period_bytes = test_case_data -> sink_period_bytes ;
165-
166- if (test_case_data -> type == KPB_TEST_COPY_TWO_BUFFERS ) {
167- int lp_buff_size = test_case_data -> lp_buff_size ;
168- int hp_buff_size = test_case_data -> hp_buff_size ;
169- /* LPSRAM buffer init */
170- kpb -> his_buf_lp .id = KPB_LP ;
171- kpb -> his_buf_lp .state = KPB_BUFFER_FREE ;
172- kpb -> his_buf_lp .w_ptr = lp_buf ;
173- kpb -> his_buf_lp .end_addr = kpb -> his_buf_lp .w_ptr + lp_buff_size ;
174- kpb -> his_buf_lp .sta_addr = lp_buf ;
175- /* HPSRAM buffer init */
176- kpb -> his_buf_hp .id = KPB_HP ;
177- kpb -> his_buf_hp .state = KPB_BUFFER_FREE ;
178- kpb -> his_buf_hp .w_ptr = hp_buf ;
179- kpb -> his_buf_hp .end_addr = kpb -> his_buf_hp .w_ptr + hp_buff_size ;
180- kpb -> his_buf_hp .sta_addr = hp_buf ;
181- } else if (test_case_data -> type == KPB_TEST_COPY_ONE_BUFFER ) {
182- int hp_buff_size = test_case_data -> hp_buff_size ;
183- /* HPSRAM buffer init only */
184- kpb -> his_buf_hp .id = KPB_HP ;
185- kpb -> his_buf_hp .state = KPB_BUFFER_FREE ;
186- kpb -> his_buf_hp .w_ptr = hp_buf ;
187- kpb -> his_buf_hp .end_addr = kpb -> his_buf_hp .w_ptr + hp_buff_size ;
188- kpb -> his_buf_hp .sta_addr = hp_buf ;
189- } else {
190- return NULL ;
191- }
192-
193- return kpb ;
194- }
195-
196- static struct comp_buffer * mock_comp_buffer (void * * state ,
197- enum kpb_test_buff_type buff_type )
198- {
199- struct test_case * test_case_data = (struct test_case * )* state ;
200- struct comp_buffer * buffer = test_malloc (sizeof (struct comp_buffer ));
201-
202- buffer -> size = test_case_data -> lp_buff_size +
203- test_case_data -> hp_buff_size ;
204-
205- switch (buff_type ) {
206- case KPB_SOURCE_BUFFER :
207- buffer -> avail = buffer -> size ;
208- buffer -> w_ptr = & buffer -> w_ptr ; /* setup to NULL */
209- buffer -> addr = buffer -> r_ptr ;
210- buffer -> end_addr = buffer -> r_ptr + buffer -> size ;
211- break ;
212- case KPB_SINK_BUFFER :
213- buffer -> free = buffer -> size ;
214- buffer -> r_ptr = & buffer -> r_ptr ;
215- buffer -> addr = buffer -> w_ptr ;
216- buffer -> end_addr = buffer -> w_ptr + buffer -> size ;
217- break ;
218- }
219-
220- buffer -> cb = NULL ;
221-
222- return buffer ;
223- }
224-
225- /* Mocking comp_register here so we can register our components properly */
135+ /* Mock comp_register here so we can register our components properly */
226136int comp_register (struct comp_driver * drv )
227137{
228138 void * dst ;
@@ -235,6 +145,7 @@ int comp_register(struct comp_driver *drv)
235145 default :
236146 return -1 ;
237147 }
148+
238149 return 0 ;
239150}
240151
@@ -243,103 +154,38 @@ int comp_register(struct comp_driver *drv)
243154 */
244155static void kpb_test_buffer_real_time_stream (void * * state )
245156{
246- int i , ret = 0 ;
247- struct test_case * test_case_data = (struct test_case * )* state ;
248- int buffer_size = test_case_data -> hp_buff_size +
249- test_case_data -> lp_buff_size ;
250- char pattern = 0xAA ;
251- struct comp_buffer * source_test ;
252- struct comp_buffer * sink_test ;
253- char * r_ptr ;
254- /* register KPB component to use its internal functions */
255- sys_comp_kpb_init ();
256- assert_int_equal (kpb_drv_mock .type , SOF_COMP_KPB );
257- assert_non_null (kpb_drv_mock .ops .copy );
258-
259- source_test = list_first_item (& kpb_dev_mock -> bsource_list ,
260- struct comp_buffer ,
261- sink_list );
262- sink_test = list_first_item (& kpb_dev_mock -> bsink_list ,
263- struct comp_buffer ,
264- source_list );
265- assert_ptr_equal (source , source_test );
266- assert_ptr_equal (sink , sink_test );
267-
268- /* fiil source buffer with test data */
269- r_ptr = (char * )source_test -> r_ptr ;
270- for (i = 0 ; i < buffer_size ; i ++ )
271- (* r_ptr ++ ) = pattern ;
272-
273- /* perform kpb_copy test */
274- ret = kpb_drv_mock .ops .copy (kpb_dev_mock );
275-
276- assert_int_equal (ret , 0 );
277- /* verify if source was copied to sink */
278- assert_memory_equal (source_data ,
279- sink_data ,
280- test_case_data -> sink_period_bytes );
281-
282- if (test_case_data -> type == KPB_TEST_COPY_TWO_BUFFERS ) {
283- /* verify if LPSRAM internal buffer was filled properly */
284- assert_memory_equal (source_data ,
285- his_buf_lp ,
286- test_case_data -> lp_buff_size );
287- /* verify if HPSRAM internal buffer was filled properly */
288- assert_memory_equal (source_data ,
289- his_buf_hp ,
290- test_case_data -> hp_buff_size );
291- } else if (test_case_data -> type == KPB_TEST_COPY_ONE_BUFFER ) {
292- /* verify if HPSRAM internal buffer was filled properly */
293- assert_memory_equal (source_data ,
294- his_buf_hp ,
295- test_case_data -> hp_buff_size );
296- }
157+ /*TODO: Perform copy from source to sink */
297158}
298159
299- /* always successful test */
160+ /* Always successful test */
300161static void null_test_success (void * * state )
301162{
302163 (void )state ;
303164}
304165
305- /* test main function */
166+ /* Test main function */
306167int main (void )
307168{
308- struct CMUnitTest tests [3 ];
309- struct test_case internal_double_buffering = {
310- .type = KPB_TEST_COPY_TWO_BUFFERS ,
169+ struct CMUnitTest tests [2 ];
170+ struct test_case internal_buffering = {
311171 .no_buffers = 2 ,
312172 .lp_buff_size = 100 ,
313173 .hp_buff_size = 20 ,
314174 .source_period_bytes = 120 ,
315175 .sink_period_bytes = 120 ,
316176 };
317- struct test_case internal_single_buffering = {
318- .type = KPB_TEST_COPY_ONE_BUFFER ,
319- .no_buffers = 1 ,
320- .lp_buff_size = 0 ,
321- .hp_buff_size = 120 ,
322- .source_period_bytes = 120 ,
323- .sink_period_bytes = 120 ,
324- };
325177
326- tests [0 ].name = "dummy , always successful test" ;
178+ tests [0 ].name = "Dummy , always successful test" ;
327179 tests [0 ].test_func = null_test_success ;
328180 tests [0 ].initial_state = NULL ;
329181 tests [0 ].setup_func = NULL ;
330182 tests [0 ].teardown_func = NULL ;
331183
332184 tests [1 ].name = "KPB real time copy and buffering (Double Buffer)" ;
333185 tests [1 ].test_func = kpb_test_buffer_real_time_stream ;
334- tests [1 ].initial_state = & internal_double_buffering ;
186+ tests [1 ].initial_state = & internal_buffering ;
335187 tests [1 ].setup_func = buffering_test_setup ;
336188 tests [1 ].teardown_func = buffering_test_teardown ;
337189
338- tests [2 ].name = "KPB real time copy and buffering (Single Buffer)" ;
339- tests [2 ].test_func = kpb_test_buffer_real_time_stream ;
340- tests [2 ].initial_state = & internal_single_buffering ;
341- tests [2 ].setup_func = buffering_test_setup ;
342- tests [2 ].teardown_func = buffering_test_teardown ;
343-
344190 return cmocka_run_group_tests (tests , NULL , NULL );
345191}
0 commit comments