1 /*******************************************************************************
2 
3     Test for EpollSelectDispatcher.unregister behaviour
4 
5     Copyright:
6         Copyright (c) 2018 dunnhumby Germany GmbH.
7         All rights reserved.
8 
9     License:
10         Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
11         Alternatively, this file may be distributed under the terms of the Tango
12         3-Clause BSD License (see LICENSE_BSD.txt for details).
13 
14 *******************************************************************************/
15 
16 module integrationtest.unregisterclient.main;
17 
18 import ocean.transition;
19 
20 import ocean.io.select.EpollSelectDispatcher;
21 import ocean.io.select.client.SelectEvent;
22 import ocean.core.Test;
23 
24 private EpollSelectDispatcher epoll;
25 
26 private SelectEvent event1, event2;
27 private int count;
28 
29 // Corrupts the SelectEvent object. This should make test
30 // segfault at access
31 private void corruptEventObject (SelectEvent client)
32 {
33     version (D_Version2)
34     {
35         auto initializer = client.classinfo.initializer();
36     }
37     else
38     {
39         auto initializer = client.classinfo.init;
40     }
41 
42     ubyte* ptr = cast(ubyte*)client;
43     ptr[0..initializer.length] = 0;
44 }
45 
46 version(UnitTest) {} else
47 void main(istring[] args)
48 {
49     bool handler1()
50     {
51         .count++;
52 
53         // unregister and delete the other instance
54         .epoll.unregister(.event2, true);
55         corruptEventObject(.event2);
56 
57         return false;
58     }
59 
60     bool handler2()
61     {
62         .count++;
63 
64         // unregister and delete the other instance
65         .epoll.unregister(.event1, true);
66         corruptEventObject(.event1);
67 
68         return false;
69     }
70 
71     .epoll = new EpollSelectDispatcher();
72 
73     .event1 = new SelectEvent(&handler1);
74     .event2 = new SelectEvent(&handler2);
75 
76     .epoll.register(.event1);
77     .epoll.register(.event2);
78 
79     // trigger them both
80     .event1.trigger();
81     .event2.trigger();
82 
83     // Do a select loop
84     .epoll.eventLoop();
85 
86     // Make sure only one was handled.
87     test!("==")(.count, 1);
88 }