test/java/nio/channels/Selector/ChangingInterests.java

Print this page

        

@@ -50,14 +50,10 @@
         return "(" + s + ")";
     }
 
     static void write1(SocketChannel peer) throws IOException {
         peer.write(ByteBuffer.wrap(new byte[1]));
-        // give time for other end to be readable
-        try {
-            Thread.sleep(50);
-        } catch (InterruptedException ignore) { }
     }
 
     static void drain(SocketChannel sc) throws IOException {
         ByteBuffer buf = ByteBuffer.allocate(100);
         int n;

@@ -79,41 +75,69 @@
         sel.selectNow();
         sel.selectedKeys().clear();
 
         // change to the "to" interest set
         key.interestOps(to);
-        System.out.println("select...");
-        int selected = sel.selectNow();
-        System.out.println("" + selected + " channel(s) selected");
 
-        int expected = (to == 0) ? 0 : 1;
-        assertTrue(selected == expected, "Expected " + expected);
+        int readCounter = ((to & OP_READ) == 0) ? 0 : 1;
+        int writeCounter = ((to & OP_WRITE) == 0) ? 0 : 1;
+        System.out.printf("Expected number of readable events %d, writable events %d\n",
+                readCounter, writeCounter);
+
+        long start = System.currentTimeMillis();
+
+        while ((readCounter > 0 || writeCounter > 0) 
+                && System.currentTimeMillis() - start < 10000) {
+            System.out.println("\ttry selection");
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException ignore) {}
+
+            sel.selectNow();
 
         // check selected keys
-        for (SelectionKey k: sel.selectedKeys()) {
+            for (SelectionKey k : sel.selectedKeys()) {
             assertTrue(k == key, "Unexpected key selected");
 
-            boolean readable = k.isReadable();
-            boolean writable = k.isWritable();
-
-            System.out.println("key readable: " + readable);
-            System.out.println("key writable: " + writable);
-
-            if ((to & OP_READ) == 0) {
-                assertTrue(!readable, "Not expected to be readable");
-            } else {
-                assertTrue(readable, "Expected to be readable");
-            }
-
-            if ((to & OP_WRITE) == 0) {
-                assertTrue(!writable, "Not expected to be writable");
-            } else {
-                assertTrue(writable, "Expected to be writable");
+                if (k.isReadable()) {
+                    readCounter--;
+                }
+                if (k.isWritable()) {
+                    writeCounter--;
+                }
+            }
             }
 
+        verifyEvents(to, readCounter, writeCounter);
             sel.selectedKeys().clear();
         }
+
+    /**
+     * Verify actual arrived events with current interest configuration
+     */
+    static void verifyEvents(int op, int readCounter, int writeCounter) {
+        System.out.printf("Verify : %s <-> readCounter %d writeCounter %d\n",
+                toOpsString(op), readCounter, writeCounter);
+        switch (op) {
+            case 0 :
+                assertTrue(readCounter == 0 && writeCounter == 0, 
+                        "Expecting no event");
+                break;
+            case OP_READ :
+                assertTrue(readCounter == 0, "Expecting only read event");
+                break;
+            case OP_WRITE :
+                assertTrue(writeCounter == 0, "Expecting only write event");
+                break;
+            case OP_READ | OP_WRITE :
+                assertTrue(readCounter == 0 && writeCounter <= 0, 
+                        "Expecting read and write events");
+                break;
+            default:
+                assertTrue(false, "Wrong interest setting");
+                break;
+        }
     }
 
     /**
      * Tests that given Selector's select method blocks.
      */