| // Copyright 2017 The Bazel Authors. All rights reserved. |
| // |
| // 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 com.google.devtools.build.android.junctions; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import java.nio.file.FileSystems; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** Tests for WindowsJunctionCreator. */ |
| @RunWith(JUnit4.class) |
| public class WindowsJunctionCreatorTest { |
| private Path tmproot = null; |
| |
| @Before |
| public void acquireTmpRoot() { |
| String tmpEnv = System.getenv("TEST_TMPDIR"); |
| assertThat(tmpEnv).isNotNull(); |
| tmproot = FileSystems.getDefault().getPath(tmpEnv); |
| // Cast Path to Object to disambiguate which assertThat-overload to use. |
| assertThat((Object) tmproot).isNotNull(); |
| } |
| |
| @Test |
| public void testNullInput() throws Exception { |
| try (JunctionCreator jc = new WindowsJunctionCreator(tmproot.resolve("foo"))) { |
| // Cast Path to Object to disambiguate which assertThat-overload to use. |
| assertThat((Object) jc.create(null)).isNull(); |
| } |
| } |
| |
| @Test |
| public void testFileInput() throws Exception { |
| Path dir = tmproot.resolve("foo"); // [tmproot]/foo/ |
| Path file = dir.resolve("bar"); // [tmproot]/foo/bar |
| Path juncroot = tmproot.resolve("junc"); // [tmproot]/junc/ |
| Path junc = juncroot.resolve("0"); // [tmproot]/junc/0 -> [tmproot]/foo/bar |
| Path fileViaJunc = junc.resolve("bar"); // [tmproot]/junc/0/bar |
| try { |
| Files.createDirectories(dir); |
| Files.createDirectories(juncroot); |
| |
| // Create a scratch file and assert its existence. |
| Files.write(file, "hello".getBytes()); |
| assertThat(file.toFile().exists()).isTrue(); |
| |
| // Assert that the junction doesn't exist yet. |
| assertThat(junc.toFile().exists()).isFalse(); |
| assertThat(fileViaJunc.toFile().exists()).isFalse(); |
| |
| try (JunctionCreator jc = new WindowsJunctionCreator(juncroot)) { |
| // Assert creation of a junction for a file (more precisely, for its parent directory). |
| // Cast Path to Object to disambiguate which assertThat-overload to use. |
| assertThat((Object) jc.create(file)).isEqualTo(fileViaJunc); |
| // Assert that the junction now exists. |
| assertThat(junc.toFile().exists()).isTrue(); |
| // Sanity check: the `file` should still exist. |
| assertThat(file.toFile().exists()).isTrue(); |
| // Assert that the junction indeed points to `dir`, by asserting the existence of `file` |
| // through the junction. |
| assertThat(fileViaJunc.toFile().exists()).isTrue(); |
| } |
| // Assert that WindowsJunctionCreator.close cleaned up the junction and root directory, but |
| // not the files in the directory that the junction pointed to. |
| assertThat(junc.toFile().exists()).isFalse(); |
| assertThat(juncroot.toFile().exists()).isFalse(); |
| // Assert that the `file` and `directory` still exist. Deleting the junction should not have |
| // affected them. |
| assertThat(file.toFile().exists()).isTrue(); |
| assertThat(dir.toFile().exists()).isTrue(); |
| } finally { |
| file.toFile().delete(); |
| dir.toFile().delete(); |
| } |
| } |
| |
| @Test |
| public void testJunctionCaching() throws Exception { |
| Path dir1 = tmproot.resolve("foo"); // [tmproot]/foo/ |
| Path dir2 = dir1.resolve("foo"); // [tmproot]/foo/foo/ |
| Path file1 = dir1.resolve("bar"); // [tmproot]/foo/bar |
| Path file2 = dir1.resolve("baz"); // [tmproot]/foo/baz |
| Path file3 = dir2.resolve("bar"); // [tmproot]/foo/foo/bar |
| Path juncroot = tmproot.resolve("junc"); // [tmproot]/junc/ |
| Path junc0 = juncroot.resolve("0"); // [tmproot]/junc/0 -> [tmproot]/foo/ |
| Path junc1 = juncroot.resolve("1"); // [tmproot]/junc/1 -> [tmproot]/foo/foo/ |
| Path file1junc = junc0.resolve("bar"); // [tmproot]/junc/0/bar |
| Path file2junc = junc0.resolve("baz"); // [tmproot]/junc/0/baz |
| Path file3junc = junc1.resolve("bar"); // [tmproot]/junc/1/bar |
| |
| try { |
| Files.createDirectories(dir2); |
| Files.createDirectories(juncroot); |
| |
| // Create scratch files and assert their existence. |
| Files.write(file1, "i am file1".getBytes()); |
| Files.write(file2, "i am file2".getBytes()); |
| Files.write(file3, "i am file3".getBytes()); |
| assertThat(file1.toFile().exists()).isTrue(); |
| assertThat(file2.toFile().exists()).isTrue(); |
| assertThat(file3.toFile().exists()).isTrue(); |
| |
| // Assert that the junctions don't exist yet. |
| assertThat(junc0.toFile().exists()).isFalse(); |
| assertThat(junc1.toFile().exists()).isFalse(); |
| assertThat(file1junc.toFile().exists()).isFalse(); |
| assertThat(file2junc.toFile().exists()).isFalse(); |
| assertThat(file3junc.toFile().exists()).isFalse(); |
| |
| try (JunctionCreator jc = new WindowsJunctionCreator(juncroot)) { |
| Path dir1juncActual = jc.create(dir1); |
| Path file1juncActual = jc.create(file1); |
| Path dir2juncActual = jc.create(dir2); |
| Path file3juncActual = jc.create(file3); |
| Path file2juncActual = jc.create(file2); |
| |
| // Assert that the junctions now exists. |
| assertThat(dir1juncActual.toFile().exists()).isTrue(); |
| assertThat(dir2juncActual.toFile().exists()).isTrue(); |
| assertThat(file1juncActual.toFile().exists()).isTrue(); |
| assertThat(file2juncActual.toFile().exists()).isTrue(); |
| assertThat(file3juncActual.toFile().exists()).isTrue(); |
| |
| // Assert that the junctions were chached. |
| // Cast Path to Object to disambiguate which assertThat-overload to use. |
| assertThat((Object) dir1juncActual).isEqualTo(junc0); |
| assertThat((Object) dir2juncActual).isEqualTo(junc1); |
| assertThat((Object) file1juncActual).isEqualTo(file1junc); |
| assertThat((Object) file2juncActual).isEqualTo(file2junc); |
| assertThat((Object) file3juncActual).isEqualTo(file3junc); |
| assertThat((Object) file1juncActual.getParent()).isEqualTo(junc0); |
| assertThat((Object) file2juncActual.getParent()).isEqualTo(junc0); |
| assertThat((Object) file3juncActual.getParent()).isEqualTo(junc1); |
| |
| // Assert that the directory junctions indeed point where they should, by asserting the |
| // existence of `file1`, `file2`, and `file3` through them. |
| assertThat(dir1juncActual.resolve("bar").toFile().exists()).isTrue(); |
| assertThat(dir1juncActual.resolve("baz").toFile().exists()).isTrue(); |
| assertThat(dir2juncActual.resolve("bar").toFile().exists()).isTrue(); |
| |
| // Assert that the file junctions indeed point where they should, by asserting the contents |
| // we can read from them. |
| assertThat(Files.readAllBytes(file1junc)).isEqualTo("i am file1".getBytes()); |
| assertThat(Files.readAllBytes(file2junc)).isEqualTo("i am file2".getBytes()); |
| assertThat(Files.readAllBytes(file3junc)).isEqualTo("i am file3".getBytes()); |
| } |
| |
| // Assert that WindowsJunctionCreator.close cleaned up the junction and root directory, but |
| // not the files in the directory that the junction pointed to. |
| assertThat(junc0.toFile().exists()).isFalse(); |
| assertThat(junc1.toFile().exists()).isFalse(); |
| assertThat(file1junc.toFile().exists()).isFalse(); |
| assertThat(file2junc.toFile().exists()).isFalse(); |
| assertThat(file3junc.toFile().exists()).isFalse(); |
| assertThat(juncroot.toFile().exists()).isFalse(); |
| |
| // Assert that the original files (and consequently the directories) still exist. Deleting the |
| // junction should not have affected them. |
| assertThat(file1.toFile().exists()).isTrue(); |
| assertThat(file2.toFile().exists()).isTrue(); |
| assertThat(file3.toFile().exists()).isTrue(); |
| } finally { |
| file3.toFile().delete(); |
| file2.toFile().delete(); |
| file1.toFile().delete(); |
| dir2.toFile().delete(); |
| dir1.toFile().delete(); |
| } |
| } |
| } |