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 }