summaryrefslogtreecommitdiff
path: root/cpp/src/tests/PollerTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/tests/PollerTest.cpp')
-rw-r--r--cpp/src/tests/PollerTest.cpp135
1 files changed, 99 insertions, 36 deletions
diff --git a/cpp/src/tests/PollerTest.cpp b/cpp/src/tests/PollerTest.cpp
index fcb1d0dadf..11337d6be3 100644
--- a/cpp/src/tests/PollerTest.cpp
+++ b/cpp/src/tests/PollerTest.cpp
@@ -7,9 +7,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -23,7 +23,9 @@
* Use socketpair to test the poller
*/
+#include "qpid/sys/IOHandle.h"
#include "qpid/sys/Poller.h"
+#include "qpid/sys/posix/PrivatePosix.h"
#include <string>
#include <iostream>
@@ -48,7 +50,7 @@ int writeALot(int fd, const string& s) {
int lastWrite = ::write(fd, s.c_str(), s.size());
if ( lastWrite >= 0) {
bytesWritten += lastWrite;
- }
+ }
} while (errno != EAGAIN);
return bytesWritten;
}
@@ -56,32 +58,32 @@ int writeALot(int fd, const string& s) {
int readALot(int fd) {
int bytesRead = 0;
char buf[1024];
-
+
do {
errno = 0;
int lastRead = ::read(fd, buf, sizeof(buf));
if ( lastRead >= 0) {
bytesRead += lastRead;
- }
+ }
} while (errno != EAGAIN);
return bytesRead;
}
-int main(int argc, char** argv)
+int main(int /*argc*/, char** /*argv*/)
{
- try
+ try
{
int sv[2];
- int rc = ::socketpair(AF_LOCAL, SOCK_STREAM, 0, sv);
+ int rc = ::socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
assert(rc >= 0);
-
+
// Set non-blocking
rc = ::fcntl(sv[0], F_SETFL, O_NONBLOCK);
assert(rc >= 0);
rc = ::fcntl(sv[1], F_SETFL, O_NONBLOCK);
assert(rc >= 0);
-
+
// Make up a large string
string testString = "This is only a test ... 1,2,3,4,5,6,7,8,9,10;";
for (int i = 0; i < 6; i++)
@@ -95,66 +97,127 @@ int main(int argc, char** argv)
// Write as much as we can to socket 0
int bytesWritten = writeALot(sv[0], testString);
cout << "Wrote(0): " << bytesWritten << " bytes\n";
-
+
// Read as much as we can from socket 1
bytesRead = readALot(sv[1]);
assert(bytesRead == bytesWritten);
cout << "Read(1): " << bytesRead << " bytes\n";
auto_ptr<Poller> poller(new Poller);
-
- PollerHandle h0(sv[0]);
- PollerHandle h1(sv[1]);
-
- poller->addFd(h0, Poller::INOUT);
-
- // Wait for 500ms - h0 should be writable
+
+ PosixIOHandle f0(sv[0]);
+ PosixIOHandle f1(sv[1]);
+
+ PollerHandle h0(f0);
+ PollerHandle h1(f1);
+
+ poller->registerHandle(h0);
+ poller->monitorHandle(h0, Poller::INOUT);
+
+ // h0 should be writable
Poller::Event event = poller->wait();
assert(event.handle == &h0);
- assert(event.dir == Poller::OUT);
-
+ assert(event.type == Poller::WRITABLE);
+
// Write as much as we can to socket 0
bytesWritten = writeALot(sv[0], testString);
cout << "Wrote(0): " << bytesWritten << " bytes\n";
-
+
// Wait for 500ms - h0 no longer writable
- poller->rearmFd(h0);
event = poller->wait(500000000);
assert(event.handle == 0);
// Test we can read it all now
- poller->addFd(h1, Poller::INOUT);
+ poller->registerHandle(h1);
+ poller->monitorHandle(h1, Poller::INOUT);
event = poller->wait();
assert(event.handle == &h1);
- assert(event.dir == Poller::INOUT);
-
+ assert(event.type == Poller::READ_WRITABLE);
+
bytesRead = readALot(sv[1]);
assert(bytesRead == bytesWritten);
cout << "Read(1): " << bytesRead << " bytes\n";
-
- // At this point h1 should have been disabled from the poller
- // (as it was just returned) and h0 can write again
+
+ // Test poller interrupt
+ assert(poller->interrupt(h0) == true);
event = poller->wait();
assert(event.handle == &h0);
- assert(event.dir == Poller::OUT);
+ assert(event.type == Poller::INTERRUPTED);
+
+ // Test multiple interrupts
+ assert(poller->interrupt(h0) == true);
+ assert(poller->interrupt(h1) == true);
- // Now both the handles should be disabled
+ // Make sure we can interrupt them again
+ assert(poller->interrupt(h0) == true);
+ assert(poller->interrupt(h1) == true);
+
+ // Make sure that they both come out
+ event = poller->wait();
+ assert(event.type == Poller::INTERRUPTED);
+ assert(event.handle == &h0 || event.handle == &h1);
+ if (event.handle == &h0) {
+ event = poller->wait();
+ assert(event.type == Poller::INTERRUPTED);
+ assert(event.handle == &h1);
+ } else {
+ event = poller->wait();
+ assert(event.type == Poller::INTERRUPTED);
+ assert(event.handle == &h0);
+ }
+
+ poller->unmonitorHandle(h1, Poller::INOUT);
+
+ event = poller->wait();
+ assert(event.handle == &h0);
+ assert(event.type == Poller::WRITABLE);
+
+ // We didn't write anything so it should still be writable
+ event = poller->wait();
+ assert(event.handle == &h0);
+ assert(event.type == Poller::WRITABLE);
+
+ poller->unmonitorHandle(h0, Poller::INOUT);
+
+ event = poller->wait(500000000);
+ assert(event.handle == 0);
+
+ poller->unregisterHandle(h1);
+ assert(poller->interrupt(h1) == false);
+
+ // close the other end to force a disconnect
+ ::close(sv[1]);
+
+ // Now make sure that we are readable followed by disconnected
+ // and after that we never return again
+ poller->monitorHandle(h0, Poller::INOUT);
event = poller->wait(500000000);
+ assert(event.handle == &h0);
+ assert(event.type == Poller::READABLE);
+ event = poller->wait(500000000);
+ assert(event.handle == &h0);
+ assert(event.type == Poller::DISCONNECTED);
+ event = poller->wait(1500000000);
assert(event.handle == 0);
-
+
+ // Now we're disconnected monitoring should have no effect at all
+ poller->unmonitorHandle(h0, Poller::INOUT);
+ event = poller->wait(1500000000);
+ assert(event.handle == 0);
+
+ poller->unregisterHandle(h0);
+ assert(poller->interrupt(h0) == false);
+
// Test shutdown
poller->shutdown();
event = poller->wait();
assert(event.handle == 0);
- assert(event.dir == Poller::SHUTDOWN);
+ assert(event.type == Poller::SHUTDOWN);
event = poller->wait();
assert(event.handle == 0);
- assert(event.dir == Poller::SHUTDOWN);
+ assert(event.type == Poller::SHUTDOWN);
- poller->delFd(h1);
- poller->delFd(h0);
-
return 0;
} catch (exception& e) {
cout << "Caught exception " << e.what() << "\n";