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;
20dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.AsynchronousCloseException;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.spi.AbstractInterruptibleChannel;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class AbstractInterruptibleChannelTest extends TestCase {
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractInterruptibleChannel#close()
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_close() throws IOException {
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockInterruptibleChannel testMiChannel = new MockInterruptibleChannel();
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(testMiChannel.isOpen());
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testMiChannel.isImplCloseCalled = false;
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testMiChannel.close();
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(testMiChannel.isImplCloseCalled);
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(testMiChannel.isOpen());
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractInterruptibleChannel#begin/end()
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_begin_end() throws IOException {
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean complete = false;
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockInterruptibleChannel testChannel = new MockInterruptibleChannel();
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = true;
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = false;
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = true;
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testChannel.superBegin();
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = true;
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(testChannel.isOpen());
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testChannel.close();
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests AbstractInterruptibleChannel#close/begin/end()
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_close_begin_end() throws IOException {
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean complete = false;
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockInterruptibleChannel testChannel = new MockInterruptibleChannel();
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(testChannel.isOpen());
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = true;
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(testChannel.isOpen());
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testChannel.close();
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = false;
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                testChannel.superEnd(complete);
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("should throw AsynchronousCloseException");
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (AsynchronousCloseException e) {
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // expected
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(testChannel.isOpen());
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superBegin();
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            complete = true;
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testChannel.superEnd(complete);
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(testChannel.isOpen());
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private class MockInterruptibleChannel extends AbstractInterruptibleChannel {
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        private boolean isImplCloseCalled = false;
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public MockInterruptibleChannel() {
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            super();
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        protected void implCloseChannel() throws IOException {
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        	isImplCloseCalled = true;
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // call super.begin() for test
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        void superBegin() {
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            super.begin();
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // call super.end() for test
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        void superEnd(boolean completed) throws AsynchronousCloseException {
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            super.end(completed);
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
136