栗原です。
ちょっと誤解されているかも。
Kaoru Hosokawa [mailto:khosokawa@....com] wrote:
> 1.定番の「生成できますか?」テスト
>
> public void testCreateOneMutex() {
> try {
> Mutex aMutex = new Mutex("LockFile");
> assertNotNull(aMutex);
> } catch (Exception e) {
> fail();
> }
> }
まさしくその通りですが、あまりに分かりきったテストは必要でしょうか?
> 2.「同じロックファイルを指定してMutex を作っていいのでしょうか?」
> テスト
>
> public void testCreateMutexUsingSameFile() {
> try {
> String lockFileName = "LockFile";
> Mutex firstMutex = new Mutex(lockFileName);
> Mutex secondMutex = new Mutex(lockFileName);
> fail();
> } catch (MutexException e) {
> assert(true);
> }
> }
これは、失敗ではなくて、作成できても問題ありません。
ただし、一方がattemptしてロックファイルを作成した後、もう一方が
releaseを待たないうちにattemptすると、AttemptTimeOutExceptionが
発生する可能性があるということです。
> 3.「タイムアウトしないでロックをとれますか?」テスト
>
> public void testAttempt() {
> try {
> Mutex aMutex = new Mutex("LockFile");
> aMutex.attempt(10000);
> assert(true);
> } catch (AttemptTimeOutException e) {
> fail();
> }
> }
ロックを取得した後、リリースしないと、次のテストでattemptすると
例外が発生します。
> 4.「複数スレッドからロック取得できるの?」テスト
???
以下に、attemptのテストと、タイムアウトのテストのサンプルを
付加しておきます。
肝心の、attempt-release間の排他性テストが含まれていません:-P
/*
* $Id$
*/
package XP.jp.co.esm.wiki.extremedomo.util;
import junit.framework.*;
import java.io.*;
public class FileLockTest extends TestCase {
public FileLockTest(String name) {
super(name);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(FileLockTest.class);
}
public void testAttempt() {
FileLock lock = new FileLock("lock");
File file = new File("lock");
file.delete("lock"); // 必ずファイルを削除しておく
try {
lock.attempt();
try {
assert(true);
} finally {
lock.release();
}
} catch (FileLockException e) {
fail("failed in lock.");
}
// ロックがリリースされていることをチェック
assert(!file.exists());
}
public void testAttemptTimeOut() throws IOException {
FileLock lock = new FileLock("lock");
File file = new File("lock");
file.createNewFile(); // 必ずファイルを作成しておく
try {
lock.attempt();
try {
// ここに来ちゃ駄目!
fail("Should raise an FileLockException");
} finally {
lock.release();
}
} catch (FileLockException e) {
assert(true);
}
// 他が作成したファイルを削除していないかのチェック
assert(file.exists());
file.delete();
}
}