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);
+ }
+ }
+}