diff --git a/pom.xml b/pom.xml index 0ff9603..c6d1f20 100644 --- a/pom.xml +++ b/pom.xml @@ -183,8 +183,17 @@ true - + UNICODE + true + true + true + true + false + true + true + false org.jboss.logmanager.LogManager diff --git a/server/pom.xml b/server/pom.xml index 4c37aa3..7a2c472 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -22,6 +22,16 @@ power-server-metadata ${project.version} + + org.assertj + assertj-core + test + + + io.quarkus + quarkus-rest-client + test + diff --git a/server/src/test/java/net/laprun/sustainability/power/CIPowerResourceTest.java b/server/src/test/java/net/laprun/sustainability/power/CIPowerResourceTest.java index 5582121..949d520 100644 --- a/server/src/test/java/net/laprun/sustainability/power/CIPowerResourceTest.java +++ b/server/src/test/java/net/laprun/sustainability/power/CIPowerResourceTest.java @@ -1,53 +1,18 @@ package net.laprun.sustainability.power; -import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.*; - -import java.util.Set; - -import org.junit.jupiter.api.Test; - import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; @QuarkusTest @TestProfile(CIQuarkusTestProfile.class) // only activated when quarkus.test.profile.tags='ci', uses @Mock annotated beans -public class CIPowerResourceTest { +public class CIPowerResourceTest extends PowerResourceTest { protected long getPid() { return 29419; } - @Test - public void testPowerEndpoint() { - final var pid = getPid(); - given() - .when().get("/power/" + pid) - .then() - .statusCode(200); - } - - @Test - public void testMacOSAppleSiliconMetadataEndpoint() { - final var metadata = given() - .when().get("/power/metadata") - .then() - .statusCode(200) - .extract().body().as(SensorMetadata.class); - assertEquals(4, metadata.componentCardinality()); - assertTrue(metadata.documentation().contains("powermetrics")); - assertTrue(metadata.components().keySet().containsAll(Set.of("CPU", "GPU", "ANE", "cpuShare"))); - - final var cpu = metadata.metadataFor("CPU"); - assertEquals(0, cpu.index()); - assertEquals("CPU", cpu.name()); - assertEquals(SensorUnit.mW, cpu.unit()); - assertTrue(cpu.isAttributed()); - - final var cpuShare = metadata.metadataFor("cpuShare"); - assertEquals(3, cpuShare.index()); - assertEquals("cpuShare", cpuShare.name()); - assertEquals(SensorUnit.decimalPercentage, cpuShare.unit()); - assertFalse(cpuShare.isAttributed()); + @Override + public void testLinuxMetadataEndpoint() { + // overridden to disable as with the profile activation, the MockPowerSensor implementation is picked up, which is a macOS-specific implementation } } diff --git a/server/src/test/java/net/laprun/sustainability/power/PowerResourceTest.java b/server/src/test/java/net/laprun/sustainability/power/PowerResourceTest.java index d2ed1a5..a0026f8 100644 --- a/server/src/test/java/net/laprun/sustainability/power/PowerResourceTest.java +++ b/server/src/test/java/net/laprun/sustainability/power/PowerResourceTest.java @@ -3,6 +3,7 @@ import static io.restassured.RestAssured.given; import static org.junit.jupiter.api.Assertions.*; +import java.net.URI; import java.time.Duration; import java.util.Set; @@ -11,18 +12,19 @@ import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; +import io.quarkus.test.common.http.TestHTTPResource; import io.quarkus.test.junit.QuarkusTest; @QuarkusTest public class PowerResourceTest { + @TestHTTPResource + URI uri; + @Test - public void testPowerEndpoint() { + public void testPowerEndpoint() throws Exception { final var pid = getPid(); - given() - .when().get("/power/" + pid) - .then() - .statusCode(200); + StreamChecker.checkPowerForPID(uri, pid); } @Test diff --git a/server/src/test/java/net/laprun/sustainability/power/StreamChecker.java b/server/src/test/java/net/laprun/sustainability/power/StreamChecker.java new file mode 100644 index 0000000..9b4e52e --- /dev/null +++ b/server/src/test/java/net/laprun/sustainability/power/StreamChecker.java @@ -0,0 +1,35 @@ +package net.laprun.sustainability.power; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.sse.SseEventSource; + +import org.assertj.core.api.Assertions; + +public class StreamChecker { + + static void checkPowerForPID(URI uri, long pid) throws Exception { + final var powerForPid = ClientBuilder.newClient().target(uri.resolve("power")) + .path("{pid}").resolveTemplate("pid", pid); + + try (final var eventSource = SseEventSource.target(powerForPid).build()) { + CompletableFuture> res = new CompletableFuture<>(); + List collect = Collections.synchronizedList(new ArrayList<>()); + eventSource.register(inboundSseEvent -> { + collect.add(inboundSseEvent.readData()); + // stop after one event + eventSource.close(); + }, + res::completeExceptionally, + () -> res.complete(collect)); + eventSource.open(); + Assertions.assertThat(res.get(5, TimeUnit.SECONDS)).hasSize(1); + } + } +}