/** * Copyright 2015 StreamSets Inc. * * Licensed under the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 com.streamsets.pipeline.lib.io; import com.streamsets.pipeline.sdk.DataCollectorServicesUtils; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.UUID; public class TestLiveFile { private File testDir; @BeforeClass public static void setUpClass() { DataCollectorServicesUtils.loadDefaultServices(); } @Before public void setUp() { testDir = new File("target", UUID.randomUUID().toString()); Assert.assertTrue(testDir.mkdirs()); } @Test public void testFileExistAndGetters() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); String inode = Files.readAttributes(path, BasicFileAttributes.class).fileKey().toString(); LiveFile lf = new LiveFile(path); Assert.assertEquals(path.toAbsolutePath(), lf.getPath()); Assert.assertEquals(inode, lf.getINode()); Assert.assertTrue(lf.toString().contains(path.toString())); } @Test(expected = IOException.class) public void testFileDoesNotExist() throws IOException { Path path = new File(testDir, "1.txt").toPath(); new LiveFile(path); } @Test public void testHashCodeEquals() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile lf = new LiveFile(path); LiveFile lf2 = new LiveFile(path); Assert.assertEquals(lf, lf2); Assert.assertEquals(lf2, lf); Assert.assertEquals(lf.hashCode(), lf2.hashCode()); } @Test public void testSerDeser() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile inf = new LiveFile(path); String ser = inf.serialize(); LiveFile inf2 = LiveFile.deserialize(ser); Assert.assertEquals(inf, inf2); Assert.assertEquals(inf.hashCode(), inf2.hashCode()); } @Test(expected = IllegalArgumentException.class) public void testInvalidSerialization() throws IOException { LiveFile.deserialize("foo"); } @Test public void testSerDeserNotFound() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile inf = new LiveFile(path); String ser = inf.serialize(); Files.delete(path); Assert.assertEquals(inf, LiveFile.deserialize(ser).refresh()); } @Test public void testSerDeserRenamed() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile inf = new LiveFile(path); String ser = inf.serialize(); Path path2 = new File(testDir, "2.txt").getAbsoluteFile().toPath(); Files.move(path, path2); LiveFile inf2 = LiveFile.deserialize(ser); Assert.assertNotEquals(inf, inf2.refresh()); Assert.assertEquals(path2, inf2.refresh().getPath()); } @Test public void testRefreshSameName() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile lf = new LiveFile(path); Assert.assertEquals(lf.refresh(), lf); } @Test public void testRefreshMoved() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile lf = new LiveFile(path); Path path2 = Files.move(path, new File(testDir, "2.txt").toPath()); Assert.assertNotEquals(lf.refresh(), lf); Assert.assertNotEquals(path2, lf.refresh().getPath()); } @Test public void testRefreshDeleted() throws IOException { Path path = Files.createFile(new File(testDir, "1.txt").toPath()); LiveFile lf = new LiveFile(path); Files.delete(path); Assert.assertEquals(lf, lf.refresh()); } //simulating ext4 behavior that inodes are used on file delete @Test public void testInodeReused() throws IOException { Path path = new File(testDir, "1.txt").toPath(); Files.write(path, Arrays.asList("Hello"), StandardCharsets.UTF_8); LiveFile lf1 = new LiveFile(path); Files.write(path, Arrays.asList("Hola"), StandardCharsets.UTF_8); LiveFile lf2 = new LiveFile(path); Assert.assertNotEquals(lf1, lf2); Assert.assertEquals(lf1, lf1.refresh()); } @Test(expected = NoSuchFileException.class) public void testPathIsDir() throws IOException { new LiveFile(testDir.toPath()); } }