net.pms.util.FileUtilTest.java Source code

Java tutorial

Introduction

Here is the source code for net.pms.util.FileUtilTest.java

Source

/*
 * PS3 Media Server, for streaming any medias to your PS3.
 * Copyright (C) 2012  I. Sokolov
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; version 2
 * of the License only.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package net.pms.util;

import ch.qos.logback.classic.LoggerContext;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.mozilla.universalchardet.Constants;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import static org.fest.assertions.Assertions.assertThat;

public class FileUtilTest {
    private final Class<?> CLASS = FileUtilTest.class;

    /**
     * Set up testing conditions before running the tests.
     */
    @Before
    public final void setUp() {
        // Silence all log messages from the PMS code that is being tested
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.reset();
    }

    @Test
    public void testGetFileCharset_WINDOWS_1251() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-cp1251.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_WINDOWS_1251);
    }

    @Test
    public void testGetFileCharset_IBM866() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-ibm866.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_IBM866);
    }

    @Test
    public void testGetFileCharset_KOI8_R() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-koi8-r.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_KOI8_R);
    }

    @Test
    public void testGetFileCharset_UTF8_without_BOM() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf8-without-bom.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_8);
    }

    @Test
    public void testGetFileCharset_UTF8_with_BOM() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf8-with-bom.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_8);
    }

    @Test
    public void testGetFileCharset_UTF16_LE() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf16-le.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_16LE);
    }

    @Test
    public void testGetFileCharset_UTF16_BE() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf16-be.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_16BE);
    }

    @Test
    public void testGetFileCharset_UTF32_LE() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf32-le.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_32LE);
    }

    @Test
    public void testGetFileCharset_UTF32_BE() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("russian-utf32-be.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_UTF_32BE);
    }

    @Test
    public void testGetFileCharset_BIG5() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("chinese-gb18030.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_GB18030);
    }

    @Test
    public void testGetFileCharset_GB2312() throws Exception {
        File file = FileUtils.toFile(CLASS.getResource("chinese-big5.srt"));
        assertThat(FileUtil.getFileCharset(file)).isEqualTo(Constants.CHARSET_BIG5);
    }

    @Test
    public void testIsFileUTF8() throws Exception {
        File file_utf8 = FileUtils.toFile(CLASS.getResource("russian-utf8-without-bom.srt"));
        assertThat(FileUtil.isFileUTF8(file_utf8)).isTrue();
        File file_utf8_2 = FileUtils.toFile(CLASS.getResource("russian-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileUTF8(file_utf8_2)).isTrue();
        File file_utf8_3 = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileUTF8(file_utf8_3)).isTrue();
        File file_utf_16 = FileUtils.toFile(CLASS.getResource("russian-utf16-le.srt"));
        assertThat(FileUtil.isFileUTF8(file_utf_16)).isFalse();
        File file_utf_16_2 = FileUtils.toFile(CLASS.getResource("russian-utf16-be.srt"));
        assertThat(FileUtil.isFileUTF8(file_utf_16_2)).isFalse();
        File file_cp1251 = FileUtils.toFile(CLASS.getResource("russian-cp1251.srt"));
        assertThat(FileUtil.isFileUTF8(file_cp1251)).isFalse();
        File file_ch = FileUtils.toFile(CLASS.getResource("chinese-gb18030.srt"));
        assertThat(FileUtil.isFileUTF8(file_ch)).isFalse();
        File file_ch_2 = FileUtils.toFile(CLASS.getResource("chinese-big5.srt"));
        assertThat(FileUtil.isFileUTF8(file_ch_2)).isFalse();
    }

    @Test
    public void testIsCharsetUTF8() throws Exception {
        assertThat(FileUtil.isCharsetUTF8("UTF-8")).isTrue();
        assertThat(FileUtil.isCharsetUTF8("uTf-8")).isTrue();
        assertThat(FileUtil.isCharsetUTF8("uTf-88")).isFalse();
    }

    @Test
    public void testIsCharsetUTF18_withNullOrEmptyCharset() throws Exception {
        assertThat(FileUtil.isCharsetUTF8(null)).isFalse();
        assertThat(FileUtil.isCharsetUTF8("")).isFalse();
    }

    @Test
    public void testIsFileUTF16() throws Exception {
        File file_utf8 = FileUtils.toFile(CLASS.getResource("russian-utf8-without-bom.srt"));
        assertThat(FileUtil.isFileUTF16(file_utf8)).isFalse();
        File file_utf8_2 = FileUtils.toFile(CLASS.getResource("russian-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileUTF16(file_utf8_2)).isFalse();
        File file_utf8_3 = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileUTF16(file_utf8_3)).isFalse();
        File file_utf_16 = FileUtils.toFile(CLASS.getResource("russian-utf16-le.srt"));
        assertThat(FileUtil.isFileUTF16(file_utf_16)).isTrue();
        File file_utf_16_2 = FileUtils.toFile(CLASS.getResource("russian-utf16-be.srt"));
        assertThat(FileUtil.isFileUTF16(file_utf_16_2)).isTrue();
        File file_cp1251 = FileUtils.toFile(CLASS.getResource("russian-cp1251.srt"));
        assertThat(FileUtil.isFileUTF16(file_cp1251)).isFalse();
        File file_ch = FileUtils.toFile(CLASS.getResource("chinese-gb18030.srt"));
        assertThat(FileUtil.isFileUTF16(file_ch)).isFalse();
        File file_ch_2 = FileUtils.toFile(CLASS.getResource("chinese-big5.srt"));
        assertThat(FileUtil.isFileUTF16(file_ch_2)).isFalse();
    }

    @Test
    public void testIsCharsetUTF16() throws Exception {
        assertThat(FileUtil.isCharsetUTF16("UTF-8")).isFalse();
        assertThat(FileUtil.isCharsetUTF16("UTF-16BE")).isTrue();
        assertThat(FileUtil.isCharsetUTF16("UTF-16LE")).isTrue();
        assertThat(FileUtil.isCharsetUTF16("utF-16le")).isTrue();
        assertThat(FileUtil.isCharsetUTF16(" utF-16le")).isFalse();
    }

    @Test
    public void testIsCharsetUTF16_withNullOrEmptyCharset() throws Exception {
        assertThat(FileUtil.isCharsetUTF16(null)).isFalse();
        assertThat(FileUtil.isCharsetUTF16("")).isFalse();
    }

    @Test
    public void testIsCharsetUTF32() throws Exception {
        assertThat(FileUtil.isCharsetUTF32("UTF-8")).isFalse();
        assertThat(FileUtil.isCharsetUTF32("UTF-16BE")).isFalse();
        assertThat(FileUtil.isCharsetUTF32("UTF-32BE")).isTrue();
        assertThat(FileUtil.isCharsetUTF32("UTF-32BE")).isTrue();
        assertThat(FileUtil.isCharsetUTF32("utF-32Be")).isTrue();
        assertThat(FileUtil.isCharsetUTF32("utF-332Be")).isFalse();
    }

    @Test
    public void testIsCharsetUTF32_withNullOrEmptyCharset() throws Exception {
        assertThat(FileUtil.isCharsetUTF32(null)).isFalse();
        assertThat(FileUtil.isCharsetUTF32("")).isFalse();
    }

    @Test
    public void testConvertFileFromUtf16ToUtf8_inputFileIsUTF16LE() throws Exception {
        File file_utf8le = FileUtils.toFile(CLASS.getResource("russian-utf16-le.srt"));
        File outputFile = new File(file_utf8le.getParentFile(), "output-utf8-from-utf16-le.srt");
        outputFile.delete();
        FileUtil.convertFileFromUtf16ToUtf8(file_utf8le, outputFile);
        File file_utf8 = FileUtils.toFile(CLASS.getResource("russian-utf8-without-bom.srt"));
        assertThat(FileUtils.contentEquals(outputFile, file_utf8)).isTrue();
        outputFile.delete();
    }

    @Test
    public void testConvertFileFromUtf16ToUtf8_inputFileIsUTF16BE() throws Exception {
        File file_utf8be = FileUtils.toFile(CLASS.getResource("russian-utf16-be.srt"));
        File outputFile = new File(file_utf8be.getParentFile(), "output-utf8-from-utf16-be.srt");
        outputFile.delete();
        FileUtil.convertFileFromUtf16ToUtf8(file_utf8be, outputFile);
        File file_utf8 = FileUtils.toFile(CLASS.getResource("russian-utf8-with-bom.srt"));
        assertThat(FileUtils.contentEquals(outputFile, file_utf8)).isTrue();
        outputFile.delete();
    }

    @Test(expected = IllegalArgumentException.class)
    public void testConvertFileFromUtf16ToUtf8_notUtf16InputFile() throws Exception {
        File file_cp1251 = FileUtils.toFile(CLASS.getResource("russian-cp1251.srt"));
        FileUtil.convertFileFromUtf16ToUtf8(file_cp1251, new File("output.srt"));
    }

    @Test(expected = FileNotFoundException.class)
    public void testConvertFileFromUtf16ToUtf8_inputFileNotFound() throws Exception {
        FileUtil.convertFileFromUtf16ToUtf8(new File("no-such-file.xyz"), new File("output.srt"));
    }

    @Test
    public void testIsFileReadable() {
        assertThat(FileUtil.isFileReadable(null)).isFalse();
        assertThat(FileUtil.isFileReadable(new File(""))).isFalse();
        assertThat(FileUtil.isFileReadable(new File(System.getProperty("user.dir")))).isFalse();
        assertThat(FileUtil.isFileReadable(new File("no such file"))).isFalse();

        File file = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileReadable(file)).isTrue();

        assertThat(file.getParentFile()).isNotNull();
        assertThat(FileUtil.isFileReadable(new File(file.getParentFile(), "no such file"))).isFalse();
    }

    @Test
    public void testIsFileWritable() throws IOException {
        assertThat(FileUtil.isFileWritable(null)).isFalse();
        assertThat(FileUtil.isFileWritable(new File(""))).isFalse();
        assertThat(FileUtil.isFileWritable(new File(System.getProperty("user.dir")))).isFalse();
        String filename = String.format("pms_temp_writable_file_%d_1.tmp", System.currentTimeMillis());
        assertThat(FileUtil.isFileWritable(new File(filename))).isTrue();

        File file = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileReadable(file)).isTrue();

        assertThat(file.getParentFile()).isNotNull();

        filename = String.format("pms_temp_writable_file_%d_2.tmp", System.currentTimeMillis());
        File tempFile = null;

        try {
            tempFile = new File(file.getParentFile(), filename);
            tempFile.createNewFile();
            assertThat(file.isFile()).isTrue();
            assertThat(FileUtil.isFileReadable(tempFile)).isTrue();
            assertThat(FileUtil.isFileWritable(tempFile)).isTrue();
        } finally {
            if (tempFile != null) {
                tempFile.delete();
            }
        }
    }

    @Test
    public void testIsDirectoryReadable() {
        assertThat(FileUtil.isDirectoryReadable(null)).isFalse();
        assertThat(FileUtil.isDirectoryReadable(new File("no such directory"))).isFalse();
        assertThat(FileUtil.isDirectoryReadable(FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"))))
                .isFalse();

        File file = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileReadable(file)).isTrue();

        File dir = file.getParentFile();
        assertThat(dir).isNotNull();
        assertThat(dir.isDirectory()).isTrue();
        assertThat(FileUtil.isDirectoryReadable(dir)).isTrue();
    }

    @Test
    public void testIsDirectoryWritable() {
        assertThat(FileUtil.isDirectoryWritable(null)).isFalse();
        assertThat(FileUtil.isDirectoryWritable(new File("no such directory"))).isFalse();
        assertThat(FileUtil.isDirectoryWritable(FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"))))
                .isFalse();

        File file = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
        assertThat(FileUtil.isFileReadable(file)).isTrue();

        File dir = file.getParentFile();
        assertThat(dir).isNotNull();
        assertThat(dir.isDirectory()).isTrue();
        assertThat(FileUtil.isDirectoryWritable(dir)).isTrue();
    }

    @Test
    public void testGetExtension() {
        assertThat(FileUtil.getExtension("foo.txt")).isEqualTo("txt");
        assertThat(FileUtil.getExtension("a/b/c.jpg")).isEqualTo("jpg");
        assertThat(FileUtil.getExtension("a/b.txt/c")).isEqualTo("");
        assertThat(FileUtil.getExtension("a/b/c ")).isEqualTo("");
    }

    @Test
    public void testGetFileNameWithoutExtension() {
        assertThat(FileUtil.getFileNameWithoutExtension("a/b/c.txt")).isEqualTo("c");
        assertThat(FileUtil.getFileNameWithoutExtension("a.txt")).isEqualTo("a");
        assertThat(FileUtil.getFileNameWithoutExtension("a/b/c")).isEqualTo("c");
        assertThat(FileUtil.getFileNameWithoutExtension("a/b/c/")).isEqualTo("");
    }
}