blob: e26bb419e9e69d52415c4855ff047a19bcfe1c87 [file] [log] [blame]
// 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<String> 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());
}
}