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 }