Skip to content

Commit

Permalink
Merge pull request quarkusio#39908 from gsmet/flaky-dev-mojo-it
Browse files Browse the repository at this point in the history
Isolate testThatNewResourcesAreServed in FlakyDevMojoIT
  • Loading branch information
gsmet authored Apr 17, 2024
2 parents c58cfee + b4ae2ce commit bbdc601
Show file tree
Hide file tree
Showing 14 changed files with 730 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -936,22 +937,24 @@ Set<String> checkForFileChange(Function<DevModeContext.ModuleInfo, DevModeContex
try {
Path relative = root.relativize(path);
Path target = outputDir.resolve(relative);

seen.remove(target);
if (!timestampSet.watchedPaths.containsKey(path)) {
moduleResources.add(target);
if (!Files.exists(target) || Files.getLastModifiedTime(target).toMillis() < Files
.getLastModifiedTime(path).toMillis()) {

long current = Files.getLastModifiedTime(path).toMillis();

if (!Files.exists(target) || Files.getLastModifiedTime(target).toMillis() < current) {
if (Files.isDirectory(path)) {
Files.createDirectories(target);
} else {
Files.createDirectories(target.getParent());
// A new file is added to a resource root
// We need to use the OS-agnostic path to match the HotDeploymentWatchedFileBuildItem
ret.add(toOSAgnosticPathStr(relative.toString()));
byte[] data = Files.readAllBytes(path);
try (FileOutputStream out = new FileOutputStream(target.toFile())) {
out.write(data);
}
Files.copy(path, target, StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);

if (copyResourceNotification != null) {
copyResourceNotification.accept(module, relative.toString());
}
Expand All @@ -967,11 +970,15 @@ Set<String> checkForFileChange(Function<DevModeContext.ModuleInfo, DevModeContex
for (Path i : seen) {
moduleResources.remove(i);
if (!Files.isDirectory(i)) {
Files.delete(i);
try {
Files.delete(i);
} catch (IOException e) {
log.error("Failed to delete resources", e);
}
}
}
} catch (IOException e) {
log.error("Failed to copy resources", e);
log.error("Unable to walk through the directory", e);
}
}

Expand All @@ -988,6 +995,7 @@ Set<String> checkForFileChange(Function<DevModeContext.ModuleInfo, DevModeContex
try {
long current = Files.getLastModifiedTime(watchedPath.filePath).toMillis();
long last = watchedPath.lastModified;

if (current > last) {
// Use either the absolute path or the OS-agnostic path to match the HotDeploymentWatchedFileBuildItem
ret.add(isAbsolute ? watchedPath.filePath.toString() : watchedPath.getOSAgnosticMatchPath());
Expand Down Expand Up @@ -1372,7 +1380,8 @@ private boolean isAbsolute() {

@Override
public String toString() {
return "WatchedPath [matchPath=" + matchPath + ", filePath=" + filePath + ", restartNeeded=" + restartNeeded + "]";
return "WatchedPath [matchPath=" + matchPath + ", filePath=" + filePath + ", restartNeeded=" + restartNeeded
+ ", lastModified=" + lastModified + "]";
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import static io.quarkus.maven.it.ApplicationNameAndVersionTestUtil.assertApplicationPropertiesSetCorrectly;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
Expand Down Expand Up @@ -943,37 +941,6 @@ public void testThatExternalConfigOverridesConfigInJar() throws MavenInvocationE
.until(() -> devModeClient.getHttpResponse("/app/hello/greeting").contains(uuid));
}

@Test
public void testThatNewResourcesAreServed() throws MavenInvocationException, IOException {
testDir = initProject("projects/classic", "projects/project-classic-run-resource-change");
runAndCheck();

// Create a new resource
File source = new File(testDir, "src/main/resources/META-INF/resources/lorem.txt");
FileUtils.write(source,
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"UTF-8");
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt"), containsString("Lorem ipsum"));

// Update the resource
String uuid = UUID.randomUUID().toString();
FileUtils.write(source, uuid, "UTF-8");
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt"), equalTo(uuid));

// Delete the resource
source.delete();
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt", 404));
}

@Test
public void testThatConfigFileDeletionsAreDetected() throws MavenInvocationException, IOException {
testDir = initProject("projects/dev-mode-file-deletion");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.quarkus.maven.it;

import static org.awaitility.Awaitility.await;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

import org.apache.maven.shared.invoker.MavenInvocationException;
import org.junit.jupiter.api.Test;

import io.quarkus.test.devmode.util.DevModeClient;

/**
* This test has been isolated as it is very flaky and causing issues with Develocity PTS.
*/
@DisableForNative
public class FlakyDevMojoIT extends RunAndCheckMojoTestBase {

protected DevModeClient devModeClient = new DevModeClient(getPort());

@Test
public void testThatNewResourcesAreServed() throws MavenInvocationException, IOException {
testDir = initProject("projects/classic-with-log", "projects/project-classic-run-resource-change");
runAndCheck();

// Create a new resource
Path source = testDir.toPath().resolve("src/main/resources/META-INF/resources/lorem.txt");
Files.writeString(source,
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt"), containsString("Lorem ipsum"));

// Update the resource
String uuid = UUID.randomUUID().toString();
Files.writeString(source, uuid);
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt"), equalTo(uuid));

// Delete the resource
Files.delete(source);
await()
.pollDelay(100, TimeUnit.MILLISECONDS)
.atMost(TestUtils.getDefaultTimeout(), TimeUnit.MINUTES)
.until(() -> devModeClient.getHttpResponse("/lorem.txt", 404));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
OTHER_GREETING=Hola
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.acme</groupId>
<artifactId>acme</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.version>@project.version@</quarkus.platform.version>
<quarkus-plugin.version>@project.version@</quarkus-plugin.version>
<compiler-plugin.version>${compiler-plugin.version}</compiler-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>${maven.compiler.source}</maven.compiler.source>
<maven.compiler.target>${maven.compiler.target}</maven.compiler.target>

<!-- do not update this dependency, it needs to be stable for testing -->
<webjar.jquery-ui.version>1.13.0</webjar.jquery-ui.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- insert managed dependencies here -->
<dependency>
<groupId>\${quarkus.platform.group-id}</groupId>
<artifactId>\${quarkus.platform.artifact-id}</artifactId>
<version>\${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- insert test dependencies here -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-context-propagation</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-websockets</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye.common</groupId>
<artifactId>smallrye-common-vertx-context</artifactId>
<version>1.13.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery-ui</artifactId>
<version>\${webjar.jquery-ui.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>\${compiler-plugin.version}</version>
</plugin>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>\${quarkus-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<properties>
<quarkus.native.enabled>true</quarkus.native.enabled>
</properties>
</profile>
<profile>
<id>customOutputDir</id>
<build>
<directory>target-other</directory>
</build>
</profile>
</profiles>
</project>
Loading

0 comments on commit bbdc601

Please sign in to comment.