Commit 6abd21da7c010257b2ea04962865cc4fea3dedd3

Authored by Sergey Matvienko
1 parent 8722d3f7

testcontainers - copy source dir to tmp, remove container_name in tmp, run, cleanup tmp on stop.

... ... @@ -17,7 +17,6 @@ package org.thingsboard.server.msa;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19 19 import org.apache.commons.io.FileUtils;
20   -import org.junit.Assert;
21 20 import org.junit.ClassRule;
22 21 import org.junit.extensions.cpsuite.ClasspathSuite;
23 22 import org.junit.runner.RunWith;
... ... @@ -27,20 +26,24 @@ import org.testcontainers.containers.wait.strategy.Wait;
27 26 import java.io.File;
28 27 import java.io.IOException;
29 28 import java.nio.charset.StandardCharsets;
30   -import java.nio.file.Files;
31   -import java.nio.file.Path;
32 29 import java.time.Duration;
  30 +import java.util.UUID;
33 31
34 32 import static org.hamcrest.CoreMatchers.containsString;
35 33 import static org.hamcrest.CoreMatchers.is;
36 34 import static org.hamcrest.CoreMatchers.not;
37 35 import static org.hamcrest.MatcherAssert.assertThat;
  36 +import static org.junit.Assert.fail;
38 37
39 38 @RunWith(ClasspathSuite.class)
40 39 @ClasspathSuite.ClassnameFilters({"org.thingsboard.server.msa.*Test"})
41 40 @Slf4j
42 41 public class ContainerTestSuite {
43 42
  43 + private static final String SOURCE_DIR = "./../../docker/";
  44 + private static final String TB_CORE_LOG_REGEXP = ".*Starting polling for events.*";
  45 + private static final String TRANSPORTS_LOG_REGEXP = ".*Going to recalculate partitions.*";
  46 +
44 47 private static DockerComposeContainer<?> testContainer;
45 48
46 49 @ClassRule
... ... @@ -51,34 +54,57 @@ public class ContainerTestSuite {
51 54 if (testContainer == null) {
52 55 boolean skipTailChildContainers = Boolean.valueOf(System.getProperty("blackBoxTests.skipTailChildContainers"));
53 56 try {
54   - String tbCoreLogRegexp = ".*Starting polling for events.*";
55   - String transportsLogRegexp = ".*Going to recalculate partitions.*";
  57 + final String targetDir = FileUtils.getTempDirectoryPath() + "/" + "ContainerTestSuite-" + UUID.randomUUID() + "/";
  58 + log.info("targetDir {}", targetDir);
  59 + FileUtils.copyDirectory(new File(SOURCE_DIR), new File(targetDir));
  60 + replaceInFile(targetDir + "docker-compose.yml", " container_name: \"${LOAD_BALANCER_NAME}\"", "", "container_name");
  61 +
  62 + class DockerComposeContainerImpl<SELF extends DockerComposeContainer<SELF>> extends DockerComposeContainer<SELF> {
  63 + public DockerComposeContainerImpl(File... composeFiles) {
  64 + super(composeFiles);
  65 + }
  66 +
  67 + @Override
  68 + public void stop() {
  69 + super.stop();
  70 + tryDeleteDir(targetDir);
  71 + }
  72 + }
56 73
57   - testContainer = new DockerComposeContainer<>(
58   - new File(removeContainerName("./../../docker/docker-compose.yml")),
59   - new File("./../../docker/docker-compose.postgres.yml"),
60   - new File("./../../docker/docker-compose.postgres.volumes.yml"),
61   - new File("./../../docker/docker-compose.kafka.yml"))
  74 + testContainer = new DockerComposeContainerImpl<>(
  75 + new File(targetDir + "docker-compose.yml"),
  76 + new File(targetDir + "docker-compose.postgres.yml"),
  77 + new File(targetDir + "docker-compose.postgres.volumes.yml"),
  78 + new File(targetDir + "docker-compose.kafka.yml"))
62 79 .withPull(false)
63 80 .withLocalCompose(true)
64 81 .withTailChildContainers(!skipTailChildContainers)
65 82 .withEnv(installTb.getEnv())
66 83 .withEnv("LOAD_BALANCER_NAME", "")
67 84 .withExposedService("haproxy", 80, Wait.forHttp("/swagger-ui.html").withStartupTimeout(Duration.ofSeconds(400)))
68   - .waitingFor("tb-core1", Wait.forLogMessage(tbCoreLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)))
69   - .waitingFor("tb-core2", Wait.forLogMessage(tbCoreLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)))
70   - .waitingFor("tb-http-transport1", Wait.forLogMessage(transportsLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)))
71   - .waitingFor("tb-http-transport2", Wait.forLogMessage(transportsLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)))
72   - .waitingFor("tb-mqtt-transport1", Wait.forLogMessage(transportsLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)))
73   - .waitingFor("tb-mqtt-transport2", Wait.forLogMessage(transportsLogRegexp, 1).withStartupTimeout(Duration.ofSeconds(400)));
  85 + .waitingFor("tb-core1", Wait.forLogMessage(TB_CORE_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)))
  86 + .waitingFor("tb-core2", Wait.forLogMessage(TB_CORE_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)))
  87 + .waitingFor("tb-http-transport1", Wait.forLogMessage(TRANSPORTS_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)))
  88 + .waitingFor("tb-http-transport2", Wait.forLogMessage(TRANSPORTS_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)))
  89 + .waitingFor("tb-mqtt-transport1", Wait.forLogMessage(TRANSPORTS_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)))
  90 + .waitingFor("tb-mqtt-transport2", Wait.forLogMessage(TRANSPORTS_LOG_REGEXP, 1).withStartupTimeout(Duration.ofSeconds(400)));
74 91 } catch (Exception e) {
75 92 log.error("Failed to create test container", e);
76   - throw e;
  93 + fail("Failed to create test container");
77 94 }
78 95 }
79 96 return testContainer;
80 97 }
81 98
  99 + private static void tryDeleteDir(String targetDir) {
  100 + try {
  101 + log.info("Trying to delete temp dir {}", targetDir);
  102 + FileUtils.deleteDirectory(new File(targetDir));
  103 + } catch (IOException e) {
  104 + log.error("Can't delete temp directory " + targetDir, e);
  105 + }
  106 + }
  107 +
82 108 /**
83 109 * This workaround is actual until issue will be resolved:
84 110 * Support container_name in docker-compose file #2472 https://github.com/testcontainers/testcontainers-java/issues/2472
... ... @@ -86,23 +112,20 @@ public class ContainerTestSuite {
86 112 * This has been introduced in #1151 as a quick fix for unintuitive feedback. https://github.com/testcontainers/testcontainers-java/issues/1151
87 113 * Using the latest testcontainers and waiting for the fix...
88 114 * */
89   - private static String removeContainerName(String sourceFilename) {
90   - String outputFilename = null;
  115 + private static void replaceInFile(String sourceFilename, String target, String replacement, String verifyPhrase) {
91 116 try {
92   - String sourceContent = FileUtils.readFileToString(new File(sourceFilename), StandardCharsets.UTF_8);
93   - String outputContent = sourceContent.replace("container_name: \"${LOAD_BALANCER_NAME}\"", "");
94   - assertThat(outputContent, (not(containsString("container_name"))));
95   -
96   - Path tempFile = Files.createTempFile("docker-compose", ".yml"); // the file looks like /tmp/docker-compose713972234379430232.yml
97   - log.info("tempFile is {}", tempFile.toFile().getAbsolutePath());
  117 + File file = new File(sourceFilename);
  118 + String sourceContent = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
98 119
99   - FileUtils.writeStringToFile(tempFile.toFile(), outputContent, StandardCharsets.UTF_8);
100   - outputFilename = tempFile.toFile().getAbsolutePath();
101   - assertThat(FileUtils.readFileToString(new File(outputFilename), StandardCharsets.UTF_8), is(outputContent));
  120 + String outputContent = sourceContent.replace(target, replacement);
  121 + assertThat(outputContent, (not(containsString(target))));
  122 + assertThat(outputContent, (not(containsString(verifyPhrase))));
102 123
  124 + FileUtils.writeStringToFile(file, outputContent, StandardCharsets.UTF_8);
  125 + assertThat(FileUtils.readFileToString(file, StandardCharsets.UTF_8), is(outputContent));
103 126 } catch (IOException e) {
104   - Assert.fail("failed to create tmp file " + e.getMessage());
  127 + log.error("failed to update file " + sourceFilename, e);
  128 + fail("failed to update file");
105 129 }
106   - return outputFilename;
107 130 }
108 131 }
... ...