package co.codewizards.cloudstore.core.io; import static co.codewizards.cloudstore.core.util.Util.*; import static co.codewizards.cloudstore.core.oio.OioFileFactory.*; import static java.lang.System.*; import java.util.LinkedList; import java.util.List; import java.util.Random; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import co.codewizards.cloudstore.core.io.LockFile; import co.codewizards.cloudstore.core.io.LockFileFactory; import co.codewizards.cloudstore.core.oio.File; import co.codewizards.cloudstore.core.util.IOUtil; public class LockFileTest { private static final Logger logger = LoggerFactory.getLogger(LockFileTest.class); private static Random random = new Random(); { logger.debug("[{}]<init>", Integer.toHexString(identityHashCode(this))); } @Test public void acquireAndReleaseMultipleInstances() { logger.debug("[{}]acquireAndReleaseMultipleInstances: entered.", Integer.toHexString(identityHashCode(this))); final File file = createFile(IOUtil.getTempDir(), Long.toString(System.currentTimeMillis(), 36)); try ( LockFile lockFile1 = LockFileFactory.getInstance().acquire(file, 10000); ) { try ( LockFile lockFile2 = LockFileFactory.getInstance().acquire(file, 10000); ) { System.out.println("Test"); } } } @Test public void multiThreadAcquireAndRelease() throws Exception { logger.debug("[{}]multiThreadAcquireAndRelease: entered.", Integer.toHexString(identityHashCode(this))); final File file = createFile(IOUtil.getTempDir(), Long.toString(System.currentTimeMillis(), 36)); final List<LockFileTestThread> threads = new LinkedList<LockFileTestThread>(); for (int i = 0; i < 10 + random.nextInt(90); ++i) { final LockFileTestThread thread = new LockFileTestThread(i, file); thread.start(); threads.add(thread); } for (final LockFileTestThread thread : threads) { try { thread.join(); } catch (final InterruptedException e) { doNothing(); } if (thread.getError() != null) throw thread.getError(); } } private static class LockFileTestThread extends Thread { private final int threadId; private final File file; private Exception error; public LockFileTestThread(final int threadId, final File file) { this.threadId = threadId; this.file = file; } @Override public void run() { try { for (int i = 0; i < 50; ++i) { acquireAndRelease(i); } } catch (final Exception x) { this.error = x; x.printStackTrace(); } } private void acquireAndRelease(final int invocationId) { System.out.printf("[%s].acquireAndRelease[%s]: entered\n", threadId, invocationId); int time = random.nextInt(200); if (time > 0) { try { Thread.sleep(time); } catch (final InterruptedException e) { doNothing(); } } System.out.printf("[%s].acquireAndRelease[%s]: waited before lock\n", threadId, invocationId); try ( LockFile lockFile = LockFileFactory.getInstance().acquire(file, 10000); ) { System.out.printf("[%s].acquireAndRelease[%s]: locked\n", threadId, invocationId); time = random.nextInt(500); if (time > 0) { try { Thread.sleep(time); } catch (final InterruptedException e) { doNothing(); } } System.out.printf("[%s].acquireAndRelease[%s]: waited before unlock\n", threadId, invocationId); } System.out.printf("[%s].acquireAndRelease[%s]: exiting\n", threadId, invocationId); } public Exception getError() { return error; } } }