Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,17 @@
<consoleOutputReporter>
<disable>true</disable>
</consoleOutputReporter>
<statelessTestsetInfoReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
<statelessTestsetInfoReporter
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
<theme>UNICODE</theme>
<printStacktraceOnError>true</printStacktraceOnError>
<printStacktraceOnFailure>true</printStacktraceOnFailure>
<printStdoutOnError>true</printStdoutOnError>
<printStdoutOnFailure>true</printStdoutOnFailure>
<printStdoutOnSuccess>false</printStdoutOnSuccess>
<printStderrOnError>true</printStderrOnError>
<printStderrOnFailure>true</printStderrOnFailure>
<printStderrOnSuccess>false</printStderrOnSuccess>
</statelessTestsetInfoReporter>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
Expand Down
10 changes: 10 additions & 0 deletions server/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@
<artifactId>power-server-metadata</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<extensions>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<List<String>> res = new CompletableFuture<>();
List<String> 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);
}
}
}
Loading