/* * Copyright (c) 2007 NTT DATA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jp.terasoluna.fw.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.lang.reflect.Method; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * FileUtil ブラックボックステスト。<br> * (前提条件)<br> * ・プロパティファイル(system.properties)にて、セッション ディレクトリのベース名が以下のように指定されていること<br> * (デフォルト状態ならOK)<br> * session.dir.base=/tmp/sessions<br> * ・プロパティファイル(test.properties)に、削除テスト用の ディレクトリのベース名を以下のように追加指定すること<br> * fileutiltest.dir.base=/tmp/test<br> */ public class FileUtilTest extends PropertyTestCase { /** * セッションディレクトリ名をプロパティから取得するキー値。 */ public static final String SESSIONS_DIR = "session.dir.base"; /* * セッションディレクトリの絶対パス。 */ String TMP_SESSIONS_DIR = "/tmp/sessions/"; /* * FileUtilテスト用ディレクトリの絶対パス。 */ String TMP_TEST_DIR = "/tmp/test/"; @Before public void setUpData() throws Exception { addProperty("session.dir.base", "/tmp/sessions"); } @After public void cleanUpData() throws Exception { deleteProperty("session.dir.base"); } /** * getSessionDirectoryName(1) (正常系)<br> * 観点:<br> * 入力値:16桁の英数字<br> * 期待値:入力のハッシュ値を16進変換したもの<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectoryName01() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // テスト対象の実行 String result = FileUtil.getSessionDirectoryName(input); // 結果の確認 String hope = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); assertEquals(hope, result); } /** * getSessionDirectoryName(2) (異常系)<br> * 観点:<br> * 入力値:null<br> * 期待値:NullPointerException<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectoryName02() throws Exception { // 入力値の設定 String input = null; // テスト対象の実行 try { FileUtil.getSessionDirectoryName(input); fail(); } catch (NullPointerException e) { return; } } /** * getSessionDirectoryName(3) (正常系)<br> * 観点:<br> * 入力値:""(空文字)<br> * 期待値:入力のハッシュ値を16進変換したもの<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectoryName03() throws Exception { // 入力値の設定 String input = ""; // テスト対象の実行 String result = FileUtil.getSessionDirectoryName(input); // 結果の確認 String hope = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); assertEquals(hope, result); } /** * getSessionDirectory(1) (正常系)<br> * 観点:<br> * 入力値:16桁の英数字<br> * 期待値:入力に対応するディレクトリ名のディレクトリ<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectory01() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // テスト対象の実行 File result = FileUtil.getSessionDirectory(input); // 結果の確認 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File hope = new File(TMP_SESSIONS_DIR + dirName); assertEquals(hope, result); } /** * getSessionDirectory(2) (異常系)<br> * 観点:<br> * 入力値:null<br> * 期待値:NullPointerException<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectory02() throws Exception { // 入力値の設定 String input = null; // テスト対象の実行 try { FileUtil.getSessionDirectory(input); fail(); } catch (NullPointerException e) { return; } } /** * getSessionDirectory(3) (正常系)<br> * 観点:<br> * 入力値:""(空文字)<br> * 期待値:入力に対応するディレクトリ名のディレクトリ<br> * @throws Exception 例外 */ @Test public void testGetSessionDirectory03() throws Exception { // 入力値の設定 String input = ""; // テスト対象の実行 File result = FileUtil.getSessionDirectory(input); // 結果の確認 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File hope = new File(TMP_SESSIONS_DIR + dirName); assertEquals(hope, result); } /** * getSessionDirectory(4) (正常系)<br> * 観点:<br> * プロパティのsession.dir.baseが設定されていない時、 デフォルトのディレクトリが返って来る事を確認する。 * @throws Exception 例外 */ @Test public void testGetSessionDirectory04() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // プロパティ削除 deleteProperty("session.dir.base"); // テスト対象の実行 File result = FileUtil.getSessionDirectory(input); // 結果の確認 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File hope = new File(File.separator + "temp" + File.separator + dirName); assertEquals(hope, result); } /** * getSessionDirectory(5) (正常系)<br> * 観点:<br> * プロパティのsession.dir.baseの値が空文字の時、 デフォルトのディレクトリが返って来る事を確認する。 * @throws Exception 例外 */ @Test public void testGetSessionDirectory05() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // プロパティの値を空文字に設定 deleteProperty("session.dir.base"); addProperty("session.dir.base", ""); // テスト対象の実行 File result = FileUtil.getSessionDirectory(input); // 結果の確認 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File hope = new File(File.separator + "temp" + File.separator + dirName); assertEquals(hope, result); } /** * makeSessionDirectory(1) (正常系)<br> * 観点:<br> * 入力値:16桁の英数字<br> * 期待値:テスト対象の実行が成功し、入力に対応するディレクトリ名の ディレクトリが作成されていること<br> * @throws Exception 例外 */ @Test public void testMakeSessionDirectory01() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // 事前準備 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File dir = new File(TMP_SESSIONS_DIR + dirName); // 作成するディレクトリが存在する場合、削除 if (dir.exists()) { dir.delete(); } // テスト対象の実行 boolean result = FileUtil.makeSessionDirectory(input); // 結果の確認 assertTrue(result); // ディレクトリが作成されていることの確認 if (!dir.exists()) { fail(); } } /** * makeSessionDirectory(2) (正常系)<br> * 観点:<br> * 入力値:16桁の英数字(既に対応するディレクトリが存在する)<br> * 期待値:テスト対象の実行が失敗し、入力に対応するディレクトリ名の ディレクトリが作成されていること<br> * @throws Exception 例外 */ @Test public void testMakeSessionDirectory02() throws Exception { // 入力値の設定 String input = "01234567abcdefgh"; // 事前準備 String dirName = StringUtil.toHexString(HashUtil.hashSHA1(input), ""); File dir = new File(TMP_SESSIONS_DIR + dirName); // 作成されるディレクトリが存在する場合、削除 if (dir.exists()) { dir.delete(); } // テスト対象の実行(2回繰り返す) FileUtil.makeSessionDirectory(input); boolean result = FileUtil.makeSessionDirectory(input); // 結果の確認 assertFalse(result); // ディレクトリが作成されていることの確認 if (!dir.exists()) { fail(); } } /** * makeSessionDirectory(3) (正常系)<br> * 観点:<br> * 入力値:null<br> * 期待値:false<br> * @throws Exception 例外 */ @Test public void testMakeSessionDirectory03() throws Exception { // 入力値の設定 String input = null; // テスト対象の実行 boolean result = FileUtil.makeSessionDirectory(input); // 結果の確認 assertFalse(result); } /** * makeSessionDirectory(4) (正常系)<br> * 観点:<br> * 入力値:""(空文字)<br> * 期待値:false<br> * @throws Exception 例外 */ @Test public void testMakeSessionDirectory04() throws Exception { // 入力値の設定 String input = ""; // 事前準備 // テスト対象の実行 boolean result = FileUtil.makeSessionDirectory(input); // 結果の確認 assertFalse(result); } /** * rmdirs(1) (正常系)<br> * 観点:<br> * 入力値:任意のディレクトリ(サブディレクトリ、ファイルなし)<br> * 期待値:テスト対象の実行が成功し、ディレクトリが削除されること<br> * @throws Exception 例外 */ @Test public void testRmdirs01() throws Exception { // 入力値の設定 File dir = new File(TMP_TEST_DIR + "rmdirs1"); // 事前準備 // 削除するディレクトリが存在しない場合、作成 if (!dir.exists()) { dir.mkdirs(); } // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertTrue(result); // ディレクトリが削除されていることの確認 if (dir.exists()) { fail(); } } /** * rmdirs(2) (正常系)<br> * 観点:<br> * 入力値:存在しないディレクトリ<br> * 期待値:テスト対象の実行が失敗し、ディレクトリが存在しないこと<br> * @throws Exception 例外 */ @Test public void testRmdirs02() throws Exception { // 入力値の設定 File dir = new File(TMP_TEST_DIR + "rmdirs2"); // 事前準備 // ディレクトリが存在する場合、削除 if (dir.exists()) { dir.delete(); } // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertFalse(result); // ディレクトリが存在しないことの確認 if (dir.exists()) { fail(); } } /** * rmdirs(3) (正常系)<br> * 観点:<br> * 入力値:任意のディレクトリ(サブディレクトリ、ファイルあり)<br> * 期待値:テスト対象の実行が成功し、ディレクトリが削除されること<br> * @throws Exception 例外 */ @Test public void testRmdirs03() throws Exception { // 入力値の設定 File dir = new File(TMP_TEST_DIR + "rmdirs3"); // 事前準備 // サブディレクトリ、ファイルの設定 File subdir = new File(TMP_TEST_DIR + "rmdirs3/tmp"); File file = new File(TMP_TEST_DIR + "rmdirs3/tmp.txt"); // 削除するディレクトリ、ファイルが存在しない場合、作成 if (!dir.exists()) { dir.mkdirs(); } if (!subdir.exists()) { subdir.mkdirs(); } if (!file.exists()) { file.createNewFile(); } // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertTrue(result); // 親ディレクトリが存在しないことの確認 if (dir.exists()) { fail(); } } /** * rmdirs(4) (正常系)<br> * 観点:<br> * 入力値:null<br> * 期待値:false<br> * @throws Exception 例外 */ @Test public void testRmdirs04() throws Exception { // 入力値の設定 File dir = null; // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertFalse(result); } /** * rmdirs(5) (正常系)<br> * 観点:<br> * 入力値:""(空文字)のパスのFileオブジェクト<br> * 期待値:false<br> * @throws Exception 例外 */ @Test public void testRmdirs05() throws Exception { // 入力値の設定 File dir = new File(""); // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertFalse(result); } /** * rmdirs(6) (正常系)<br> * 観点:<br> * 入力値:読み取り専用のディレクトリ(サブディレクトリ、ファイルなし)<br> * 期待値:テスト対象の実行が成功し、ディレクトリが削除されること<br> * @throws Exception 例外 */ @Test public void testRmdirs06() throws Exception { // 入力値の設定 File dir = new File(TMP_TEST_DIR + "rmdirs6"); // 事前準備 // ディレクトリは作成しておく // 読み取り専用属性もそこで設定する if (!dir.exists()) { dir.mkdir(); dir.setReadOnly(); } // テスト対象の実行 boolean result = FileUtil.rmdirs(dir); // 結果の確認 assertTrue(result); // ディレクトリが削除されていることの確認 if (dir.exists()) { fail(); } } /** * removeSessionDirectory01() (正常系)<br> * 観点:A<br> * 入力値:sessionID="01234567abcdefgh"<br> * 期待値:true<br> * セッションIDに対応するディレクトリが存在し、ディレクトリの削除に成功した時、 trueが返却されることを確認する。 * @throws Exception 例外 */ @Test public void testRemoveSessionDirectory01() throws Exception { // 初期設定 String input = "01234567abcdefgh"; Method method = FileUtil.class.getDeclaredMethod("makeSessionDirectory", String.class); method.setAccessible(true); method.invoke(FileUtil.class, input); // テスト実行 // 結果確認 assertTrue(FileUtil.removeSessionDirectory(input)); } /** * removeSessionDirectory02() (正常系)<br> * 観点:A<br> * 入力値:sessionID="01234567abcdefgh"<br> * 期待値:false<br> * セッションIDに対応するディレクトリが存在しないとき、 ディレクトリの削除に失敗しfalseが返却されることを確認する。 * @throws Exception 例外 */ @Test public void testRemoveSessionDirectory02() throws Exception { // 初期設定 String input = "01234567abcdefgh"; Method method = FileUtil.class.getDeclaredMethod("getSessionDirectory", String.class); method.setAccessible(true); File dir = (File) method.invoke(FileUtil.class, input); dir.delete(); // テスト実行 // 結果確認 assertFalse(FileUtil.removeSessionDirectory(input)); } /** * removeSessionDirectory03() (異常系)<br> * 観点:C,G<br> * 入力値:sessionID=null<br> * 期待値:NullPOinterException<br> * セッションIDがnullの時、NullPointerExceptionが発生することを確認する。 * @throws Exception 例外 */ @Test public void testRemoveSessionDirectory03() throws Exception { try { // テスト対象の実行 FileUtil.removeSessionDirectory(null); fail(); } catch (NullPointerException e) { return; } // 結果確認 fail(); } }