/*
* 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.Level;
import ch.qos.logback.classic.LoggerContext;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Random;
import net.pms.PMS;
import net.pms.configuration.PmsConfiguration;
import static net.pms.util.Constants.*;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.io.FileUtils;
import static org.assertj.core.api.Assertions.*;
import org.assertj.core.api.Fail;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FileUtilTest {
private final Class<?> CLASS = FileUtilTest.class;
/**
* Set up testing conditions before running the tests.
* @throws ConfigurationException
*/
@Before
public final void setUp() throws ConfigurationException {
// Silence all log messages from the PMS code that is being tested
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
context.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.OFF);;
PMS.get();
PMS.setConfiguration(new PmsConfiguration(false));
}
@Test
public void testIsUrl() throws Exception {
assertThat(FileUtil.isUrl("universalmediaserver.com")).isFalse();
assertThat(FileUtil.isUrl("http://www.universalmediaserver.com")).isTrue();
}
@Test
public void testGetProtocol() throws Exception {
assertThat(FileUtil.getProtocol("universalmediaserver.com")).isNull();
assertThat(FileUtil.getProtocol("http://www.universalmediaserver.com")).isEqualTo("http");
}
@Test
public void testUrlJoin() throws Exception {
assertThat(FileUtil.urlJoin("", "http://www.universalmediaserver.com")).isEqualTo("http://www.universalmediaserver.com");
assertThat(FileUtil.urlJoin("http://www.universalmediaserver.com", "index.php")).isEqualTo("http://www.universalmediaserver.com/index.php");
}
@Test
public void testGetUrlExtension() throws Exception {
assertThat(FileUtil.getUrlExtension("filename")).isNull();
assertThat(FileUtil.getUrlExtension("http://www.universalmediaserver.com/file.html?foo=bar")).isEqualTo("html");
}
@Test
public void testGetFileNameWithoutExtension() throws Exception {
assertThat(FileUtil.getFileNameWithoutExtension("filename.mkv")).isEqualTo("filename");
}
/**
* Note: The method this is testing handles numerous inputs, so this test
* could get very large. It should get much larger than it is now.
*
* @throws java.lang.Exception
*/
@Test
public void testGetFileNameWithRewriting() throws Exception {
// Video of a TV episode
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02.720p.mkv", null)).isEqualTo("Universal Media Server - 102");
// Video of a TV episode in double-digit seasons
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S12E03.720p.mkv", null)).isEqualTo("Universal Media Server - 1203");
// Video spanning two TV episodes
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02E03.720p.mkv", null)).isEqualTo("Universal Media Server - 102-03");
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02-E03.720p.mkv", null)).isEqualTo("Universal Media Server - 102-03");
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S12E03-E04.720p.mkv", null)).isEqualTo("Universal Media Server - 1203-04");
// Video of an extended TV episode
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02.EXTENDED.720p.mkv", null)).isEqualTo("Universal Media Server - 102");
// Video of a TV episode with the "Mysterious Wordplay" title
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02.Mysterious.Wordplay.720p.mkv", null)).isEqualTo("Universal Media Server - 102 - Mysterious Wordplay");
// Video of an uncut TV episode
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02.UNCUT.720p.mkv", null)).isEqualTo("Universal Media Server - 102 (Uncut)");
// Video of an extended cut of a TV episode
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.S01E02.Extended.Cut.720p.mkv", null)).isEqualTo("Universal Media Server - 102 (Extended Cut)");
// Video of a TV episode that airs very regularly
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.2015.01.23.720p.mkv", null)).isEqualTo("Universal Media Server - 2015/01/23");
// Video of a TV episode that airs very regularly and has an episode title
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.2015.01.23.Mysterious.Wordplay.720p.mkv", null)).isEqualTo("Universal Media Server - 2015/01/23 - Mysterious Wordplay");
// Video of a movie
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.2015.720p.mkv", null)).isEqualTo("Universal Media Server (2015)");
// Video of a special edition of a movie
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.Special.Edition.2015.720p.mkv", null)).isEqualTo("Universal Media Server (2015) (Special Edition)");
assertThat(FileUtil.getFileNamePrettified("Universal.Media.Server.2015.Special.Edition.720p.mkv", null)).isEqualTo("Universal Media Server (2015) (Special Edition)");
}
@Test
public void testGetFileCharset_WINDOWS_1251() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-cp1251.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_WINDOWS_1251);
}
@Test
public void testGetFileCharset_KOI8_R() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-koi8-r.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(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.getFileCharsetName(file)).isEqualTo(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.getFileCharsetName(file)).isEqualTo(CHARSET_UTF_8);
}
@Test
public void testGetFileCharset_UTF16_LE() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-utf16-le.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_UTF_16LE);
}
@Test
public void testGetFileCharset_UTF16_BE() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-utf16-be.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_UTF_16BE);
}
@Test
public void testGetFileCharset_UTF32_LE() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-utf32-le.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_UTF_32LE);
}
@Test
public void testGetFileCharset_UTF32_BE() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("russian-utf32-be.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_UTF_32BE);
}
@Test
public void testGetFileCharset_BIG5() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("chinese-gb18030.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(CHARSET_GB18030);
}
@Test
public void testGetFileCharset_GB2312() throws Exception {
File file = FileUtils.toFile(CLASS.getResource("chinese-big5.srt"));
assertThat(FileUtil.getFileCharsetName(file)).isEqualTo(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 {
String s = null;
assertThat(FileUtil.isCharsetUTF8(s)).isFalse();
Charset c = null;
assertThat(FileUtil.isCharsetUTF8(c)).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 {
String s = null;
assertThat(FileUtil.isCharsetUTF16(s)).isFalse();
Charset c = null;
assertThat(FileUtil.isCharsetUTF16(c)).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 testGetFilePermissions() throws FileNotFoundException {
File file = null;
String path = null;
try {
FileUtil.getFilePermissions(file);
Fail.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// As expected
}
try {
FileUtil.getFilePermissions(path);
Fail.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// As expected
}
assertNull("NullIsNull", FileUtil.getFilePermissionsNoThrow(file));
assertNull("NullIsNull", FileUtil.getFilePermissionsNoThrow(path));
assertTrue("CurrentFolderIsFolder", FileUtil.getFilePermissions(new File("")).isFolder());
assertTrue("CurrentFolderIsReadable", FileUtil.getFilePermissions(new File("")).isReadable());
assertTrue("CurrentFolderIsBrowsable", FileUtil.getFilePermissions(new File("")).isBrowsable());
assertTrue("user.dirFolderIsFolder", FileUtil.getFilePermissions(new File(System.getProperty("user.dir"))).isFolder());
try {
FileUtil.getFilePermissions("No such file");
Fail.fail("Expected FileNotFoundException");
} catch (FileNotFoundException e) {
// As expected
}
assertNull("NoSuchFileIsNull", FileUtil.getFilePermissionsNoThrow("No such file"));
file = FileUtils.toFile(CLASS.getResource("english-utf8-with-bom.srt"));
assertTrue("FileIsReadable", FileUtil.getFilePermissions(file).isReadable());
assertTrue("FileIsWritable", FileUtil.getFilePermissions(file).isWritable());
assertFalse("FileIsNotFolder", FileUtil.getFilePermissions(file).isFolder());
assertFalse("FileIsNotBrowsable", FileUtil.getFilePermissions(file).isBrowsable());
assertTrue("ParentIsFolder", FileUtil.getFilePermissions(file.getParentFile()).isFolder());
assertTrue("ParentIsBrowsable", FileUtil.getFilePermissions(file.getParentFile()).isBrowsable());
try {
FileUtil.getFilePermissions(new File(file.getParentFile(),"No such file"));
Fail.fail("Expected FileNotFoundException");
} catch (FileNotFoundException e) {
// As expected
}
assertNull("NoSuchFileIsNull", FileUtil.getFilePermissionsNoThrow(new File(file.getParentFile(),"No such file")));
path = String.format("UMS_temp_writable_file_%d.tmp", new Random().nextInt(10000));
file = new File(System.getProperty("java.io.tmpdir"), path);
try {
if (file.createNewFile()) {
try {
assertTrue("TempFileIsReadable", FileUtil.getFilePermissions(file).isReadable());
assertTrue("TempFileIsWritable", FileUtil.getFilePermissions(file).isWritable());
assertFalse("TempFileIsNotFolder", FileUtil.getFilePermissions(file).isFolder());
assertFalse("TempFileIsNotBrowsable", FileUtil.getFilePermissions(file).isBrowsable());
} finally {
file.delete();
}
}
} catch (IOException e) {
// Move on
}
}
@Test
public void testIsValidFileName() {
assertFalse("ColonIsInvalid", FileUtil.isValidFileName("debug:log"));
assertFalse("SlashIsInvalid", FileUtil.isValidFileName("foo/bar"));
assertTrue("debug.logIsValid", FileUtil.isValidFileName("debug.log"));
}
@Test
public void testAppendPathSeparator() {
assertEquals("AppendEmptyString", FileUtil.appendPathSeparator(""), "/");
assertEquals("AppendSlash", FileUtil.appendPathSeparator("/"), "/");
assertEquals("AppendMissingBackslash", FileUtil.appendPathSeparator("foo\\bar"), "foo\\bar\\");
assertEquals("DontAppendBackslash", FileUtil.appendPathSeparator("foo\\bar\\"), "foo\\bar\\");
assertEquals("AppendMissingSlash", FileUtil.appendPathSeparator("foo/bar"), "foo/bar/");
assertEquals("DontAppendSlash", FileUtil.appendPathSeparator("foo/bar/"), "foo/bar/");
}
}