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
17dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespackage org.apache.harmony.nio.tests.java.nio.channels.spi;
18dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
19dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.IOException;
20dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.IllegalBlockingModeException;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.SelectionKey;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.Selector;
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ServerSocketChannel;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.spi.SelectorProvider;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/**
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * Tests for AbstractSelector and register of its default implementation
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class AbstractSelectorTest extends TestCase {
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#provider()
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_provider() throws IOException {
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector mockSelector = new MockAbstractSelector(SelectorProvider
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .provider());
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(mockSelector.isOpen());
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(SelectorProvider.provider(), mockSelector.provider());
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector = new MockAbstractSelector(null);
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(mockSelector.provider());
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#close()
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_close() throws IOException {
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockAbstractSelector mockSelector = new MockAbstractSelector(
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector.close();
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(mockSelector.isImplCloseSelectorCalled);
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#begin/end()
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_begin_end() throws IOException {
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockAbstractSelector mockSelector = new MockAbstractSelector(
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector = new MockAbstractSelector(SelectorProvider.provider());
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.close();
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // begin twice
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // end twice
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        mockSelector.close();
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superBegin();
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            mockSelector.superEnd();
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#isOpen()
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_isOpen() throws Exception {
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.isOpen());
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector.close();
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(acceptSelector.isOpen());
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#register(Selector,int)
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_register_LSelectorI() throws Exception {
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SelectionKey acceptKey = ssc.register(acceptSelector,
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectionKey.OP_ACCEPT);
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(ssc.isRegistered());
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(acceptKey);
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.keys().contains(acceptKey));
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractSelector#register(Selector,int)
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_register_LSelectorI_error() throws IOException {
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Selector acceptSelector = SelectorProvider.provider().openSelector();
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector.close();
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(acceptSelector.isOpen());
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ssc.register(acceptSelector, SelectionKey.OP_ACCEPT);
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw NullPointerException");
139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptSelector = Selector.open();
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(true);
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ssc.register(acceptSelector, SelectionKey.OP_ACCEPT);
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw IllegalBlockingModeException");
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(ssc.isRegistered());
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SelectionKey acceptKey = ssc.register(acceptSelector,
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectionKey.OP_ACCEPT);
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(acceptKey);
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(acceptSelector.keys().contains(acceptKey));
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(ssc.isRegistered());
159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
161