/* * The MIT License * * Copyright (c) 2009 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package htsjdk.samtools.util; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.util.Arrays; import java.util.List; public class IoUtilTest { private static final File SLURP_TEST_FILE = new File("testdata/htsjdk/samtools/io/slurptest.txt"); private static final File EMPTY_FILE = new File("testdata/htsjdk/samtools/io/empty.txt"); private static final File FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE = new File("testdata/htsjdk/samtools/io/5newline5.txt"); private static final List<String> SLURP_TEST_LINES = Arrays.asList("bacon and rice ","for breakfast ","wont you join me"); private static final String SLURP_TEST_LINE_SEPARATOR = "\n"; private static final String TEST_FILE_PREFIX = "htsjdk-IOUtilTest"; private static final String TEST_FILE_EXTENSIONS[] = { ".txt", ".txt.gz" }; private static final String TEST_STRING = "bar!"; private File existingTempFile; private String systemTempDir; @BeforeClass public void setUp() throws IOException { existingTempFile = File.createTempFile("FiletypeTest.", ".tmp"); existingTempFile.deleteOnExit(); systemTempDir = System.getProperty("java.io.tmpdir"); final File tmpDir = new File(systemTempDir); if (!tmpDir.isDirectory()) tmpDir.mkdir(); if (!tmpDir.isDirectory()) throw new RuntimeException("java.io.tmpdir (" + systemTempDir + ") is not a directory"); } @Test public void testFileReadingAndWriting() throws IOException { String randomizedTestString = TEST_STRING + System.currentTimeMillis(); for (String ext : TEST_FILE_EXTENSIONS) { File f = File.createTempFile(TEST_FILE_PREFIX, ext); f.deleteOnExit(); OutputStream os = IOUtil.openFileForWriting(f); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os)); writer.write(randomizedTestString); writer.close(); InputStream is = IOUtil.openFileForReading(f); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = reader.readLine(); Assert.assertEquals(randomizedTestString, line); } } @Test(groups={"unix"}) public void testGetCanonicalPath() throws IOException { String tmpPath = System.getProperty("java.io.tmpdir"); String userName = System.getProperty("user.name"); if(tmpPath.endsWith(userName)) { tmpPath = tmpPath.substring(0, tmpPath.length() - userName.length()); } File tmpDir = new File(tmpPath, userName); File actual = new File(tmpDir, "actual.txt"); ProcessExecutor.execute(new String[]{"touch", actual.getAbsolutePath()}); File symlink = new File(tmpDir, "symlink.txt"); ProcessExecutor.execute(new String[]{"ln", "-s", actual.getAbsolutePath(), symlink.getAbsolutePath()}); File lnDir = new File(tmpDir, "symLinkDir"); ProcessExecutor.execute(new String[]{"ln", "-s", tmpDir.getAbsolutePath(), lnDir.getAbsolutePath()}); File lnToActual = new File(lnDir, "actual.txt"); File lnToSymlink = new File(lnDir, "symlink.txt"); File files [] = { actual, symlink, lnToActual, lnToSymlink }; for (File f : files) { Assert.assertEquals(IOUtil.getFullCanonicalPath(f), actual.getCanonicalPath()); } actual.delete(); symlink.delete(); lnToActual.delete(); lnToSymlink.delete(); lnDir.delete(); } @Test public void testUtfWriting() throws IOException { final String utf8 = new StringWriter().append((char)168).append((char)197).toString(); for (String ext : TEST_FILE_EXTENSIONS) { final File f = File.createTempFile(TEST_FILE_PREFIX, ext); f.deleteOnExit(); final BufferedWriter writer = IOUtil.openFileForBufferedUtf8Writing(f); writer.write(utf8); CloserUtil.close(writer); final BufferedReader reader = IOUtil.openFileForBufferedUtf8Reading(f); final String line = reader.readLine(); Assert.assertEquals(utf8, line, f.getAbsolutePath()); CloserUtil.close(reader); } } @Test public void slurpLinesTest() throws FileNotFoundException { Assert.assertEquals(IOUtil.slurpLines(SLURP_TEST_FILE), SLURP_TEST_LINES); } @Test public void slurpWhitespaceOnlyFileTest() throws FileNotFoundException { Assert.assertEquals(IOUtil.slurp(FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE), " \n "); } @Test public void slurpEmptyFileTest() throws FileNotFoundException { Assert.assertEquals(IOUtil.slurp(EMPTY_FILE), ""); } @Test public void slurpTest() throws FileNotFoundException { Assert.assertEquals(IOUtil.slurp(SLURP_TEST_FILE), CollectionUtil.join(SLURP_TEST_LINES, SLURP_TEST_LINE_SEPARATOR)); } @Test(dataProvider = "fileTypeTestCases") public void testFileType(final String path, boolean expectedIsRegularFile) { final File file = new File(path); Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile); } @Test(dataProvider = "unixFileTypeTestCases", groups={"unix"}) public void testFileTypeUnix(final String path, boolean expectedIsRegularFile) { final File file = new File(path); Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile); } @DataProvider(name = "fileTypeTestCases") private Object[][] fileTypeTestCases() { return new Object[][] { {existingTempFile.getAbsolutePath(), Boolean.TRUE}, {systemTempDir, Boolean.FALSE} }; } @DataProvider(name = "unixFileTypeTestCases") private Object[][] unixFileTypeTestCases() { return new Object[][] { {"/dev/null", Boolean.FALSE}, {"/dev/stdout", Boolean.FALSE}, {"/non/existent/file", Boolean.TRUE}, }; } }