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;
18dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
19dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.File;
20dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.FileInputStream;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.FileOutputStream;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.FileWriter;
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.IOException;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.RandomAccessFile;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.FileChannel;
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.FileLock;
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NonReadableChannelException;
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NonWritableChannelException;
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.OverlappingFileLockException;
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/**
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * API tests for the NIO FileChannel locking APIs
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class FileChannelLockingTest extends TestCase {
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private FileChannel readOnlyChannel;
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private FileChannel writeOnlyChannel;
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private FileChannel readWriteChannel;
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private final String CONTENT = "The best things in life are nearest: Breath in your nostrils, light in your eyes, "
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            + "flowers at your feet, duties at your hand, the path of right just before you. Then do not grasp at the stars, "
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            + "but do life's plain, common work as it comes, certain that daily duties and daily bread are the sweetest "
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            + " things in life.--Robert Louis Stevenson";
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void setUp() throws Exception {
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        super.setUp();
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Create a three temporary files with content.
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        File[] tempFiles = new File[3];
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < tempFiles.length; i++) {
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            tempFiles[i] = File.createTempFile("testing", "tmp");
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            tempFiles[i].deleteOnExit();
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            FileWriter writer = new FileWriter(tempFiles[i]);
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writer.write(CONTENT);
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writer.close();
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Open read, write, and read/write channels on the temp files.
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileInputStream fileInputStream = new FileInputStream(tempFiles[0]);
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readOnlyChannel = fileInputStream.getChannel();
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileOutputStream fileOutputStream = new FileOutputStream(tempFiles[1]);
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeOnlyChannel = fileOutputStream.getChannel();
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        RandomAccessFile randomAccessFile = new RandomAccessFile(tempFiles[2],
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                "rw");
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readWriteChannel = randomAccessFile.getChannel();
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void tearDown() throws IOException {
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (readOnlyChannel != null) {
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.close();
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (writeOnlyChannel != null) {
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeOnlyChannel.close();
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (readWriteChannel != null) {
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readWriteChannel.close();
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_illegalLocks() throws IOException {
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Cannot acquire an exclusive lock on a read-only file channel
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.lock();
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring a full exclusive lock on a read only channel should fail.");
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NonWritableChannelException ex) {
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Expected.
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Cannot get a shared lock on a write-only file channel.
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeOnlyChannel.lock(1, 10, true);
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring a shared lock on a write-only channel should fail.");
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NonReadableChannelException ex) {
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_lockReadWrite() throws IOException {
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Acquire an exclusive lock across the entire file.
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock flock = readWriteChannel.lock();
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (flock != null) {
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            flock.release();
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_illegalLockParameters() throws IOException {
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Cannot lock negative positions
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.lock(-1, 10, true);
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Passing illegal args to lock should fail.");
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException ex) {
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeOnlyChannel.lock(-1, 10, false);
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Passing illegal args to lock should fail.");
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException ex) {
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readWriteChannel.lock(-1, 10, false);
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Passing illegal args to lock should fail.");
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException ex) {
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Lock a range at the front, shared.
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock flock1 = readWriteChannel.lock(22, 110, true);
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Try to acquire an overlapping lock.
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readWriteChannel.lock(75, 210, true);
139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (OverlappingFileLockException exception) {
140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            flock1.release();
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_lockLLZ() throws IOException {
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Lock a range at the front, non-shared.
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock flock1 = readWriteChannel.lock(0, 10, false);
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Lock a shared range further in the same file.
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock flock2 = readWriteChannel.lock(22, 100, true);
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // The spec allows the impl to refuse shared locks
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        flock1.release();
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        flock2.release();
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_tryLock() throws IOException {
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.tryLock();
160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring a full exclusive lock on a read channel should have thrown an exception.");
161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NonWritableChannelException ex) {
162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Expected.
163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_tryLockLLZ() throws IOException {
167dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // It is illegal to request an exclusive lock on a read-only channel
168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
169dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.tryLock(0, 99, false);
170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring exclusive lock on read-only channel should fail");
171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NonWritableChannelException ex) {
172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Expected
173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // It is invalid to request a lock starting before the file start
176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
177dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.tryLock(-99, 0, true);
178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring an illegal lock value should fail.");
179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException ex) {
180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Acquire a valid lock
184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock tmpLock = readOnlyChannel.tryLock(0, 10, true);
185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(tmpLock.isValid());
186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tmpLock.release();
187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Acquire another valid lock -- and don't release it yet
189dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock lock = readOnlyChannel.tryLock(10, 788, true);
190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(lock.isValid());
191dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Overlapping locks are illegal
193dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readOnlyChannel.tryLock(1, 23, true);
195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Acquiring an overlapping lock should fail.");
196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (OverlappingFileLockException ex) {
197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Expected
198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
199dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Adjacent locks are legal
201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        FileLock adjacentLock = readOnlyChannel.tryLock(1, 3, true);
202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(adjacentLock.isValid());
203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        adjacentLock.release();
204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Release longer lived lock
206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        lock.release();
207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
209