| // Copyright 2017 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.devtools.build.lib.buildeventservice; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableSet; |
| import com.google.devtools.build.lib.testutil.ManualClock; |
| import com.google.devtools.build.v1.BuildEvent; |
| import com.google.devtools.build.v1.BuildEvent.BuildComponentStreamFinished; |
| import com.google.devtools.build.v1.BuildEvent.BuildComponentStreamFinished.FinishType; |
| import com.google.devtools.build.v1.BuildEvent.BuildEnqueued; |
| import com.google.devtools.build.v1.BuildEvent.BuildFinished; |
| import com.google.devtools.build.v1.BuildEvent.InvocationAttemptFinished; |
| import com.google.devtools.build.v1.BuildEvent.InvocationAttemptStarted; |
| import com.google.devtools.build.v1.BuildStatus; |
| import com.google.devtools.build.v1.BuildStatus.Result; |
| import com.google.devtools.build.v1.OrderedBuildEvent; |
| import com.google.devtools.build.v1.PublishBuildToolEventStreamRequest; |
| import com.google.devtools.build.v1.PublishLifecycleEventRequest; |
| import com.google.devtools.build.v1.PublishLifecycleEventRequest.ServiceLevel; |
| import com.google.devtools.build.v1.StreamId; |
| import com.google.devtools.build.v1.StreamId.BuildComponent; |
| import com.google.protobuf.Any; |
| import com.google.protobuf.Timestamp; |
| import com.google.protobuf.util.Timestamps; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** Tests {@link BuildEventServiceProtoUtil}. * */ |
| @RunWith(JUnit4.class) |
| public class BuildEventServiceProtoUtilTest { |
| |
| private static final String BUILD_REQUEST_ID = "feedbeef-dead-4321-beef-deaddeaddead"; |
| private static final String BUILD_INVOCATION_ID = "feedbeef-dead-4444-beef-deaddeaddead"; |
| private static final String PROJECT_ID = "my_project"; |
| private static final String COMMAND_NAME = "test"; |
| private static final String ADDITIONAL_KEYWORD = "keyword=foo"; |
| private static final ImmutableList<String> EXPECTED_KEYWORDS = |
| ImmutableList.of("command_name=" + COMMAND_NAME, "protocol_name=BEP", ADDITIONAL_KEYWORD); |
| private static final BuildEventServiceProtoUtil BES_PROTO_UTIL = |
| new BuildEventServiceProtoUtil.Builder() |
| .buildRequestId(BUILD_REQUEST_ID) |
| .invocationId(BUILD_INVOCATION_ID) |
| .projectId(PROJECT_ID) |
| .commandName(COMMAND_NAME) |
| .keywords(ImmutableSet.of(ADDITIONAL_KEYWORD)) |
| .build(); |
| private final ManualClock clock = new ManualClock(); |
| |
| @Test |
| public void testBuildEnqueued() { |
| Timestamp expected = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.buildEnqueued(expected)) |
| .isEqualTo( |
| PublishLifecycleEventRequest.newBuilder() |
| .setServiceLevel(ServiceLevel.INTERACTIVE) |
| .setProjectId(PROJECT_ID) |
| .setBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setComponent(BuildComponent.CONTROLLER)) |
| .setSequenceNumber(1) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(expected) |
| .setBuildEnqueued(BuildEnqueued.newBuilder()))) |
| .build()); |
| } |
| |
| @Test |
| public void testInvocationAttemptStarted() { |
| Timestamp expected = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.invocationStarted(expected)) |
| .isEqualTo( |
| PublishLifecycleEventRequest.newBuilder() |
| .setServiceLevel(ServiceLevel.INTERACTIVE) |
| .setProjectId(PROJECT_ID) |
| .setBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setInvocationId(BUILD_INVOCATION_ID) |
| .setComponent(BuildComponent.CONTROLLER)) |
| .setSequenceNumber(1) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(expected) |
| .setInvocationAttemptStarted( |
| InvocationAttemptStarted.newBuilder().setAttemptNumber(1)))) |
| .build()); |
| } |
| |
| @Test |
| public void testInvocationAttemptFinished() { |
| Timestamp expected = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.invocationFinished(expected, Result.COMMAND_SUCCEEDED)) |
| .isEqualTo( |
| PublishLifecycleEventRequest.newBuilder() |
| .setServiceLevel(ServiceLevel.INTERACTIVE) |
| .setProjectId(PROJECT_ID) |
| .setBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setInvocationId(BUILD_INVOCATION_ID) |
| .setComponent(BuildComponent.CONTROLLER)) |
| .setSequenceNumber(2) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(expected) |
| .setInvocationAttemptFinished( |
| InvocationAttemptFinished.newBuilder() |
| .setInvocationStatus( |
| BuildStatus.newBuilder() |
| .setResult(Result.COMMAND_SUCCEEDED))))) |
| .build()); |
| } |
| |
| @Test |
| public void testBuildFinished() { |
| Timestamp expected = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.buildFinished(expected, Result.COMMAND_SUCCEEDED)) |
| .isEqualTo( |
| PublishLifecycleEventRequest.newBuilder() |
| .setServiceLevel(ServiceLevel.INTERACTIVE) |
| .setProjectId(PROJECT_ID) |
| .setBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setComponent(BuildComponent.CONTROLLER)) |
| .setSequenceNumber(2) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(expected) |
| .setBuildFinished( |
| BuildFinished.newBuilder() |
| .setStatus( |
| BuildStatus.newBuilder() |
| .setResult(Result.COMMAND_SUCCEEDED))))) |
| .build()); |
| } |
| |
| @Test |
| public void testStreamEvents() { |
| Timestamp firstEventTimestamp = Timestamps.fromMillis(clock.advanceMillis(100)); |
| Any anything = Any.getDefaultInstance(); |
| assertThat(BES_PROTO_UTIL.bazelEvent(1, firstEventTimestamp, anything)) |
| .isEqualTo( |
| PublishBuildToolEventStreamRequest.newBuilder() |
| .addAllNotificationKeywords(EXPECTED_KEYWORDS) |
| .setProjectId(PROJECT_ID) |
| .setOrderedBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setInvocationId(BUILD_INVOCATION_ID) |
| .setComponent(BuildComponent.TOOL)) |
| .setSequenceNumber(1) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(firstEventTimestamp) |
| .setBazelEvent(anything)) |
| .build()) |
| .build()); |
| |
| Timestamp secondEventTimestamp = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.bazelEvent(2, secondEventTimestamp, anything)) |
| .isEqualTo( |
| PublishBuildToolEventStreamRequest.newBuilder() |
| .setProjectId(PROJECT_ID) |
| .setOrderedBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setInvocationId(BUILD_INVOCATION_ID) |
| .setComponent(BuildComponent.TOOL)) |
| .setSequenceNumber(2) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(secondEventTimestamp) |
| .setBazelEvent(anything)) |
| .build()) |
| .build()); |
| |
| Timestamp thirdEventTimestamp = Timestamps.fromMillis(clock.advanceMillis(100)); |
| assertThat(BES_PROTO_UTIL.streamFinished(3, thirdEventTimestamp)) |
| .isEqualTo( |
| PublishBuildToolEventStreamRequest.newBuilder() |
| .setProjectId(PROJECT_ID) |
| .setOrderedBuildEvent( |
| OrderedBuildEvent.newBuilder() |
| .setStreamId( |
| StreamId.newBuilder() |
| .setBuildId(BUILD_REQUEST_ID) |
| .setInvocationId(BUILD_INVOCATION_ID) |
| .setComponent(BuildComponent.TOOL)) |
| .setSequenceNumber(3) |
| .setEvent( |
| BuildEvent.newBuilder() |
| .setEventTime(thirdEventTimestamp) |
| .setComponentStreamFinished( |
| BuildComponentStreamFinished.newBuilder() |
| .setType(FinishType.FINISHED))) |
| .build()) |
| .build()); |
| } |
| } |