BES: Use WKPs for timestamp/duration values

Closes #13181.

PiperOrigin-RevId: 369280119
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 4ad6a72..49d061e 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -412,6 +412,7 @@
         "//third_party:guava",
         "//third_party:jsr305",
         "@com_google_protobuf//:protobuf_java",
+        "@com_google_protobuf//java/util",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index e41e289..b094844 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -451,6 +451,7 @@
         "//third_party:guava",
         "//third_party:jsr305",
         "//third_party/protobuf:protobuf_java",
+        "//third_party/protobuf:protobuf_java_util",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index 308622a..1b5b13e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -66,6 +66,7 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyValue;
+import com.google.protobuf.util.Durations;
 import java.util.Collection;
 import java.util.function.Function;
 import javax.annotation.Nullable;
@@ -434,6 +435,7 @@
     builder.addAllOutputGroup(getOutputFilesByGroup(converters.artifactGroupNamer()));
 
     if (isTest) {
+      builder.setTestTimeout(Durations.fromSeconds(testTimeoutSeconds));
       builder.setTestTimeoutSeconds(testTimeoutSeconds);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestAttempt.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestAttempt.java
index bdc834b..84e0d1f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestAttempt.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestAttempt.java
@@ -32,6 +32,8 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
 import com.google.devtools.build.lib.view.test.TestStatus.TestResultData;
+import com.google.protobuf.util.Durations;
+import com.google.protobuf.util.Timestamps;
 import java.util.Collection;
 import java.util.List;
 
@@ -219,7 +221,9 @@
     builder.setStatusDetails(statusDetails);
     builder.setExecutionInfo(executionInfo);
     builder.setCachedLocally(cachedLocally);
+    builder.setTestAttemptStart(Timestamps.fromMillis(startTimeMillis));
     builder.setTestAttemptStartMillisEpoch(startTimeMillis);
+    builder.setTestAttemptDuration(Durations.fromMillis(durationMillis));
     builder.setTestAttemptDurationMillis(durationMillis);
     builder.addAllWarning(testWarnings);
     for (Pair<String, Path> file : files) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD b/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
index e7f4606..e646158 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
@@ -31,6 +31,7 @@
         "//third_party:jsr305",
         "//third_party:netty",
         "//third_party/protobuf:protobuf_java",
+        "//third_party/protobuf:protobuf_java_util",
     ],
 )
 
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildCompletingEvent.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildCompletingEvent.java
index dd887e0..39d948a 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildCompletingEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildCompletingEvent.java
@@ -17,6 +17,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId;
 import com.google.devtools.build.lib.util.ExitCode;
+import com.google.protobuf.util.Timestamps;
 import java.util.Collection;
 
 /**
@@ -80,6 +81,7 @@
         BuildEventStreamProtos.BuildFinished.newBuilder()
             .setOverallSuccess(ExitCode.SUCCESS.equals(exitCode))
             .setExitCode(protoExitCode)
+            .setFinishTime(Timestamps.fromMillis(finishTimeMillis))
             .setFinishTimeMillis(finishTimeMillis)
             .setAnomalyReport(protoAnamolyReport)
             .build();
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/BUILD b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/BUILD
index 118b30c..313dccb 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/BUILD
@@ -29,5 +29,7 @@
         "//src/main/protobuf:command_line_proto",
         "//src/main/protobuf:failure_details_proto",
         "//src/main/protobuf:invocation_policy_proto",
+        "@com_google_protobuf//:duration_proto",
+        "@com_google_protobuf//:timestamp_proto",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
index 21c93a6..48a00fb 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
@@ -16,6 +16,8 @@
 
 package build_event_stream;
 
+import "google/protobuf/duration.proto";
+import "google/protobuf/timestamp.proto";
 import "src/main/protobuf/command_line.proto";
 import "src/main/protobuf/failure_details.proto";
 import "src/main/protobuf/invocation_policy.proto";
@@ -321,9 +323,14 @@
   string uuid = 1;
 
   // Start of the build in ms since the epoch.
-  // TODO(buchgr): Use google.protobuf.TimeStamp once bazel's protoc supports
-  // it.
-  int64 start_time_millis = 2;
+  //
+  // Deprecated, use `start_time` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 start_time_millis = 2 [deprecated = true];
+
+  // Start of the build.
+  google.protobuf.Timestamp start_time = 9;
 
   // Version of the build tool that is running.
   string build_tool_version = 3;
@@ -575,7 +582,14 @@
   repeated string tag = 3;
 
   // The timeout specified for test actions under this configured target.
-  int64 test_timeout_seconds = 7;
+  //
+  // Deprecated, use `test_timeout` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 test_timeout_seconds = 7 [deprecated = true];
+
+  // The timeout specified for test actions under this configured target.
+  google.protobuf.Duration test_timeout = 10;
 
   // Failure information about the target, only populated if success is false,
   // and sometimes not even then. Equal to one of the ActionExecuted
@@ -612,11 +626,28 @@
   // Time in milliseconds since the epoch at which the test attempt was started.
   // Note: for cached test results, this is time can be before the start of the
   // build.
-  int64 test_attempt_start_millis_epoch = 6;
+  //
+  // Deprecated, use `test_attempt_start` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 test_attempt_start_millis_epoch = 6 [deprecated = true];
+
+  // Time at which the test attempt was started.
+  // Note: for cached test results, this is time can be before the start of the
+  // build.
+  google.protobuf.Timestamp test_attempt_start = 10;
 
   // Time the test took to run. For locally cached results, this is the time
   // the cached invocation took when it was invoked.
-  int64 test_attempt_duration_millis = 3;
+  //
+  // Deprecated, use `test_attempt_duration` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 test_attempt_duration_millis = 3 [deprecated = true];
+
+  // Time the test took to run. For locally cached results, this is the time
+  // the cached invocation took when it was invoked.
+  google.protobuf.Duration test_attempt_duration = 11;
 
   // Files (logs, test.xml, undeclared outputs, etc) generated by that test
   // action.
@@ -628,7 +659,7 @@
   // Message providing optional meta data on the execution of the test action,
   // if available.
   message ExecutionInfo {
-    // Deprecated, use TargetComplete.test_timeout_seconds instead.
+    // Deprecated, use TargetComplete.test_timeout instead.
     int32 timeout_seconds = 1 [deprecated = true];
 
     // Name of the strategy to execute this test action (e.g., "local",
@@ -647,11 +678,15 @@
 
     // Represents a hierarchical timing breakdown of an activity.
     // The top level time should be the total time of the activity.
-    // Invariant: time_millis >= sum of time_millis of all direct children.
+    // Invariant: `time` >= sum of `time`s of all direct children.
     message TimingBreakdown {
       repeated TimingBreakdown child = 1;
       string name = 2;
-      int64 time_millis = 3;
+      // Deprecated, use `time` instead.
+      //
+      // TODO(yannic): Remove.
+      int64 time_millis = 3 [deprecated = true];
+      google.protobuf.Duration time = 4;
     }
     TimingBreakdown timing_breakdown = 4;
 
@@ -689,13 +724,34 @@
   int32 total_num_cached = 6;
 
   // When the test first started running.
-  int64 first_start_time_millis = 7;
+  //
+  // Deprecated, use `first_start_time` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 first_start_time_millis = 7 [deprecated = true];
+
+  // When the test first started running.
+  google.protobuf.Timestamp first_start_time = 13;
 
   // When the last test action completed.
-  int64 last_stop_time_millis = 8;
+  //
+  // Deprecated, use `last_stop_time` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 last_stop_time_millis = 8 [deprecated = true];
+
+  // When the test first started running.
+  google.protobuf.Timestamp last_stop_time = 14;
 
   // The total runtime of the test.
-  int64 total_run_duration_millis = 9;
+  //
+  // Deprecated, use `total_run` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 total_run_duration_millis = 9 [deprecated = true];
+
+  // The total runtime of the test.
+  google.protobuf.Duration total_run_duration = 12;
 }
 
 // Payload of the event summarizing a target (test or non-test).
@@ -739,10 +795,15 @@
   // ExitCode.code equals 0.
   ExitCode exit_code = 3;
 
-  // Time in milliseconds since the epoch.
-  // TODO(buchgr): Use google.protobuf.Timestamp once bazel's protoc supports
-  // it.
-  int64 finish_time_millis = 2;
+  // End of the build in ms since the epoch.
+  //
+  // Deprecated, use `finish_time` instead.
+  //
+  // TODO(yannic): Remove.
+  int64 finish_time_millis = 2 [deprecated = true];
+
+  // End of the build.
+  google.protobuf.Timestamp finish_time = 5;
 
   AnomalyReport anomaly_report = 4;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java
index b62ebc3..6cd8ff7 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
 import com.google.devtools.build.lib.runtime.CommandLineEvent;
 import com.google.devtools.build.lib.util.ProcessUtils;
+import com.google.protobuf.util.Timestamps;
 import java.util.Collection;
 
 /**
@@ -101,6 +102,7 @@
     BuildEventStreamProtos.BuildStarted.Builder started =
         BuildEventStreamProtos.BuildStarted.newBuilder()
             .setUuid(request.getId().toString())
+            .setStartTime(Timestamps.fromMillis(request.getStartTime()))
             .setStartTimeMillis(request.getStartTime())
             .setBuildToolVersion(BlazeVersionInfo.instance().getVersion())
             .setOptionsDescription(request.getOptionsDescription())
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
index e163227..77818ed 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
@@ -41,6 +41,8 @@
 import com.google.devtools.build.lib.view.test.TestStatus.BlazeTestStatus;
 import com.google.devtools.build.lib.view.test.TestStatus.FailedTestCasesStatus;
 import com.google.devtools.build.lib.view.test.TestStatus.TestCase;
+import com.google.protobuf.util.Durations;
+import com.google.protobuf.util.Timestamps;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -605,8 +607,11 @@
             .setTotalRunCount(totalRuns())
             .setRunCount(testParams.getRuns())
             .setShardCount(testParams.getShards())
+            .setFirstStartTime(Timestamps.fromMillis(firstStartTimeMillis))
             .setFirstStartTimeMillis(firstStartTimeMillis)
+            .setLastStopTime(Timestamps.fromMillis(lastStopTimeMillis))
             .setLastStopTimeMillis(lastStopTimeMillis)
+            .setTotalRunDuration(Durations.fromMillis(totalRunDurationMillis))
             .setTotalRunDurationMillis(totalRunDurationMillis);
     for (Path path : getFailedLogs()) {
       String uri = pathConverter.apply(path);
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index a1ff36a..939ee38 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -247,8 +247,8 @@
         "//third_party:junit4",
         "//third_party:mockito",
         "//third_party:truth",
-        "//third_party/protobuf",
         "//third_party/protobuf:protobuf_java",
+        "@com_google_protobuf//java/util",
         "@com_google_testparameterinjector//:testparameterinjector",
     ],
 )
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
index d7cce6c..e4aae44 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
@@ -47,6 +47,8 @@
 import com.google.devtools.build.lib.view.test.TestStatus.FailedTestCasesStatus;
 import com.google.devtools.build.lib.view.test.TestStatus.TestCase;
 import com.google.devtools.build.lib.view.test.TestStatus.TestCase.Status;
+import com.google.protobuf.util.Durations;
+import com.google.protobuf.util.Timestamps;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -277,8 +279,11 @@
             BuildEventStreamProtos.TestSummary.newBuilder()
                 .setOverallStatus(TestStatus.FAILED)
                 .setFirstStartTimeMillis(1000)
+                .setFirstStartTime(Timestamps.fromMillis(1000))
                 .setLastStopTimeMillis(1300)
+                .setLastStopTime(Timestamps.fromMillis(1300))
                 .setTotalRunDurationMillis(300)
+                .setTotalRunDuration(Durations.fromMillis(300))
                 .setRunCount(2)
                 .setShardCount(3)
                 .addPassed(BuildEventStreamProtos.File.newBuilder().setUri("/path/to/apple"))