1dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more
2dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
3dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * this work for additional information regarding copyright ownership.
4dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
5dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * (the "License"); you may not use this file except in compliance with
6dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * the License.  You may obtain a copy of the License at
7dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
8dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
9dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
10dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * Unless required by applicable law or agreed to in writing, software
11dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * See the License for the specific language governing permissions and
14dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * limitations under the License.
15dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
16dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
17e5fea3d504609d22337a5311d3ce0e72314bceeeNarayan Kamathpackage org.apache.harmony.tests.java.nio.channels.spi;
18dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
19dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.IOException;
206bda99d7c5925424038d3ab385e1dfed10ee1c8bPaul Duffinimport java.nio.channels.ClosedSelectorException;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.IllegalBlockingModeException;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.SelectionKey;
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.Selector;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ServerSocketChannel;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.spi.SelectorProvider;
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/**
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * Tests for AbstractSelector and register of its default implementation
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class AbstractSelectorTest extends TestCase {
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#provider()
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_provider() throws IOException {
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector mockSelector = new MockAbstractSelector(SelectorProvider
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .provider());
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(mockSelector.isOpen());
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(SelectorProvider.provider(), mockSelector.provider());
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector = new MockAbstractSelector(null);
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(mockSelector.provider());
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#close()
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_close() throws IOException {
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockAbstractSelector mockSelector = new MockAbstractSelector(
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector.close();
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(mockSelector.isImplCloseSelectorCalled);
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#begin/end()
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_begin_end() throws IOException {
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockAbstractSelector mockSelector = new MockAbstractSelector(
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector = new MockAbstractSelector(SelectorProvider.provider());
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.close();
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // begin twice
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // end twice
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector.close();
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#isOpen()
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_isOpen() throws Exception {
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.isOpen());
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector.close();
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(acceptSelector.isOpen());
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#register(Selector,int)
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_register_LSelectorI() throws Exception {
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SelectionKey acceptKey = ssc.register(acceptSelector,
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectionKey.OP_ACCEPT);
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(ssc.isRegistered());
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(acceptKey);
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.keys().contains(acceptKey));
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#register(Selector,int)
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_register_LSelectorI_error() throws IOException {
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector.close();
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(acceptSelector.isOpen());
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ssc.register(acceptSelector, SelectionKey.OP_ACCEPT);
1396bda99d7c5925424038d3ab385e1dfed10ee1c8bPaul Duffin            fail("should throw ClosedSelectorException");
1406bda99d7c5925424038d3ab385e1dfed10ee1c8bPaul Duffin        } catch (ClosedSelectorException e) {
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector = Selector.open();
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(true);
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ssc.register(acceptSelector, SelectionKey.OP_ACCEPT);
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw IllegalBlockingModeException");
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SelectionKey acceptKey = ssc.register(acceptSelector,
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectionKey.OP_ACCEPT);
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(acceptKey);
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.keys().contains(acceptKey));
159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(ssc.isRegistered());
160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
162