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.meta.types.Qualifiers;
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     auto initializer = client.classinfo.initializer();
34 
35     ubyte* ptr = cast(ubyte*)client;
36     ptr[0..initializer.length] = 0;
37 }
38 
39 version (unittest) {} else
40 void main(istring[] args)
41 {
42     bool handler1()
43     {
44         .count++;
45 
46         // unregister and delete the other instance
47         .epoll.unregister(.event2, true);
48         corruptEventObject(.event2);
49 
50         return false;
51     }
52 
53     bool handler2()
54     {
55         .count++;
56 
57         // unregister and delete the other instance
58         .epoll.unregister(.event1, true);
59         corruptEventObject(.event1);
60 
61         return false;
62     }
63 
64     .epoll = new EpollSelectDispatcher();
65 
66     .event1 = new SelectEvent(&handler1);
67     .event2 = new SelectEvent(&handler2);
68 
69     .epoll.register(.event1);
70     .epoll.register(.event2);
71 
72     // trigger them both
73     .event1.trigger();
74     .event2.trigger();
75 
76     // Do a select loop
77     .epoll.eventLoop();
78 
79     // Make sure only one was handled.
80     test!("==")(.count, 1);
81 }