diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/actions/ActionResult.java | 24 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java | 56 |
2 files changed, 74 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java index 0b8fa0143d..c2fd3490d9 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.actions; +import static com.google.common.base.Preconditions.checkState; + import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import java.time.Duration; @@ -92,6 +94,28 @@ public abstract class ActionResult { return getCumulativeTime(spawnResult -> spawnResult.getSystemTime()); } + /** + * Returns the cumulative command execution CPU time for the {@link Action}. + * + * @return the cumulative measurement, or empty in case of execution errors or when the + * measurement is not implemented for the current platform + */ + public Optional<Duration> cumulativeCommandExecutionCpuTime() { + Optional<Duration> userTime = cumulativeCommandExecutionUserTime(); + Optional<Duration> systemTime = cumulativeCommandExecutionSystemTime(); + + if (!userTime.isPresent() && !systemTime.isPresent()) { + return Optional.empty(); + } else if (userTime.isPresent() && !systemTime.isPresent()) { + return userTime; + } else if (!userTime.isPresent() && systemTime.isPresent()) { + return systemTime; + } else { + checkState(userTime.isPresent() && systemTime.isPresent()); + return Optional.of(userTime.get().plus(systemTime.get())); + } + } + /** Creates an ActionResult given a list of SpawnResults. */ public static ActionResult create(List<SpawnResult> spawnResults) { if (spawnResults == null) { diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java index 87081ea417..a5b186aa82 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java @@ -31,6 +31,7 @@ public final class ActionResultTest { List<SpawnResult> spawnResults = ImmutableList.of(); ActionResult actionResult = ActionResult.create(spawnResults); assertThat(actionResult.cumulativeCommandExecutionWallTime()).isEmpty(); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).isEmpty(); assertThat(actionResult.cumulativeCommandExecutionUserTime()).isEmpty(); assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isEmpty(); } @@ -46,11 +47,9 @@ public final class ActionResultTest { .build(); List<SpawnResult> spawnResults = ImmutableList.of(spawnResult); ActionResult actionResult = ActionResult.create(spawnResults); - assertThat(actionResult.cumulativeCommandExecutionWallTime()).isPresent(); assertThat(actionResult.cumulativeCommandExecutionWallTime()).hasValue(Duration.ofMillis(1984)); - assertThat(actionResult.cumulativeCommandExecutionUserTime()).isPresent(); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(267)); assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(225)); - assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isPresent(); assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42)); } @@ -79,11 +78,9 @@ public final class ActionResultTest { .build(); List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3); ActionResult actionResult = ActionResult.create(spawnResults); - assertThat(actionResult.cumulativeCommandExecutionWallTime()).isPresent(); assertThat(actionResult.cumulativeCommandExecutionWallTime()).hasValue(Duration.ofMillis(1984)); - assertThat(actionResult.cumulativeCommandExecutionUserTime()).isPresent(); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(46)); assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(4)); - assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isPresent(); assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42)); } @@ -98,7 +95,54 @@ public final class ActionResultTest { List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3); ActionResult actionResult = ActionResult.create(spawnResults); assertThat(actionResult.cumulativeCommandExecutionWallTime()).isEmpty(); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).isEmpty(); assertThat(actionResult.cumulativeCommandExecutionUserTime()).isEmpty(); assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isEmpty(); } + + @Test + public void testCumulativeCommandExecutionTime_ManySpawnResults_ButOnlyUserTime() { + SpawnResult spawnResult1 = + new SpawnResult.Builder() + .setUserTime(Duration.ofMillis(2)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + SpawnResult spawnResult2 = + new SpawnResult.Builder() + .setUserTime(Duration.ofMillis(3)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + SpawnResult spawnResult3 = + new SpawnResult.Builder() + .setUserTime(Duration.ofMillis(4)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3); + ActionResult actionResult = ActionResult.create(spawnResults); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(9)); + assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(9)); + } + + @Test + public void testCumulativeCommandExecutionTime_ManySpawnResults_ButOnlySystemTime() { + SpawnResult spawnResult1 = + new SpawnResult.Builder() + .setSystemTime(Duration.ofMillis(33)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + SpawnResult spawnResult2 = + new SpawnResult.Builder() + .setSystemTime(Duration.ofMillis(7)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + SpawnResult spawnResult3 = + new SpawnResult.Builder() + .setSystemTime(Duration.ofMillis(2)) + .setStatus(SpawnResult.Status.SUCCESS) + .build(); + List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3); + ActionResult actionResult = ActionResult.create(spawnResults); + assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(42)); + assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42)); + } } |