Skip to content

Commit 30895c6

Browse files
committed
fix: stopped measure should use initial measure's processors by default
1 parent fc6f375 commit 30895c6

File tree

5 files changed

+128
-1
lines changed

5 files changed

+128
-1
lines changed

measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.stream.Stream;
99

1010
import net.laprun.sustainability.power.SensorMetadata;
11+
import net.laprun.sustainability.power.analysis.Processors;
1112

1213
public class OngoingPowerMeasure extends ProcessorAware implements PowerMeasure {
1314
private static final int DEFAULT_SIZE = 32;
@@ -19,6 +20,8 @@ public class OngoingPowerMeasure extends ProcessorAware implements PowerMeasure
1920
private long[] timestamps;
2021

2122
public OngoingPowerMeasure(SensorMetadata metadata) {
23+
super(Processors.empty);
24+
2225
startedAt = System.currentTimeMillis();
2326
this.metadata = metadata;
2427

measure/src/main/java/net/laprun/sustainability/power/measure/ProcessorAware.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
import net.laprun.sustainability.power.analysis.Processors;
88

99
abstract class ProcessorAware {
10-
private Processors processors = Processors.empty;
10+
private Processors processors;
11+
12+
public ProcessorAware(Processors processors) {
13+
this.processors = processors == null ? Processors.empty : processors;
14+
}
1115

1216
public abstract SensorMetadata metadata();
1317

measure/src/main/java/net/laprun/sustainability/power/measure/StoppedPowerMeasure.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public class StoppedPowerMeasure extends ProcessorAware implements PowerMeasure
1414
private final Duration duration;
1515

1616
public StoppedPowerMeasure(OngoingPowerMeasure powerMeasure) {
17+
super(powerMeasure.processors());
18+
1719
this.measure = powerMeasure;
1820
this.duration = powerMeasure.duration();
1921
this.samples = powerMeasure.numberOfSamples();

measure/src/test/java/net/laprun/sustainability/power/measure/OngoingPowerMeasureTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.laprun.sustainability.power.SensorMetadata;
1313
import net.laprun.sustainability.power.analysis.ComponentProcessor;
14+
import net.laprun.sustainability.power.analysis.MeasureProcessor;
1415

1516
public class OngoingPowerMeasureTest {
1617
private final static SensorMetadata metadata = SensorMetadata
@@ -71,7 +72,9 @@ void processorsShouldBeCalled() {
7172

7273
final var measure = new OngoingPowerMeasure(metadata);
7374
final var testProc = new TestComponentProcessor();
75+
final var measureProc = new TestMeasureProcessor();
7476
measure.registerProcessorFor(0, testProc);
77+
measure.registerMeasureProcessor(measureProc);
7578

7679
final var components = new double[metadata.componentCardinality()];
7780
components[0] = m1c1;
@@ -86,9 +89,12 @@ void processorsShouldBeCalled() {
8689
assertThat(processors.processorsFor(0)).hasSize(1);
8790
assertThat(processors.processorsFor(1)).isEmpty();
8891
assertThat(processors.processorsFor(2)).isEmpty();
92+
assertThat(processors.measureProcessors()).hasSize(1);
8993

9094
assertThat(testProc.values.getFirst().value()).isEqualTo(m1c1);
9195
assertThat(testProc.values.getLast().value()).isEqualTo(m2c1);
96+
assertThat(measureProc.values.getFirst().measures()).isEqualTo(new double[] { m1c1, m1c2, 0 });
97+
assertThat(measureProc.values.getLast().measures()).isEqualTo(new double[] { m2c1, m2c2, 0 });
9298
}
9399

94100
private static class TestComponentProcessor implements ComponentProcessor {
@@ -99,4 +105,15 @@ public void recordComponentValue(double value, long timestamp) {
99105
values.add(new PowerMeasure.TimestampedValue(timestamp, value));
100106
}
101107
}
108+
109+
private static class TestMeasureProcessor implements MeasureProcessor {
110+
final List<PowerMeasure.TimestampedMeasures> values = new ArrayList<>();
111+
112+
@Override
113+
public void recordMeasure(double[] measure, long timestamp) {
114+
final var copy = new double[measure.length];
115+
System.arraycopy(measure, 0, copy, 0, measure.length);
116+
values.add(new PowerMeasure.TimestampedMeasures(timestamp, copy));
117+
}
118+
}
102119
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package net.laprun.sustainability.power.measure;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import net.laprun.sustainability.power.SensorMetadata;
8+
import net.laprun.sustainability.power.SensorUnit;
9+
import net.laprun.sustainability.power.analysis.ComponentProcessor;
10+
import net.laprun.sustainability.power.analysis.MeasureProcessor;
11+
import net.laprun.sustainability.power.analysis.Processors;
12+
import net.laprun.sustainability.power.analysis.TotalMeasureProcessor;
13+
14+
public class StoppedPowerMeasureTest {
15+
private final static SensorMetadata metadata = SensorMetadata
16+
.withNewComponent("cp1", null, true, "mW")
17+
.withNewComponent("cp2", null, true, "mW")
18+
.withNewComponent("cp3", null, true, "mW")
19+
.build();
20+
21+
@Test
22+
void shouldUseInitialProcessorsIfAvailable() {
23+
final var measure = new OngoingPowerMeasure(metadata);
24+
final var processor = new TotalMeasureProcessor(metadata, SensorUnit.mW, 0);
25+
measure.registerMeasureProcessor(processor);
26+
final var compProc = new ComponentProcessor() {
27+
};
28+
measure.registerProcessorFor(0, compProc);
29+
30+
final var stopped = new StoppedPowerMeasure(measure);
31+
final var stoppedProcs = stopped.processors();
32+
assertThat(stoppedProcs).isNotEqualTo(Processors.empty);
33+
assertThat(stoppedProcs.measureProcessors()).hasSize(1);
34+
assertThat(stoppedProcs.measureProcessors().getFirst()).isEqualTo(processor);
35+
assertThat(stoppedProcs.processorsFor(0)).hasSize(1);
36+
assertThat(stoppedProcs.processorsFor(0).getFirst()).isEqualTo(compProc);
37+
}
38+
39+
@Test
40+
void shouldAlsoUseOwnProcessorsIfAvailable() {
41+
final var measure = new OngoingPowerMeasure(metadata);
42+
final var processor = new TotalMeasureProcessor(metadata, SensorUnit.mW, 0);
43+
measure.registerMeasureProcessor(processor);
44+
final var ongoingCompProcOutput = "component from ongoing";
45+
final var compProc = new ComponentProcessor() {
46+
@Override
47+
public String output() {
48+
return ongoingCompProcOutput;
49+
}
50+
};
51+
measure.registerProcessorFor(0, compProc);
52+
53+
final var stopped = new StoppedPowerMeasure(measure);
54+
final var stoppedCompProcName = "stopped component processor";
55+
final var stoppedCompProcOutput = "component from stopped";
56+
final var stoppedProc = new ComponentProcessor() {
57+
@Override
58+
public String name() {
59+
return stoppedCompProcName;
60+
}
61+
62+
@Override
63+
public String output() {
64+
return stoppedCompProcOutput;
65+
}
66+
};
67+
stopped.registerProcessorFor(0, stoppedProc);
68+
final var stoppedMeasureOutput = "measure from stopped";
69+
final var stoppedMeasureProcName = "stopped measure processor";
70+
final var stoppedMeasureProc = new MeasureProcessor() {
71+
@Override
72+
public String name() {
73+
return stoppedMeasureProcName;
74+
}
75+
76+
@Override
77+
public String output() {
78+
return stoppedMeasureOutput;
79+
}
80+
};
81+
stopped.registerMeasureProcessor(stoppedMeasureProc);
82+
final var stoppedProcs = stopped.processors();
83+
assertThat(stoppedProcs).isNotEqualTo(Processors.empty);
84+
final var measureProcessors = stoppedProcs.measureProcessors();
85+
assertThat(measureProcessors).hasSize(2);
86+
assertThat(measureProcessors.getFirst()).isEqualTo(processor);
87+
assertThat(measureProcessors.getLast()).isEqualTo(stoppedMeasureProc);
88+
final var componentProcessors = stoppedProcs.processorsFor(0);
89+
assertThat(componentProcessors).hasSize(2);
90+
assertThat(componentProcessors.getFirst()).isEqualTo(compProc);
91+
assertThat(componentProcessors.getLast()).isEqualTo(stoppedProc);
92+
93+
final var output = PowerMeasure.asString(stopped);
94+
assertThat(output).contains(stoppedCompProcOutput, stoppedMeasureOutput, ongoingCompProcOutput);
95+
// second anonymous class
96+
assertThat(output).contains(stoppedCompProcName, stoppedMeasureProcName, "Aggregated total from (cp1)",
97+
getClass().getName() + "$2");
98+
assertThat(output).contains("0.00mW");
99+
assertThat(output).doesNotContain("Infinity");
100+
}
101+
}

0 commit comments

Comments
 (0)