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