Browse Source

Port SymbolicLinkPreservingTarIT to spock (#86758)

Part of #86720
Rene Groeschke 3 years ago
parent
commit
480abeaa9d

+ 159 - 0
build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/SymbolicLinkPreservingTarFuncTest.groovy

@@ -0,0 +1,159 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+package org.elasticsearch.gradle.internal
+
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream
+import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream
+import org.elasticsearch.gradle.fixtures.AbstractGradleFuncTest
+import org.gradle.api.GradleException
+import spock.lang.Unroll
+
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.util.function.Function
+
+class SymbolicLinkPreservingTarFuncTest extends AbstractGradleFuncTest {
+
+    def setup() {
+        def archiveSourceRoot = testProjectDir.getRoot().toPath().resolve("archiveRoot")
+        Files.createDirectory(archiveSourceRoot)
+        final Path realFolder = archiveSourceRoot.resolve("real-folder")
+        Files.createDirectory(realFolder);
+        Files.createFile(realFolder.resolve("file"));
+        Files.createSymbolicLink(realFolder.resolve("link-to-file"), Paths.get("./file"));
+        final Path linkInFolder = archiveSourceRoot.resolve("link-in-folder");
+        Files.createDirectory(linkInFolder);
+        Files.createSymbolicLink(linkInFolder.resolve("link-to-file"), Paths.get("../real-folder/file"));
+        final Path linkToRealFolder = archiveSourceRoot.resolve("link-to-real-folder");
+        Files.createSymbolicLink(linkToRealFolder, Paths.get("./real-folder"));
+
+        buildFile << """
+import org.elasticsearch.gradle.internal.SymbolicLinkPreservingTar
+
+plugins {
+  id 'base'
+  id 'distribution'
+  // we need to add one of our plugins to get things on this classpath
+  id 'elasticsearch.global-build-info' apply false
+}
+"""
+    }
+
+    @Unroll
+    def "build BZip2 tar with preserverTimestamp #preserverTimestamp"() {
+        buildFile << """
+tasks.register("buildBZip2Tar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
+  tar.archiveExtension = 'tar.bz2'
+  tar.compression = Compression.BZIP2
+  tar.preserveFileTimestamps = ${preserverTimestamp}
+  from fileTree("archiveRoot")
+}
+"""
+        when:
+        gradleRunner("buildBZip2Tar", "-s").build();
+
+        then:
+        assertTar(file("build/distributions/hello-world.tar.bz2"), BZip2CompressorInputStream::new, preserverTimestamp)
+        where:
+        preserverTimestamp << [true, false]
+    }
+
+    @Unroll
+    def "build GZipTar tar with preserverTimestamp #preserverTimestamp"() {
+        buildFile << """
+tasks.register("buildGZipTar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
+  tar.archiveExtension = 'tar.gz'
+  tar.compression = Compression.GZIP
+  tar.preserveFileTimestamps = ${preserverTimestamp}
+  from fileTree("archiveRoot")
+}
+"""
+        when:
+        gradleRunner("buildGZipTar").build();
+
+        then:
+        assertTar(file("build/distributions/hello-world.tar.gz"), GzipCompressorInputStream::new, preserverTimestamp)
+        where:
+        preserverTimestamp << [true, false]
+    }
+
+    @Unroll
+    def "build tar with preserverTimestamp #preserverTimestamp"() {
+        buildFile << """
+tasks.register("buildTar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
+  tar.archiveExtension = 'tar'
+  tar.preserveFileTimestamps = ${preserverTimestamp}
+  from fileTree("archiveRoot")
+}
+"""
+        when:
+        gradleRunner("buildTar").build();
+
+        then:
+        assertTar(file("build/distributions/hello-world.tar"), fis -> fis, preserverTimestamp)
+        where:
+        preserverTimestamp << [true, false]
+    }
+
+    private boolean assertTar(final File archive, final Function<? super FileInputStream, ? extends InputStream> wrapper, boolean preserveFileTimestamps)
+            throws IOException {
+        try (TarArchiveInputStream tar = new TarArchiveInputStream(wrapper.apply(new FileInputStream(archive)))) {
+            TarArchiveEntry entry = tar.getNextTarEntry();
+            boolean realFolderEntry = false;
+            boolean fileEntry = false;
+            boolean linkToFileEntry = false;
+            boolean linkInFolderEntry = false;
+            boolean linkInFolderLinkToFileEntry = false;
+            boolean linkToRealFolderEntry = false;
+            while (entry != null) {
+                if (entry.getName().equals("real-folder/")) {
+                    assert entry.isDirectory()
+                    realFolderEntry = true
+                } else if (entry.getName().equals("real-folder/file")) {
+                    assert entry.isFile()
+                    fileEntry = true
+                } else if (entry.getName().equals("real-folder/link-to-file")) {
+                    assert entry.isSymbolicLink()
+                    assert normalized(entry.getLinkName()) == "./file"
+                    linkToFileEntry = true
+                } else if (entry.getName().equals("link-in-folder/")) {
+                    assert entry.isDirectory()
+                    linkInFolderEntry = true
+                } else if (entry.getName().equals("link-in-folder/link-to-file")) {
+                    assert entry.isSymbolicLink()
+                    assert normalized(entry.getLinkName()) == "../real-folder/file"
+                    linkInFolderLinkToFileEntry = true
+                } else if (entry.getName().equals("link-to-real-folder")) {
+                    assert entry.isSymbolicLink()
+                    assert normalized(entry.getLinkName()) == "./real-folder"
+                    linkToRealFolderEntry = true
+                } else {
+                    throw new GradleException("unexpected entry [" + entry.getName() + "]")
+                }
+                if (preserveFileTimestamps) {
+                    assert entry.getModTime().getTime() > 0
+                } else {
+                    assert entry.getModTime().getTime() == 0L
+                }
+                entry = tar.getNextTarEntry()
+            }
+            assert realFolderEntry
+            assert fileEntry
+            assert linkToFileEntry
+            assert linkInFolderEntry
+            assert linkInFolderLinkToFileEntry
+            assert linkToRealFolderEntry
+        }
+        true
+    }
+
+}

+ 0 - 154
build-tools-internal/src/integTest/java/org/elasticsearch/gradle/internal/SymbolicLinkPreservingTarIT.java

@@ -1,154 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-package org.elasticsearch.gradle.internal;
-
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
-import org.elasticsearch.gradle.internal.test.GradleIntegrationTestCase;
-import org.gradle.api.GradleException;
-import org.gradle.testkit.runner.GradleRunner;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.rules.TemporaryFolder;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import static org.hamcrest.CoreMatchers.anyOf;
-import static org.hamcrest.CoreMatchers.equalTo;
-
-public class SymbolicLinkPreservingTarIT extends GradleIntegrationTestCase {
-
-    @Override
-    public String projectName() {
-        return "symbolic-link-preserving-tar";
-    }
-
-    @Rule
-    public final TemporaryFolder temporaryFolder = new TemporaryFolder();
-
-    @Before
-    public void before() throws IOException {
-        final Path realFolder = temporaryFolder.getRoot().toPath().resolve("real-folder");
-        Files.createDirectory(realFolder);
-        Files.createFile(realFolder.resolve("file"));
-        Files.createSymbolicLink(realFolder.resolve("link-to-file"), Paths.get("./file"));
-        final Path linkInFolder = temporaryFolder.getRoot().toPath().resolve("link-in-folder");
-        Files.createDirectory(linkInFolder);
-        Files.createSymbolicLink(linkInFolder.resolve("link-to-file"), Paths.get("../real-folder/file"));
-        final Path linkToRealFolder = temporaryFolder.getRoot().toPath().resolve("link-to-real-folder");
-        Files.createSymbolicLink(linkToRealFolder, Paths.get("./real-folder"));
-    }
-
-    public void testBZip2Tar() throws IOException {
-        runBuild("buildBZip2Tar", true);
-        assertTar(".bz2", BZip2CompressorInputStream::new, true);
-    }
-
-    public void testBZip2TarDoNotPreserveFileTimestamps() throws IOException {
-        runBuild("buildBZip2Tar", false);
-        assertTar(".bz2", BZip2CompressorInputStream::new, false);
-    }
-
-    public void testGZipTar() throws IOException {
-        runBuild("buildGZipTar", true);
-        assertTar(".gz", GzipCompressorInputStream::new, true);
-    }
-
-    public void testGZipTarDoNotPreserveFileTimestamps() throws IOException {
-        runBuild("buildGZipTar", false);
-        assertTar(".gz", GzipCompressorInputStream::new, false);
-    }
-
-    public void testTar() throws IOException {
-        runBuild("buildTar", true);
-        assertTar("", fis -> fis, true);
-    }
-
-    public void testTarDoNotPreserveFileTimestamps() throws IOException {
-        runBuild("buildTar", false);
-        assertTar("", fis -> fis, false);
-    }
-
-    interface FileInputStreamWrapper {
-        InputStream apply(FileInputStream fis) throws IOException;
-    }
-
-    private void assertTar(final String extension, final FileInputStreamWrapper wrapper, boolean preserveFileTimestamps)
-        throws IOException {
-        try (TarArchiveInputStream tar = new TarArchiveInputStream(wrapper.apply(new FileInputStream(getOutputFile(extension))))) {
-            TarArchiveEntry entry = tar.getNextTarEntry();
-            boolean realFolderEntry = false;
-            boolean fileEntry = false;
-            boolean linkToFileEntry = false;
-            boolean linkInFolderEntry = false;
-            boolean linkInFolderLinkToFileEntry = false;
-            boolean linkToRealFolderEntry = false;
-            while (entry != null) {
-                if (entry.getName().equals("real-folder/")) {
-                    assertTrue(entry.isDirectory());
-                    realFolderEntry = true;
-                } else if (entry.getName().equals("real-folder/file")) {
-                    assertTrue(entry.isFile());
-                    fileEntry = true;
-                } else if (entry.getName().equals("real-folder/link-to-file")) {
-                    assertTrue(entry.isSymbolicLink());
-                    assertThat(entry.getLinkName(), anyOf(equalTo("./file"), equalTo(".\\file")));
-                    linkToFileEntry = true;
-                } else if (entry.getName().equals("link-in-folder/")) {
-                    assertTrue(entry.isDirectory());
-                    linkInFolderEntry = true;
-                } else if (entry.getName().equals("link-in-folder/link-to-file")) {
-                    assertTrue(entry.isSymbolicLink());
-                    assertThat(entry.getLinkName(), anyOf(equalTo("../real-folder/file"), equalTo("..\\real-folder\\file")));
-                    linkInFolderLinkToFileEntry = true;
-                } else if (entry.getName().equals("link-to-real-folder")) {
-                    assertTrue(entry.isSymbolicLink());
-                    assertThat(entry.getLinkName(), anyOf(equalTo("./real-folder"), equalTo(".\\real-folder")));
-                    linkToRealFolderEntry = true;
-                } else {
-                    throw new GradleException("unexpected entry [" + entry.getName() + "]");
-                }
-                if (preserveFileTimestamps) {
-                    assertTrue(entry.getModTime().getTime() > 0);
-                } else {
-                    assertThat(entry.getModTime().getTime(), equalTo(0L));
-                }
-                entry = tar.getNextTarEntry();
-            }
-            assertTrue(realFolderEntry);
-            assertTrue(fileEntry);
-            assertTrue(linkToFileEntry);
-            assertTrue(linkInFolderEntry);
-            assertTrue(linkInFolderLinkToFileEntry);
-            assertTrue(linkToRealFolderEntry);
-        }
-    }
-
-    private void runBuild(final String task, final boolean preserveFileTimestamps) {
-        final GradleRunner runner = getGradleRunner().withArguments(
-            task,
-            "-Dtests.symbolic_link_preserving_tar_source=" + temporaryFolder.getRoot().toString(),
-            "-Dtests.symbolic_link_preserving_tar_preserve_file_timestamps=" + preserveFileTimestamps,
-            "-i"
-        );
-        runner.build();
-    }
-
-    private File getOutputFile(final String extension) {
-        return getProjectDir().toPath().resolve("build/distributions/symbolic-link-preserving-tar.tar" + extension).toFile();
-    }
-
-}

+ 0 - 54
build-tools-internal/src/testKit/symbolic-link-preserving-tar/build.gradle

@@ -1,54 +0,0 @@
-import org.elasticsearch.gradle.internal.SymbolicLinkPreservingTar
-
-plugins {
-  id 'base'
-  id 'distribution'
-  // we need to add one of our plugins to get things on this classpath
-  id 'elasticsearch.global-build-info' apply false
-}
-
-final String source = Objects.requireNonNull(System.getProperty('tests.symbolic_link_preserving_tar_source'))
-boolean preserveFileTimestamps;
-final String testPreserveFileTimestamps =
-  Objects.requireNonNull(System.getProperty('tests.symbolic_link_preserving_tar_preserve_file_timestamps'))
-switch (testPreserveFileTimestamps) {
-  case "true":
-    preserveFileTimestamps = true
-    break
-  case "false":
-    preserveFileTimestamps = false
-    break
-  default:
-    throw new IllegalArgumentException(
-      "tests.symbolic_link_preserving_tar_preserve_file_timestamps must be [true] or [false] but was ["
-        + testPreserveFileTimestamps + "]")
-}
-
-tasks.register("buildBZip2Tar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
-  tar.archiveExtension = 'tar.bz2'
-  tar.compression = Compression.BZIP2
-  tar.preserveFileTimestamps = preserveFileTimestamps
-  from fileTree(source)
-  doLast {
-    println archiveFile.get().asFile.path
-  }
-}
-
-tasks.register("buildGZipTar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
-  tar.archiveExtension = 'tar.gz'
-  tar.compression = Compression.GZIP
-  tar.preserveFileTimestamps = preserveFileTimestamps
-  from fileTree(source)
-  doLast {
-    println archiveFile.get().asFile.path
-  }
-}
-
-tasks.register("buildTar", SymbolicLinkPreservingTar) { SymbolicLinkPreservingTar tar ->
-  tar.archiveExtension = 'tar'
-  tar.preserveFileTimestamps = preserveFileTimestamps
-  from fileTree(source)
-  doLast {
-    println archiveFile.get().asFile.path
-  }
-}

+ 0 - 0
build-tools-internal/src/testKit/symbolic-link-preserving-tar/settings.gradle