1 /* Include necessary system files.  */
2 
3 #include "usbx_ux_test_cdc_ecm.h"
4 
5 static ULONG                rsc_cdc_thread_usage;
6 static ULONG                rsc_cdc_mutex_usage;
7 static ULONG                rsc_cdc_event_usage;
8 static ULONG                rsc_cdc_sem_usage;
9 
10 static ULONG                error_callback_counter;
11 
count_error_callback(struct UX_TEST_ACTION_STRUCT * action,VOID * params)12 static void count_error_callback(struct UX_TEST_ACTION_STRUCT *action, VOID *params)
13 {
14 UX_TEST_ERROR_CALLBACK_PARAMS *error = (UX_TEST_ERROR_CALLBACK_PARAMS *)params;
15 
16     // printf("error trap #%d: 0x%x, 0x%x, 0x%x\n", __LINE__, error->system_level, error->system_context, error->error_code);
17     error_callback_counter ++;
18 }
19 
20 static UX_TEST_HCD_SIM_ACTION count_on_error_trap[] = {
21 {   .usbx_function = UX_TEST_OVERRIDE_ERROR_CALLBACK,
22     .action_func = count_error_callback,
23 },
24 {   0   }
25 };
26 
27 /* Define what the initial system looks like.  */
28 #ifdef CTEST
test_application_define(void * first_unused_memory)29 void test_application_define(void *first_unused_memory)
30 #else
31 void usbx_ux_device_class_cdc_ecm_initialize_test_application_define(void *first_unused_memory)
32 #endif
33 {
34 
35     /* Inform user.  */
36     printf("Running ux_device_class_cdc_ecm_initialize Test..................... ");
37 
38     stepinfo("\n");
39 
40     /* Override error trap. */
41     ux_test_link_hooks_from_array(count_on_error_trap);
42 
43     ux_test_cdc_ecm_initialize(first_unused_memory);
44 }
45 
post_init_host()46 static void post_init_host()
47 {
48 
49 UINT                                                status;
50 ULONG                                               mem_free;
51 ULONG                                               test_n;
52 
53 
54     /* Test device deinit. */
55     stepinfo(">>>>>>>>>>>>>>>>>>> Test class deinit\n");
56     ux_test_disconnect_slave();
57     ux_test_disconnect_host_wait_for_enum_completion();
58     ux_device_stack_class_unregister(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry);
59 
60     /* Reset testing counts. */
61     ux_test_utility_sim_thread_create_count_reset();
62     ux_test_utility_sim_mutex_create_count_reset();
63     ux_test_utility_sim_event_create_count_reset();
64     ux_test_utility_sim_sem_create_count_reset();
65 
66     stepinfo(">>>>>>>>>>>>>>>>>>> Test class init\n");
67     UX_TEST_CHECK_SUCCESS(ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter));
68 
69     /* Log create counts for further tests. */
70     rsc_cdc_thread_usage = ux_test_utility_sim_thread_create_count();
71     rsc_cdc_mutex_usage = ux_test_utility_sim_mutex_create_count();
72     rsc_cdc_event_usage = ux_test_utility_sim_event_create_count();
73     rsc_cdc_sem_usage = ux_test_utility_sim_sem_create_count();
74 
75     if (rsc_cdc_thread_usage) stepinfo(">>>>>>>>>>>>>>>>>>> Thread errors cdc_ecm init test\n");
76     mem_free = (~0);
77     for (test_n = 0; test_n < rsc_cdc_thread_usage; test_n ++)
78     {
79 
80         stepinfo("%4ld / %4ld\n", test_n, rsc_cdc_thread_usage - 1);
81 
82         /* Deinit. */
83         ux_device_stack_class_unregister(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry);
84 
85         /* Update memory free level (disconnect) */
86         if (mem_free == (~0))
87             mem_free = _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available;
88         else if (mem_free != _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available)
89         {
90 
91             printf("ERROR #%d.%ld: Memory level different after re-init %ld <> %ld\n", __LINE__, test_n, mem_free, _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
92             test_control_return(1);
93         }
94 
95         /* Set thread error generation */
96         ux_test_utility_sim_thread_error_generation_start(test_n);
97 
98         /* Init. */
99 
100         status = ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter);
101 
102         /* Check error */
103         if (status != UX_THREAD_ERROR && status != NX_PTR_ERROR)
104         {
105 
106             printf("ERROR #%d.%ld: code 0x%x\n", __LINE__, test_n, status);
107             test_control_return(1);
108         }
109         stepinfo("mem free: %ld\n", _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
110     }
111     ux_test_utility_sim_thread_error_generation_stop();
112     if (rsc_cdc_thread_usage) stepinfo("\n");
113 
114     if (rsc_cdc_mutex_usage) stepinfo(">>>>>>>>>>>>>>>>>>> Mutex errors cdc_ecm init test\n");
115     mem_free = (~0);
116     for (test_n = 0; test_n < rsc_cdc_mutex_usage; test_n ++)
117     {
118 
119         stepinfo("%4ld / %4ld\n", test_n, rsc_cdc_mutex_usage - 1);
120 
121         /* Deinit. */
122         ux_device_stack_class_unregister(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry);
123 
124         /* Update memory free level (disconnect) */
125         if (mem_free == (~0))
126             mem_free = _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available;
127         else if (mem_free != _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available)
128         {
129 
130             printf("ERROR #%d.%ld: Memory level different after re-init %ld <> %ld\n", __LINE__, test_n, mem_free, _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
131             test_control_return(1);
132         }
133 
134         /* Set thread error generation */
135         ux_test_utility_sim_mutex_error_generation_start(test_n);
136 
137         /* Init. */
138 
139         status = ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter);
140 
141         /* Check error */
142         if (status != UX_MUTEX_ERROR)
143         {
144 
145             printf("ERROR #%d.%ld: code 0x%x\n", __LINE__, test_n, status);
146             test_control_return(1);
147         }
148         stepinfo("mem free: %ld\n", _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
149     }
150     ux_test_utility_sim_mutex_error_generation_stop();
151     if (rsc_cdc_mutex_usage) stepinfo("\n");
152 
153     if (rsc_cdc_sem_usage) stepinfo(">>>>>>>>>>>>>>>>>>> Semaphore errors cdc_ecm init test\n");
154     mem_free = (~0);
155     for (test_n = 0; test_n < rsc_cdc_sem_usage; test_n ++)
156     {
157 
158         stepinfo("%4ld / %4ld\n", test_n, rsc_cdc_sem_usage - 1);
159 
160         /* Deinit. */
161         ux_device_stack_class_unregister(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry);
162 
163         /* Update memory free level (disconnect) */
164         if (mem_free == (~0))
165             mem_free = _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available;
166         else if (mem_free != _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available)
167         {
168 
169             printf("ERROR #%d.%ld: Memory level different after re-init %ld <> %ld\n", __LINE__, test_n, mem_free, _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
170             test_control_return(1);
171         }
172 
173         /* Set thread error generation */
174         ux_test_utility_sim_sem_error_generation_start(test_n);
175 
176         /* Init. */
177 
178         status = ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter);
179 
180         /* Check error */
181         if (status != UX_SEMAPHORE_ERROR)
182         {
183 
184             printf("ERROR #%d.%ld: code 0x%x\n", __LINE__, test_n, status);
185             test_control_return(1);
186         }
187         stepinfo("mem free: %ld\n", _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
188     }
189     ux_test_utility_sim_sem_error_generation_stop();
190     if (rsc_cdc_sem_usage) stepinfo("\n");
191 
192     if (rsc_cdc_event_usage) stepinfo(">>>>>>>>>>>>>>>>>>> EventFlag errors cdc_ecm init test\n");
193     mem_free = (~0);
194     for (test_n = 0; test_n < rsc_cdc_event_usage; test_n ++)
195     {
196 
197         stepinfo("%4ld / %4ld\n", test_n, rsc_cdc_event_usage - 1);
198 
199         /* Deinit. */
200         ux_device_stack_class_unregister(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry);
201 
202         /* Update memory free level (disconnect) */
203         if (mem_free == (~0))
204             mem_free = _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available;
205         else if (mem_free != _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available)
206         {
207 
208             printf("ERROR #%d.%ld: Memory level different after re-init %ld <> %ld\n", __LINE__, test_n, mem_free, _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
209             test_control_return(1);
210         }
211 
212         /* Set thread error generation */
213         ux_test_utility_sim_event_error_generation_start(test_n);
214 
215         /* Init. */
216 
217         status = ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter);
218 
219         /* Check error */
220         if (status != UX_EVENT_ERROR)
221         {
222 
223             printf("ERROR #%d.%ld: code 0x%x\n", __LINE__, test_n, status);
224             test_control_return(1);
225         }
226         stepinfo("mem free: %ld\n", _ux_system -> ux_system_memory_byte_pool[UX_MEMORY_BYTE_POOL_REGULAR] -> ux_byte_pool_available);
227     }
228     ux_test_utility_sim_event_error_generation_stop();
229     if (rsc_cdc_event_usage) stepinfo("\n");
230 
231     stepinfo(">>>>>>>>>>>>>>>>>>> Test connect to avoid post post operation\n");
232     /* Connect. */
233     UX_TEST_CHECK_SUCCESS(ux_device_stack_class_register(_ux_system_slave_class_cdc_ecm_name, ux_device_class_cdc_ecm_entry, 1, 0, &cdc_ecm_parameter));
234     ux_test_dcd_sim_slave_connect(UX_FULL_SPEED_DEVICE);
235     ux_test_hcd_sim_host_connect(UX_FULL_SPEED_DEVICE);
236     class_cdc_ecm_get_host();
237 
238     stepinfo(">>>>>>>>>>>>>>>>>>> post_init_host done\n");
239 }
240 
post_init_device()241 static void post_init_device()
242 {
243     stepinfo(">>>>>>>>>>>>>>>>>>> post_init_device empty\n");
244 }