// 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.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 EXPECTED_KEYWORDS = ImmutableList.of("command_name=" + COMMAND_NAME, "protocol_name=BEP", ADDITIONAL_KEYWORD); private final ManualClock clock = new ManualClock(); private final BuildEventServiceProtoUtil besProtocol = new BuildEventServiceProtoUtil( BUILD_REQUEST_ID, BUILD_INVOCATION_ID, PROJECT_ID, COMMAND_NAME, clock, ImmutableSet.of(ADDITIONAL_KEYWORD)); @Test public void testBuildEnqueued() { long expected = clock.advanceMillis(100); assertThat(besProtocol.buildEnqueued()) .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(Timestamps.fromMillis(expected)) .setBuildEnqueued(BuildEnqueued.newBuilder()))) .build()); } @Test public void testInvocationAttemptStarted() { long expected = clock.advanceMillis(100); assertThat(besProtocol.invocationStarted()) .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(Timestamps.fromMillis(expected)) .setInvocationAttemptStarted( InvocationAttemptStarted.newBuilder().setAttemptNumber(1)))) .build()); } @Test public void testInvocationAttemptFinished() { long expected = clock.advanceMillis(100); assertThat(besProtocol.invocationFinished(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(Timestamps.fromMillis(expected)) .setInvocationAttemptFinished( InvocationAttemptFinished.newBuilder() .setInvocationStatus( BuildStatus.newBuilder() .setResult(Result.COMMAND_SUCCEEDED))))) .build()); } @Test public void testBuildFinished() { long expected = clock.advanceMillis(100); assertThat(besProtocol.buildFinished(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(Timestamps.fromMillis(expected)) .setBuildFinished( BuildFinished.newBuilder() .setStatus( BuildStatus.newBuilder() .setResult(Result.COMMAND_SUCCEEDED))))) .build()); } @Test public void testStreamEvents() { long firstEventTimestamp = clock.advanceMillis(100); Any anything = Any.getDefaultInstance(); assertThat(besProtocol.bazelEvent(1, anything)) .isEqualTo( PublishBuildToolEventStreamRequest.newBuilder() .addAllNotificationKeywords(EXPECTED_KEYWORDS) .setOrderedBuildEvent( OrderedBuildEvent.newBuilder() .setStreamId( StreamId.newBuilder() .setBuildId(BUILD_REQUEST_ID) .setInvocationId(BUILD_INVOCATION_ID) .setComponent(BuildComponent.TOOL)) .setSequenceNumber(1) .setEvent( BuildEvent.newBuilder() .setEventTime(Timestamps.fromMillis(firstEventTimestamp)) .setBazelEvent(anything)) .build()) .build()); long secondEventTimestamp = clock.advanceMillis(100); assertThat(besProtocol.bazelEvent(2, anything)) .isEqualTo( PublishBuildToolEventStreamRequest.newBuilder() .setOrderedBuildEvent( OrderedBuildEvent.newBuilder() .setStreamId( StreamId.newBuilder() .setBuildId(BUILD_REQUEST_ID) .setInvocationId(BUILD_INVOCATION_ID) .setComponent(BuildComponent.TOOL)) .setSequenceNumber(2) .setEvent( BuildEvent.newBuilder() .setEventTime(Timestamps.fromMillis(secondEventTimestamp)) .setBazelEvent(anything)) .build()) .build()); long thirdEventTimestamp = clock.advanceMillis(100); assertThat(besProtocol.streamFinished(3)) .isEqualTo( PublishBuildToolEventStreamRequest.newBuilder() .setOrderedBuildEvent( OrderedBuildEvent.newBuilder() .setStreamId( StreamId.newBuilder() .setBuildId(BUILD_REQUEST_ID) .setInvocationId(BUILD_INVOCATION_ID) .setComponent(BuildComponent.TOOL)) .setSequenceNumber(3) .setEvent( BuildEvent.newBuilder() .setEventTime(Timestamps.fromMillis(thirdEventTimestamp)) .setComponentStreamFinished( BuildComponentStreamFinished.newBuilder() .setType(FinishType.FINISHED))) .build()) .build()); } }