Index: [Article Count Order] [Thread]

Date:  Mon, 2 Oct 2000 12:31:35 +0900
From:  tetsuya@....jp
Subject:  [XP-jp:01000] Re: ファイル	ロックユーティリティ
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <97BA340C0480D411BDA800062939A1890607BD@....jp>
Posted:  Mon, 2 Oct 2000 12:29:29 +0900 
X-Mail-Count: 01000

栗原です。

ちょっと誤解されているかも。

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();
    }
}