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