1 /*
2 * Copyright (c) 2014-2017, Siemens AG. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include <stdlib.h>
28
29 #include <embb_mtapi_test_config.h>
30 #include <embb_mtapi_test_error.h>
31
32 #include <embb/base/c/memory_allocation.h>
33 #include <embb/base/c/internal/unused.h>
34 #include <embb/base/c/thread.h>
35 #include <embb/base/c/atomic.h>
36
37 #include <embb_mtapi_task_context_t.h>
38 #include <embb_mtapi_thread_context_t.h>
39
40
41 #define JOB_TEST_TASK 42
42 #define TASK_TEST_ID 23
43 #define INVALID_ATTRIBUTE 255
44
45 static embb_atomic_int wait;
46
testErrorAction(const void *,mtapi_size_t,void *,mtapi_size_t,const void *,mtapi_size_t,mtapi_task_context_t *)47 static void testErrorAction(
48 const void* /*args*/,
49 mtapi_size_t /*arg_size*/,
50 void* /*result_buffer*/,
51 mtapi_size_t /*result_buffer_size*/,
52 const void* /*node_local_data*/,
53 mtapi_size_t /*node_local_data_size*/,
54 mtapi_task_context_t* /*task_context*/) {
55 while (1 == embb_atomic_load_int(&wait))
56 embb_thread_yield();
57 embb_atomic_store_int(&wait, 2);
58 }
59
ErrorTest()60 ErrorTest::ErrorTest() {
61 CreateUnit("mtapi error test").Add(&ErrorTest::TestBasic, this);
62 }
63
TestNodeNotInit()64 static void TestNodeNotInit() {
65 mtapi_status_t status;
66 mtapi_affinity_t affinity;
67 mtapi_job_hndl_t job_hndl;
68 mtapi_queue_hndl_t queue_hndl;
69 mtapi_group_hndl_t group_hndl;
70 mtapi_action_hndl_t action_hndl;
71
72 status = MTAPI_ERR_UNKNOWN;
73 mtapi_finalize(&status);
74 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
75
76 status = MTAPI_ERR_UNKNOWN;
77 mtapi_node_id_get(&status);
78 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
79
80 status = MTAPI_ERR_UNKNOWN;
81 mtapi_node_get_attribute(THIS_NODE_ID,
82 MTAPI_NODE_MAX_ACTIONS, MTAPI_NULL, 0,
83 &status);
84 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
85
86 status = MTAPI_ERR_UNKNOWN;
87 mtapi_domain_id_get(&status);
88 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
89
90
91 status = MTAPI_ERR_UNKNOWN;
92 action_hndl = mtapi_action_create(1, testErrorAction, MTAPI_NULL, 0,
93 MTAPI_DEFAULT_ACTION_ATTRIBUTES, &status);
94 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
95
96 status = MTAPI_ERR_UNKNOWN;
97 mtapi_action_set_attribute(action_hndl,
98 MTAPI_ACTION_GLOBAL,
99 MTAPI_ATTRIBUTE_VALUE(MTAPI_TRUE), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
100 &status);
101 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
102
103 status = MTAPI_ERR_UNKNOWN;
104 mtapi_action_get_attribute(action_hndl,
105 MTAPI_ACTION_GLOBAL, MTAPI_NULL, 0,
106 &status);
107 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
108
109 status = MTAPI_ERR_UNKNOWN;
110 mtapi_action_enable(action_hndl, &status);
111 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
112
113 status = MTAPI_ERR_UNKNOWN;
114 mtapi_action_disable(action_hndl, MTAPI_INFINITE, &status);
115 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
116
117 status = MTAPI_ERR_UNKNOWN;
118 mtapi_action_delete(action_hndl, MTAPI_INFINITE, &status);
119 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
120
121
122 status = MTAPI_ERR_UNKNOWN;
123 job_hndl = mtapi_job_get(1, THIS_DOMAIN_ID, &status);
124 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
125
126
127 status = MTAPI_ERR_UNKNOWN;
128 queue_hndl = mtapi_queue_create(1, job_hndl,
129 MTAPI_DEFAULT_QUEUE_ATTRIBUTES, &status);
130 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
131
132 status = MTAPI_ERR_UNKNOWN;
133 mtapi_queue_enable(queue_hndl, &status);
134 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
135
136 status = MTAPI_ERR_UNKNOWN;
137 mtapi_queue_disable(queue_hndl, MTAPI_INFINITE, &status);
138 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
139
140 status = MTAPI_ERR_UNKNOWN;
141 mtapi_queue_delete(queue_hndl, MTAPI_INFINITE, &status);
142 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
143
144 status = MTAPI_ERR_UNKNOWN;
145 mtapi_queue_get_attribute(queue_hndl,
146 MTAPI_QUEUE_DOMAIN_SHARED, MTAPI_NULL, 0, &status);
147 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
148
149 status = MTAPI_ERR_UNKNOWN;
150 mtapi_queue_set_attribute(queue_hndl,
151 MTAPI_QUEUE_DOMAIN_SHARED, MTAPI_NULL, 0, &status);
152 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
153
154
155 status = MTAPI_ERR_UNKNOWN;
156 group_hndl = mtapi_group_create(MTAPI_GROUP_ID_NONE,
157 MTAPI_DEFAULT_GROUP_ATTRIBUTES, &status);
158 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
159
160 status = MTAPI_ERR_UNKNOWN;
161 mtapi_group_delete(group_hndl, &status);
162 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
163
164 status = MTAPI_ERR_UNKNOWN;
165 mtapi_group_get_attribute(group_hndl,
166 0, MTAPI_NULL, 0, &status);
167 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
168
169 status = MTAPI_ERR_UNKNOWN;
170 mtapi_group_set_attribute(group_hndl,
171 0, MTAPI_NULL, 0, &status);
172 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
173
174
175 status = MTAPI_ERR_UNKNOWN;
176 mtapi_affinity_init(&affinity, MTAPI_TRUE, &status);
177 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
178
179 status = MTAPI_ERR_UNKNOWN;
180 mtapi_affinity_set(&affinity, 0, MTAPI_TRUE, &status);
181 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
182
183 status = MTAPI_ERR_UNKNOWN;
184 mtapi_affinity_get(&affinity, 0, &status);
185 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_NOTINIT);
186
187
188 PT_EXPECT_EQ(embb_get_bytes_allocated(), 0u);
189 }
190
TestLimits()191 static void TestLimits() {
192 mtapi_status_t status;
193 mtapi_node_attributes_t node_attr;
194 mtapi_action_hndl_t action_hndl, action_hndl_invalid;
195 mtapi_job_hndl_t job_hndl, job_hndl_invalid;
196 mtapi_task_hndl_t task_hndl, task_hndl_invalid;
197 mtapi_group_hndl_t group_hndl, group_hndl_invalid;
198 mtapi_queue_hndl_t queue_hndl, queue_hndl_invalid;
199 char buffer[128];
200
201 /* initialize a node with all limits set to 1 */
202 status = MTAPI_ERR_UNKNOWN;
203 mtapi_nodeattr_init(&node_attr, &status);
204 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
205
206 mtapi_nodeattr_set(&node_attr,
207 MTAPI_NODE_MAX_ACTIONS,
208 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
209 &status);
210 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
211
212 mtapi_nodeattr_set(&node_attr,
213 MTAPI_NODE_MAX_ACTIONS_PER_JOB,
214 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
215 &status);
216 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
217
218 mtapi_nodeattr_set(&node_attr,
219 MTAPI_NODE_MAX_GROUPS,
220 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
221 &status);
222 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
223
224 mtapi_nodeattr_set(&node_attr,
225 MTAPI_NODE_MAX_QUEUES,
226 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
227 &status);
228 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
229
230 mtapi_nodeattr_set(&node_attr,
231 MTAPI_NODE_MAX_PRIORITIES,
232 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
233 &status);
234 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
235
236 mtapi_nodeattr_set(&node_attr,
237 MTAPI_NODE_MAX_JOBS,
238 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
239 &status);
240 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
241
242 mtapi_nodeattr_set(&node_attr,
243 MTAPI_NODE_MAX_TASKS,
244 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
245 &status);
246 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
247
248 mtapi_nodeattr_set(&node_attr,
249 MTAPI_NODE_QUEUE_LIMIT,
250 MTAPI_ATTRIBUTE_VALUE(1), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
251 &status);
252 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
253
254 mtapi_initialize(THIS_DOMAIN_ID, THIS_NODE_ID,
255 &node_attr, MTAPI_NULL, &status);
256 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
257
258
259 /* try to get an attribute with invalid attribute pointer */
260 status = MTAPI_ERR_UNKNOWN;
261 mtapi_node_get_attribute(THIS_NODE_ID,
262 MTAPI_NODE_MAX_ACTIONS, MTAPI_NULL, 0,
263 &status);
264 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
265
266
267 /* create our test action */
268 status = MTAPI_ERR_UNKNOWN;
269 action_hndl = mtapi_action_create(1, testErrorAction, MTAPI_NULL, 0,
270 MTAPI_DEFAULT_ACTION_ATTRIBUTES, &status);
271 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
272
273 status = MTAPI_ERR_UNKNOWN;
274 mtapi_action_disable(action_hndl, MTAPI_INFINITE, &status);
275 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
276
277 status = MTAPI_ERR_UNKNOWN;
278 mtapi_action_enable(action_hndl, &status);
279 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
280
281 status = MTAPI_ERR_UNKNOWN;
282 mtapi_action_set_attribute(action_hndl, MTAPI_ACTION_GLOBAL,
283 MTAPI_ATTRIBUTE_VALUE(MTAPI_TRUE), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
284 &status);
285 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
286
287 status = MTAPI_ERR_UNKNOWN;
288 mtapi_action_get_attribute(action_hndl,
289 MTAPI_ACTION_GLOBAL, &buffer, MTAPI_ACTION_GLOBAL_SIZE,
290 &status);
291 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
292
293 /* try to get an attribute of that action with invalid attribute pointer */
294 status = MTAPI_ERR_UNKNOWN;
295 mtapi_action_get_attribute(action_hndl,
296 MTAPI_ACTION_GLOBAL, MTAPI_NULL, 0,
297 &status);
298 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
299
300 /* try to get an attribute of that action with invalid attribute number */
301 status = MTAPI_ERR_UNKNOWN;
302 mtapi_action_get_attribute(action_hndl,
303 INVALID_ATTRIBUTE, &buffer, 0,
304 &status);
305 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
306
307 /* try to create another action, since the limit is one this will fail */
308 status = MTAPI_ERR_UNKNOWN;
309 action_hndl_invalid = mtapi_action_create(1, testErrorAction, MTAPI_NULL, 0,
310 MTAPI_DEFAULT_ACTION_ATTRIBUTES, &status);
311 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_LIMIT);
312
313 status = MTAPI_ERR_UNKNOWN;
314 mtapi_action_enable(action_hndl_invalid, &status);
315 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_INVALID);
316
317 status = MTAPI_ERR_UNKNOWN;
318 mtapi_action_disable(action_hndl_invalid, MTAPI_INFINITE, &status);
319 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_INVALID);
320
321 status = MTAPI_ERR_UNKNOWN;
322 mtapi_action_delete(action_hndl_invalid, MTAPI_INFINITE, &status);
323 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_INVALID);
324
325 status = MTAPI_ERR_UNKNOWN;
326 mtapi_action_set_attribute(action_hndl_invalid, MTAPI_ACTION_DOMAIN_SHARED,
327 MTAPI_ATTRIBUTE_VALUE(MTAPI_TRUE), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
328 &status);
329 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_INVALID);
330
331 status = MTAPI_ERR_UNKNOWN;
332 mtapi_action_get_attribute(action_hndl_invalid, MTAPI_ACTION_DOMAIN_SHARED,
333 MTAPI_NULL, 0, &status);
334 PT_EXPECT_EQ(status, MTAPI_ERR_ACTION_INVALID);
335
336
337 /* get handle for job number 1, associated with our action */
338 status = MTAPI_ERR_UNKNOWN;
339 job_hndl = mtapi_job_get(1, THIS_DOMAIN_ID, &status);
340 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
341
342 /* try to get the invalid job number 2, limit is 1 */
343 status = MTAPI_ERR_UNKNOWN;
344 job_hndl_invalid = mtapi_job_get(2, THIS_DOMAIN_ID, &status);
345 PT_EXPECT_EQ(status, MTAPI_ERR_JOB_INVALID);
346
347
348 /* start a task with the invalid job, this will fail */
349 status = MTAPI_ERR_UNKNOWN;
350 mtapi_task_start(MTAPI_TASK_ID_NONE, job_hndl_invalid,
351 MTAPI_NULL, 0, MTAPI_NULL, 0,
352 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
353 PT_EXPECT_EQ(status, MTAPI_ERR_JOB_INVALID);
354
355
356 /* test if executing a task works, so do not wait */
357 embb_atomic_store_int(&wait, 0);
358
359 status = MTAPI_ERR_UNKNOWN;
360 task_hndl = mtapi_task_start(MTAPI_TASK_ID_NONE, job_hndl,
361 MTAPI_NULL, 0, MTAPI_NULL, 0,
362 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
363 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
364
365 status = MTAPI_ERR_UNKNOWN;
366 mtapi_task_wait(task_hndl, MTAPI_INFINITE, &status);
367 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
368
369 /* task should have executed, wait contains 2 */
370 PT_EXPECT_EQ(embb_atomic_load_int(&wait), 2);
371
372
373 /* this time wait, so we can test the task limit */
374 embb_atomic_store_int(&wait, 1);
375
376 /* this task will wait until wait is set to 0 */
377 status = MTAPI_ERR_UNKNOWN;
378 task_hndl = mtapi_task_start(MTAPI_TASK_ID_NONE, job_hndl,
379 MTAPI_NULL, 0, MTAPI_NULL, 0,
380 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
381 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
382
383 /* we cannot start another task since the limit is 1 */
384 status = MTAPI_ERR_UNKNOWN;
385 task_hndl_invalid = mtapi_task_start(MTAPI_TASK_ID_NONE, job_hndl,
386 MTAPI_NULL, 0, MTAPI_NULL, 0,
387 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
388 PT_EXPECT_EQ(status, MTAPI_ERR_TASK_LIMIT);
389
390 /* let the waiting task do its work */
391 embb_atomic_store_int(&wait, 0);
392
393 status = MTAPI_ERR_UNKNOWN;
394 mtapi_task_wait(task_hndl, MTAPI_INFINITE, &status);
395 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
396
397 /* task should have executed, wait contains 2 */
398 PT_EXPECT_EQ(embb_atomic_load_int(&wait), 2);
399
400
401 /* create a group */
402 status = MTAPI_ERR_UNKNOWN;
403 group_hndl = mtapi_group_create(MTAPI_GROUP_ID_NONE,
404 MTAPI_DEFAULT_GROUP_ATTRIBUTES, &status);
405 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
406
407 /* try to create another group, this will fail since the limit is 1 */
408 status = MTAPI_ERR_UNKNOWN;
409 group_hndl_invalid = mtapi_group_create(MTAPI_GROUP_ID_NONE,
410 MTAPI_DEFAULT_GROUP_ATTRIBUTES, &status);
411 PT_EXPECT_EQ(status, MTAPI_ERR_GROUP_LIMIT);
412
413 /* try to delete the invalid group, this will fail */
414 status = MTAPI_ERR_UNKNOWN;
415 mtapi_group_delete(group_hndl_invalid, &status);
416 PT_EXPECT_EQ(status, MTAPI_ERR_GROUP_INVALID);
417
418 /* delete the valid group */
419 status = MTAPI_ERR_UNKNOWN;
420 mtapi_group_delete(group_hndl, &status);
421 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
422
423 /* try to get an attribute of the deleted group */
424 status = MTAPI_ERR_UNKNOWN;
425 mtapi_group_get_attribute(group_hndl, 0, NULL, 0, &status);
426 PT_EXPECT_EQ(status, MTAPI_ERR_GROUP_INVALID);
427
428 /* try to set an attribute of the deleted group */
429 status = MTAPI_ERR_UNKNOWN;
430 mtapi_group_set_attribute(group_hndl, 0, NULL, 0, &status);
431 PT_EXPECT_EQ(status, MTAPI_ERR_GROUP_INVALID);
432
433
434 /* create a queue with invalid job */
435 status = MTAPI_ERR_UNKNOWN;
436 mtapi_queue_create(MTAPI_QUEUE_ID_NONE, job_hndl_invalid,
437 MTAPI_DEFAULT_QUEUE_ATTRIBUTES, &status);
438 PT_EXPECT_EQ(status, MTAPI_ERR_JOB_INVALID);
439
440 /* create a queue */
441 status = MTAPI_ERR_UNKNOWN;
442 queue_hndl = mtapi_queue_create(MTAPI_QUEUE_ID_NONE, job_hndl,
443 MTAPI_DEFAULT_QUEUE_ATTRIBUTES, &status);
444 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
445
446 status = MTAPI_ERR_UNKNOWN;
447 mtapi_queue_disable(queue_hndl, MTAPI_INFINITE, &status);
448 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
449
450 status = MTAPI_ERR_UNKNOWN;
451 mtapi_queue_enable(queue_hndl, &status);
452 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
453
454 /* try to create another queue, this will fail since the limit is 1 */
455 status = MTAPI_ERR_UNKNOWN;
456 queue_hndl_invalid = mtapi_queue_create(MTAPI_QUEUE_ID_NONE, job_hndl,
457 MTAPI_DEFAULT_QUEUE_ATTRIBUTES, &status);
458 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_LIMIT);
459
460 /* try to enable the invalid queue */
461 status = MTAPI_ERR_UNKNOWN;
462 mtapi_queue_enable(queue_hndl_invalid, &status);
463 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_INVALID);
464
465 /* try to disable the invalid queue */
466 status = MTAPI_ERR_UNKNOWN;
467 mtapi_queue_disable(queue_hndl_invalid, MTAPI_INFINITE, &status);
468 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_INVALID);
469
470 /* try to delete the invalid queue */
471 status = MTAPI_ERR_UNKNOWN;
472 mtapi_queue_delete(queue_hndl_invalid, MTAPI_INFINITE, &status);
473 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_INVALID);
474
475 status = MTAPI_ERR_UNKNOWN;
476 mtapi_queue_set_attribute(queue_hndl_invalid, MTAPI_QUEUE_DOMAIN_SHARED,
477 MTAPI_ATTRIBUTE_VALUE(MTAPI_TRUE), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
478 &status);
479 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_INVALID);
480
481 status = MTAPI_ERR_UNKNOWN;
482 mtapi_queue_get_attribute(queue_hndl_invalid, MTAPI_QUEUE_DOMAIN_SHARED,
483 MTAPI_NULL, 0, &status);
484 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_INVALID);
485
486
487 /* now test the task limit via queues, let the first one wait */
488 embb_atomic_store_int(&wait, 1);
489
490 /* enqueue the task */
491 status = MTAPI_ERR_UNKNOWN;
492 task_hndl = mtapi_task_enqueue(MTAPI_TASK_ID_NONE, queue_hndl,
493 MTAPI_NULL, 0, MTAPI_NULL, 0,
494 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
495 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
496
497 /* enqueue another one, this will fail since the limit is one */
498 status = MTAPI_ERR_UNKNOWN;
499 mtapi_task_enqueue(MTAPI_TASK_ID_NONE, queue_hndl,
500 MTAPI_NULL, 0, MTAPI_NULL, 0,
501 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
502 PT_EXPECT_EQ(status, MTAPI_ERR_TASK_LIMIT);
503
504 /* let the valid task do its work */
505 embb_atomic_store_int(&wait, 0);
506
507 status = MTAPI_ERR_UNKNOWN;
508 mtapi_task_wait(task_hndl, MTAPI_INFINITE, &status);
509 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
510
511 /* the task has completed, wait should contain 2 */
512 PT_EXPECT_EQ(embb_atomic_load_int(&wait), 2);
513
514
515 /* disable our queue */
516 status = MTAPI_ERR_UNKNOWN;
517 mtapi_queue_disable(queue_hndl, MTAPI_INFINITE, &status);
518 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
519
520 status = MTAPI_ERR_UNKNOWN;
521 mtapi_queue_set_attribute(queue_hndl, MTAPI_QUEUE_DOMAIN_SHARED,
522 MTAPI_ATTRIBUTE_VALUE(MTAPI_TRUE), MTAPI_ATTRIBUTE_POINTER_AS_VALUE,
523 &status);
524 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
525
526 status = MTAPI_ERR_UNKNOWN;
527 mtapi_queue_get_attribute(queue_hndl, MTAPI_QUEUE_DOMAIN_SHARED,
528 MTAPI_NULL, 0, &status);
529 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
530
531 status = MTAPI_ERR_UNKNOWN;
532 mtapi_queue_get_attribute(queue_hndl, INVALID_ATTRIBUTE,
533 &buffer, 0, &status);
534 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
535
536 status = MTAPI_ERR_UNKNOWN;
537 mtapi_queue_get_attribute(queue_hndl, MTAPI_QUEUE_DOMAIN_SHARED,
538 &buffer, MTAPI_QUEUE_DOMAIN_SHARED_SIZE, &status);
539 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
540
541 /* try to enqueue another task, this will fail since the queue is disabled */
542 status = MTAPI_ERR_UNKNOWN;
543 mtapi_task_enqueue(MTAPI_TASK_ID_NONE, queue_hndl,
544 MTAPI_NULL, 0, MTAPI_NULL, 0,
545 MTAPI_DEFAULT_TASK_ATTRIBUTES, MTAPI_GROUP_NONE, &status);
546 PT_EXPECT_EQ(status, MTAPI_ERR_QUEUE_DISABLED);
547
548 /* disable our queue */
549 status = MTAPI_ERR_UNKNOWN;
550 mtapi_queue_delete(queue_hndl, MTAPI_INFINITE, &status);
551 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
552
553
554 /* and we're done */
555 mtapi_finalize(&status);
556 MTAPI_CHECK_STATUS(status);
557
558 PT_EXPECT_EQ(embb_get_bytes_allocated(), 0u);
559 }
560
TestParameter()561 static void TestParameter() {
562 mtapi_status_t status;
563 mtapi_node_attributes_t node_attr;
564 mtapi_action_attributes_t action_attr;
565 mtapi_task_attributes_t task_attr;
566 mtapi_queue_attributes_t queue_attr;
567 mtapi_group_attributes_t group_attr;
568 mtapi_info_t info;
569
570
571 status = MTAPI_ERR_UNKNOWN;
572 mtapi_nodeattr_init(MTAPI_NULL, &status);
573 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
574
575 status = MTAPI_ERR_UNKNOWN;
576 mtapi_nodeattr_init(&node_attr, &status);
577 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
578
579 status = MTAPI_ERR_UNKNOWN;
580 mtapi_nodeattr_set(&node_attr, INVALID_ATTRIBUTE, NULL, 0, &status);
581 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
582
583
584 status = MTAPI_ERR_UNKNOWN;
585 mtapi_initialize(THIS_DOMAIN_ID, THIS_NODE_ID,
586 MTAPI_DEFAULT_NODE_ATTRIBUTES, MTAPI_NULL, &status);
587 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
588
589 /* try second init */
590 status = MTAPI_ERR_UNKNOWN;
591 mtapi_initialize(THIS_DOMAIN_ID, THIS_NODE_ID,
592 MTAPI_DEFAULT_NODE_ATTRIBUTES, &info, &status);
593 PT_EXPECT_EQ(status, MTAPI_ERR_NODE_INITIALIZED);
594
595
596 status = MTAPI_ERR_UNKNOWN;
597 mtapi_actionattr_init(MTAPI_NULL, &status);
598 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
599
600 status = MTAPI_ERR_UNKNOWN;
601 mtapi_actionattr_init(&action_attr, &status);
602 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
603
604 status = MTAPI_ERR_UNKNOWN;
605 mtapi_actionattr_set(&action_attr, INVALID_ATTRIBUTE, NULL, 0, &status);
606 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
607
608
609 status = MTAPI_ERR_UNKNOWN;
610 mtapi_taskattr_init(MTAPI_NULL, &status);
611 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
612
613 status = MTAPI_ERR_UNKNOWN;
614 mtapi_taskattr_init(&task_attr, &status);
615 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
616
617 status = MTAPI_ERR_UNKNOWN;
618 mtapi_taskattr_set(&task_attr, INVALID_ATTRIBUTE, NULL, 0, &status);
619 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
620
621
622 status = MTAPI_ERR_UNKNOWN;
623 mtapi_queueattr_init(MTAPI_NULL, &status);
624 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
625
626 status = MTAPI_ERR_UNKNOWN;
627 mtapi_queueattr_init(&queue_attr, &status);
628 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
629
630 status = MTAPI_ERR_UNKNOWN;
631 mtapi_queueattr_set(&queue_attr, INVALID_ATTRIBUTE, NULL, 0, &status);
632 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
633
634
635 status = MTAPI_ERR_UNKNOWN;
636 mtapi_groupattr_init(MTAPI_NULL, &status);
637 PT_EXPECT_EQ(status, MTAPI_ERR_PARAMETER);
638
639 status = MTAPI_ERR_UNKNOWN;
640 mtapi_groupattr_init(&group_attr, &status);
641 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
642
643 status = MTAPI_ERR_UNKNOWN;
644 mtapi_groupattr_set(&group_attr, INVALID_ATTRIBUTE, NULL, 0, &status);
645 PT_EXPECT_EQ(status, MTAPI_ERR_ATTR_NUM);
646
647
648 status = MTAPI_ERR_UNKNOWN;
649 mtapi_finalize(&status);
650 MTAPI_CHECK_STATUS(status);
651
652 PT_EXPECT_EQ(embb_get_bytes_allocated(), 0u);
653 }
654
TestContext()655 void TestContext() {
656 mtapi_status_t status;
657 mtapi_task_context_t* task_ctx_invalid = MTAPI_NULL;
658
659 /* the following context is considered valid although it is not a real one,
660 but is checked against the stored pointers and will lead to
661 MTAPI_ERR_CONTEXT_OUTOFCONTEXT */
662 embb_mtapi_thread_context_t thread_ctx_storage;
663 embb_tss_create(&thread_ctx_storage.tss_id);
664 embb_mtapi_task_context_t task_ctx_storage;
665 task_ctx_storage.thread_context = &thread_ctx_storage;
666 mtapi_task_context_t* task_ctx = &task_ctx_storage;
667
668 status = MTAPI_ERR_UNKNOWN;
669 mtapi_initialize(THIS_DOMAIN_ID, THIS_NODE_ID,
670 MTAPI_DEFAULT_NODE_ATTRIBUTES, MTAPI_NULL, &status);
671 PT_EXPECT_EQ(status, MTAPI_SUCCESS);
672
673
674 status = MTAPI_ERR_UNKNOWN;
675 mtapi_context_corenum_get(task_ctx_invalid, &status);
676 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
677
678 status = MTAPI_ERR_UNKNOWN;
679 mtapi_context_instnum_get(task_ctx_invalid, &status);
680 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
681
682 status = MTAPI_ERR_UNKNOWN;
683 mtapi_context_numinst_get(task_ctx_invalid, &status);
684 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
685
686 status = MTAPI_ERR_UNKNOWN;
687 mtapi_context_status_set(task_ctx_invalid, MTAPI_SUCCESS, &status);
688 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
689
690 status = MTAPI_ERR_UNKNOWN;
691 mtapi_context_runtime_notify(task_ctx_invalid,
692 MTAPI_NOTIF_EXECUTE_NEXT, NULL, 0, &status);
693 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
694
695 status = MTAPI_ERR_UNKNOWN;
696 mtapi_context_taskstate_get(task_ctx_invalid, &status);
697 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_INVALID);
698
699
700 status = MTAPI_ERR_UNKNOWN;
701 mtapi_context_corenum_get(task_ctx, &status);
702 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
703
704 status = MTAPI_ERR_UNKNOWN;
705 mtapi_context_instnum_get(task_ctx, &status);
706 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
707
708 status = MTAPI_ERR_UNKNOWN;
709 mtapi_context_numinst_get(task_ctx, &status);
710 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
711
712 status = MTAPI_ERR_UNKNOWN;
713 mtapi_context_status_set(task_ctx, MTAPI_SUCCESS, &status);
714 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
715
716 status = MTAPI_ERR_UNKNOWN;
717 mtapi_context_runtime_notify(task_ctx,
718 MTAPI_NOTIF_EXECUTE_NEXT, NULL, 0, &status);
719 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
720
721 status = MTAPI_ERR_UNKNOWN;
722 mtapi_context_taskstate_get(task_ctx, &status);
723 PT_EXPECT_EQ(status, MTAPI_ERR_CONTEXT_OUTOFCONTEXT);
724
725
726 status = MTAPI_ERR_UNKNOWN;
727 mtapi_finalize(&status);
728 MTAPI_CHECK_STATUS(status);
729
730 embb_tss_delete(&thread_ctx_storage.tss_id);
731
732 PT_EXPECT_EQ(embb_get_bytes_allocated(), 0u);
733 }
734
TestBasic()735 void ErrorTest::TestBasic() {
736 embb_atomic_init_int(&wait, 0);
737
738 TestNodeNotInit();
739 TestParameter();
740 TestLimits();
741 TestContext();
742
743 embb_atomic_destroy_int(&wait);
744 }
745