1
1
/* mbed Microcontroller Library
2
- * Copyright (c) 2017 ARM Limited
2
+ * Copyright (c) 2017-2019 ARM Limited
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -322,6 +322,145 @@ void time_left_test()
322
322
TEST_ASSERT_EQUAL (-1 , queue.time_left (0 ));
323
323
}
324
324
325
+ void f5 (int a1, int a2, int a3, int a4, int a5)
326
+ {
327
+ touched = true ;
328
+ }
329
+
330
+ class EventTest {
331
+ public:
332
+ EventTest () : counter() {}
333
+ void f0 ()
334
+ {
335
+ counter++;
336
+ }
337
+ void f1 (int a)
338
+ {
339
+ counter += a;
340
+ }
341
+ void f5 (int a, int b, int c, int d, int e)
342
+ {
343
+ counter += a + b + c + d + e;
344
+ }
345
+ uint32_t counter;
346
+ };
347
+
348
+ /* * Test that queue executes both dynamic and user allocated events.
349
+ *
350
+ * Given queue is initialized and its size is set to store three Event at max in its internal memory.
351
+ * When post queue allocated event.
352
+ * Then only three event can be posted due to queue memory size.
353
+ * When post user allocated evens.
354
+ * Then number of posted events is not limited by queue memory size.
355
+ * When both Event and UserAllocatedEvent are posted and queue dispatch is called.
356
+ * Then both types of events are executed properly.
357
+ *
358
+ */
359
+ void mixed_dynamic_static_events_queue_test ()
360
+ {
361
+ {
362
+ EventQueue queue (9 * EVENTS_EVENT_SIZE);
363
+
364
+ EventTest e1_test;
365
+ Event<void ()> e1 = queue.event (&e1_test, &EventTest::f0);
366
+ int id1 = e1 .post ();
367
+ TEST_ASSERT_NOT_EQUAL (0 , id1);
368
+ EventTest e2_test;
369
+ Event<void ()> e2 = queue.event (&e2_test, &EventTest::f1, 3 );
370
+ int id2 = e2 .post ();
371
+ TEST_ASSERT_NOT_EQUAL (0 , id2);
372
+ EventTest e3_test;
373
+ Event<void ()> e3 = queue.event (&e3_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
374
+ int id3 = e3 .post ();
375
+ TEST_ASSERT_NOT_EQUAL (0 , id3);
376
+
377
+
378
+ auto ue0 = make_user_allocated_event (func0);
379
+ EventTest ue1_test;
380
+ auto ue1 = make_user_allocated_event (&ue1_test, &EventTest::f0);
381
+ EventTest ue2_test;
382
+ auto ue2 = make_user_allocated_event (&ue2_test, &EventTest::f1, 3 );
383
+ EventTest ue3_test;
384
+ auto ue3 = make_user_allocated_event (&ue3_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
385
+ EventTest ue4_test;
386
+ auto ue4 = make_user_allocated_event (&ue4_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
387
+
388
+ touched = false ;
389
+
390
+ ue0.call_on (&queue);
391
+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
392
+ ue1.call_on (&queue);
393
+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
394
+ ue2.call_on (&queue);
395
+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
396
+ ue3.call_on (&queue);
397
+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
398
+ ue4.call_on (&queue);
399
+ ue4.cancel ();
400
+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
401
+ ue4.cancel ();
402
+ e2 .cancel ();
403
+
404
+ queue.dispatch (1 );
405
+
406
+ TEST_ASSERT_EQUAL (true , touched);
407
+ TEST_ASSERT_EQUAL (1 , ue1_test.counter );
408
+ TEST_ASSERT_EQUAL (3 , ue2_test.counter );
409
+ TEST_ASSERT_EQUAL (15 , ue3_test.counter );
410
+ TEST_ASSERT_EQUAL (0 , ue4_test.counter );
411
+ TEST_ASSERT_EQUAL (1 , e1_test.counter );
412
+ TEST_ASSERT_EQUAL (0 , e2_test.counter );
413
+ TEST_ASSERT_EQUAL (15 , e3_test.counter );
414
+ }
415
+ }
416
+
417
+
418
+ static EventQueue g_queue (0 );
419
+
420
+ /* * Test that static queue executes user allocated events.
421
+ *
422
+ * Given static queue is initialized
423
+ * When post user allocated evens.
424
+ * Then UserAllocatedEvent are posted and dispatched without any error.
425
+ */
426
+ void static_events_queue_test ()
427
+ {
428
+ // check that no dynamic event can be posted
429
+ Event<void ()> e0 = g_queue.event (func0);
430
+ TEST_ASSERT_EQUAL (0 , e0 .post ());
431
+
432
+ auto ue0 = g_queue.make_user_allocated_event (func0);
433
+ EventTest test1;
434
+ auto ue1 = make_user_allocated_event (&test1, &EventTest::f0);
435
+ EventTest test2;
436
+ auto ue2 = g_queue.make_user_allocated_event (&test2, &EventTest::f1, 3 );
437
+ EventTest test3;
438
+ auto ue3 = make_user_allocated_event (&test3, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
439
+ EventTest test4;
440
+ auto ue4 = g_queue.make_user_allocated_event (&test4, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
441
+
442
+ ue0.call ();
443
+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
444
+ ue1.call_on (&g_queue);
445
+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
446
+ ue2 ();
447
+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
448
+ ue3.call_on (&g_queue);
449
+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
450
+ ue4.call ();
451
+ ue4.cancel ();
452
+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
453
+ g_queue.cancel (&ue4);
454
+
455
+ g_queue.dispatch (1 );
456
+
457
+ TEST_ASSERT_EQUAL (1 , test1.counter );
458
+ TEST_ASSERT_EQUAL (3 , test2.counter );
459
+ TEST_ASSERT_EQUAL (15 , test3.counter );
460
+ TEST_ASSERT_EQUAL (0 , test4.counter );
461
+
462
+ }
463
+
325
464
// Test setup
326
465
utest::v1::status_t test_setup (const size_t number_of_cases)
327
466
{
@@ -348,6 +487,9 @@ const Case cases[] = {
348
487
Case (" Testing the event inference" , event_inference_test),
349
488
350
489
Case (" Testing time_left" , time_left_test),
490
+ Case (" Testing mixed dynamic & static events queue" , mixed_dynamic_static_events_queue_test),
491
+ Case (" Testing static events queue" , static_events_queue_test)
492
+
351
493
};
352
494
353
495
Specification specification (test_setup, cases);
0 commit comments