Uploaded image for project: 'XWiki Platform'
  1. XWiki Platform
  2. XWIKI-15947

Copy some data from the permanent directory once the tests are finished to help debug problems

    XMLWordPrintable

Details

    • Improvement
    • Resolution: Unresolved
    • Major
    • None
    • 10.10
    • Test Framework
    • None
    • Unknown

    Description

      For example, copy:

      • logs/
      • jobs/
      • extension/ (when verbose = true)

      Right now I'm failing to make it work. Since there's no API to copy a folder from the container to the host (see https://github.com/testcontainers/testcontainers-java/issues/1006), I coded this:

          /**
           * @throws Exception if an error occurred during the stop
           */
          public void stop() throws Exception
          {
              switch (this.testConfiguration.getServletEngine()) {
                  case JETTY_STANDALONE:
                      this.jettyStandaloneExecutor.stop();
                      break;
                  default:
                      // Copy the /jobs & /logs directories from the permanent directory from the container to the host
                      // since that's useful when debugging issues.
                      copyPermanentDirectoryToHost("jobs");
                      copyPermanentDirectoryToHost("logs");
                      if (this.testConfiguration.isVerbose()) {
                          copyPermanentDirectoryToHost("extension");
                      }
      
                      // Nothing else to do, TestContainers automatically stops the container
              }
          }
      
          private void copyPermanentDirectoryToHost(String directoryName) throws IOException
          {
              String containerPath = String.format("%s/%s",
                  this.testConfiguration.getServletEngine().getPermanentDirectory(), directoryName);
              copyFolderFromContainer(containerPath, this.testConfiguration.getOutputDirectory());
          }
      
          private void copyFolderFromContainer(String sourceDirectory, String targetDirectory) throws IOException
          {
              DockerClient client = this.servletContainer.getDockerClient();
              InputStream inputStream =
                  client.copyArchiveFromContainerCmd(this.servletContainer.getContainerId(), sourceDirectory).exec();
              TarArchiveInputStream tarInputStream = new TarArchiveInputStream(inputStream);
              TarArchiveEntry entry;
              while ((entry = (TarArchiveEntry) tarInputStream.getNextEntry()) != null) {
                  File outputFile = new File(targetDirectory, entry.getName());
                  if (entry.isDirectory()) {
                      if (!outputFile.exists()) {
                          if (!outputFile.mkdirs()) {
                              throw new IllegalStateException(String.format("Couldn't create directory [%s]",
                                  outputFile.getAbsolutePath()));
                          }
                      }
                  } else {
                      OutputStream outputFileStream = new FileOutputStream(outputFile);
                      IOUtils.copy(inputStream, outputFileStream);
                      outputFileStream.close();
                  }
              }
          }
      

      But it fails with a:

      java.io.IOException: Truncated TAR archive
      
      	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.read(TarArchiveInputStream.java:612)
      	at org.apache.commons.compress.utils.IOUtils.readFully(IOUtils.java:168)
      	at org.apache.commons.compress.utils.IOUtils.skip(IOUtils.java:119)
      	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:268)
      	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextEntry(TarArchiveInputStream.java:552)
      	at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.copyFolderFromContainer(ServletContainerExecutor.java:217)
      	at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.copyPermanentDirectoryToHost(ServletContainerExecutor.java:207)
      	at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.stop(ServletContainerExecutor.java:193)
      	at org.xwiki.test.docker.junit5.XWikiDockerExtension.stopServletEngine(XWikiDockerExtension.java:332)
      	at org.xwiki.test.docker.junit5.XWikiDockerExtension.afterAll(XWikiDockerExtension.java:236)
      	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeAfterAllCallbacks$11(ClassTestDescriptor.java:396)
      	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
      	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeAfterAllCallbacks$12(ClassTestDescriptor.java:396)
      	at java.util.ArrayList.forEach(ArrayList.java:1249)
      	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeAfterAllCallbacks(ClassTestDescriptor.java:396)
      	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.after(ClassTestDescriptor.java:221)
      	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.after(ClassTestDescriptor.java:74)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:118)
      	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:118)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
      	at java.util.ArrayList.forEach(ArrayList.java:1249)
      	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112)
      	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98)
      	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
      	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
      	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
      	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
      	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
      	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
      	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
      	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
      	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
      	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            vmassol Vincent Massol
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: