diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build')
6 files changed, 473 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index f7ae7d599a..4c1f7b226d 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -27,6 +27,7 @@ filegroup( "//src/test/java/com/google/devtools/build/lib/skyframe:srcs", "//src/test/java/com/google/devtools/build/lib/rules/repository:srcs", "//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs", + "//src/test/java/com/google/devtools/build/lib/buildeventstream/transports:srcs", "//src/test/java/com/google/devtools/build/lib/buildtool:srcs", ], visibility = ["//src:__pkg__"], @@ -1000,6 +1001,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib:vfs", "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", + "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:invocation_policy_java_proto", "//src/main/protobuf:test_status_java_proto", diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD new file mode 100644 index 0000000000..6472d8aa21 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD @@ -0,0 +1,24 @@ +filegroup( + name = "srcs", + srcs = glob(["**"]), + visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"], +) + +java_test( + name = "BuildEventTransportTest", + srcs = glob(["*.java"]), + test_class = "com.google.devtools.build.lib.AllTests", + runtime_deps = ["//src/test/java/com/google/devtools/build/lib:test_runner"], + deps = [ + "//src/main/java/com/google/devtools/build/lib:buildeventstream", + "//src/main/java/com/google/devtools/build/lib:runtime", + "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", + "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports", + "//src/test/java/com/google/devtools/build/lib:packages_testutil", + "//third_party:guava", + "//third_party:junit4", + "//third_party:mockito", + "//third_party:truth", + "//third_party/protobuf", + ], +) diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java new file mode 100644 index 0000000000..e241e8410c --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java @@ -0,0 +1,90 @@ +// Copyright 2016 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.buildeventstream.transports; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.Progress; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.TargetComplete; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +/** Tests {@link BinaryFormatFileTransport}. **/ +@RunWith(JUnit4.class) +public class BinaryFormatFileTransportTest { + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + @Mock public BuildEvent buildEvent; + + @Before + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @After + public void validateMocks() { + Mockito.validateMockitoUsage(); + } + + @Test + public void testCreatesFileAndWritesProtoTextFormat() throws IOException { + File output = tmp.newFile(); + + BuildEventStreamProtos.BuildEvent started = + BuildEventStreamProtos.BuildEvent.newBuilder() + .setStarted(BuildStarted.newBuilder().setCommand("build")) + .build(); + when(buildEvent.asStreamProto()).thenReturn(started); + BinaryFormatFileTransport transport = new BinaryFormatFileTransport(output.getAbsolutePath()); + transport.sendBuildEvent(buildEvent); + + BuildEventStreamProtos.BuildEvent progress = + BuildEventStreamProtos.BuildEvent.newBuilder().setProgress(Progress.newBuilder()).build(); + when(buildEvent.asStreamProto()).thenReturn(progress); + transport.sendBuildEvent(buildEvent); + + BuildEventStreamProtos.BuildEvent completed = + BuildEventStreamProtos.BuildEvent.newBuilder() + .setCompleted(TargetComplete.newBuilder().setSuccess(true)) + .build(); + when(buildEvent.asStreamProto()).thenReturn(completed); + transport.sendBuildEvent(buildEvent); + + transport.close(); + try (InputStream in = new FileInputStream(output)) { + assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(started); + assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(progress); + assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(completed); + assertThat(in.available()).isEqualTo(0); + } + } +} diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java new file mode 100644 index 0000000000..8d4aa520db --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java @@ -0,0 +1,130 @@ +// Copyright 2016 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.buildeventstream.transports; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import com.google.common.base.Function; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted; +import com.google.devtools.build.lib.buildeventstream.BuildEventTransport; +import java.io.File; +import java.io.IOException; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +/** Tests {@link BuildEventTransportFactory}. **/ +@RunWith(JUnit4.class) +public class BuildEventTransportFactoryTest { + + private static final Function<Object, Class<?>> GET_CLASS = + new Function<Object, Class<?>>() { + @Override + public Class<?> apply(Object o) { + return o.getClass(); + } + }; + + private static final BuildEventStreamProtos.BuildEvent BUILD_EVENT_AS_PROTO = + BuildEventStreamProtos.BuildEvent.newBuilder() + .setStarted(BuildStarted.newBuilder().setCommand("build")) + .build(); + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + @Mock public BuildEventStreamOptions options; + + @Mock public BuildEvent buildEvent; + + @Before + public void before() { + MockitoAnnotations.initMocks(this); + when(buildEvent.asStreamProto()).thenReturn(BUILD_EVENT_AS_PROTO); + } + + @After + public void validateMocks() { + Mockito.validateMockitoUsage(); + } + + @Test + public void testCreatesTextFormatFileTransport() throws IOException { + File textFile = tmp.newFile(); + when(options.getBuildEventTextFile()).thenReturn(textFile.getAbsolutePath()); + when(options.getBuildEventBinaryFile()).thenReturn(""); + ImmutableSet<BuildEventTransport> transports = + BuildEventTransportFactory.createFromOptions(options); + assertThat(FluentIterable.from(transports).transform(GET_CLASS)) + .containsExactly(TextFormatFileTransport.class); + sendEventsAndClose(buildEvent, transports); + assertThat(textFile.exists()).isTrue(); + } + + @Test + public void testCreatesBinaryFormatFileTransport() throws IOException { + File binaryFile = tmp.newFile(); + when(options.getBuildEventTextFile()).thenReturn(""); + when(options.getBuildEventBinaryFile()).thenReturn(binaryFile.getAbsolutePath()); + ImmutableSet<BuildEventTransport> transports = + BuildEventTransportFactory.createFromOptions(options); + assertThat(FluentIterable.from(transports).transform(GET_CLASS)) + .containsExactly(BinaryFormatFileTransport.class); + sendEventsAndClose(buildEvent, transports); + assertThat(binaryFile.exists()).isTrue(); + } + + @Test + public void testCreatesAllTransports() throws IOException { + File textFile = tmp.newFile(); + File binaryFile = tmp.newFile(); + when(options.getBuildEventTextFile()).thenReturn(textFile.getAbsolutePath()); + when(options.getBuildEventBinaryFile()).thenReturn(binaryFile.getAbsolutePath()); + ImmutableSet<BuildEventTransport> transports = + BuildEventTransportFactory.createFromOptions(options); + assertThat(FluentIterable.from(transports).transform(GET_CLASS)) + .containsExactly(TextFormatFileTransport.class, BinaryFormatFileTransport.class); + sendEventsAndClose(buildEvent, transports); + assertThat(textFile.exists()).isTrue(); + assertThat(binaryFile.exists()).isTrue(); + } + + @Test + public void testCreatesNoTransports() throws IOException { + when(options.getBuildEventTextFile()).thenReturn(""); + ImmutableSet<BuildEventTransport> transports = + BuildEventTransportFactory.createFromOptions(options); + assertThat(transports).isEmpty(); + } + + private void sendEventsAndClose(BuildEvent event, Iterable<BuildEventTransport> transports) + throws IOException{ + for (BuildEventTransport transport : transports) { + transport.sendBuildEvent(event); + transport.close(); + } + } +} diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java new file mode 100644 index 0000000000..798e8557c8 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java @@ -0,0 +1,91 @@ +// Copyright 2016 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.buildeventstream.transports; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import com.google.common.base.Joiner; +import com.google.common.io.Files; +import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.Progress; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.TargetComplete; +import com.google.protobuf.TextFormat; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +/** Tests {@link TextFormatFileTransport}. **/ +@RunWith(JUnit4.class) +public class TextFormatFileTransportTest { + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + @Mock public BuildEvent buildEvent; + + @Before + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @After + public void validateMocks() { + Mockito.validateMockitoUsage(); + } + + @Test + public void testCreatesFileAndWritesProtoTextFormat() throws IOException { + File output = tmp.newFile(); + + BuildEventStreamProtos.BuildEvent started = + BuildEventStreamProtos.BuildEvent.newBuilder() + .setStarted(BuildStarted.newBuilder().setCommand("build")) + .build(); + when(buildEvent.asStreamProto()).thenReturn(started); + TextFormatFileTransport transport = new TextFormatFileTransport(output.getAbsolutePath()); + transport.sendBuildEvent(buildEvent); + + BuildEventStreamProtos.BuildEvent progress = + BuildEventStreamProtos.BuildEvent.newBuilder().setProgress(Progress.newBuilder()).build(); + when(buildEvent.asStreamProto()).thenReturn(progress); + transport.sendBuildEvent(buildEvent); + + BuildEventStreamProtos.BuildEvent completed = + BuildEventStreamProtos.BuildEvent.newBuilder() + .setCompleted(TargetComplete.newBuilder().setSuccess(true)) + .build(); + when(buildEvent.asStreamProto()).thenReturn(completed); + transport.sendBuildEvent(buildEvent); + + transport.close(); + String contents = + Joiner.on(System.lineSeparator()).join(Files.readLines(output, StandardCharsets.UTF_8)); + assertThat(contents).contains(TextFormat.printToString(started)); + assertThat(contents).contains(TextFormat.printToString(progress)); + assertThat(contents).contains(TextFormat.printToString(completed)); + } +} diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java new file mode 100644 index 0000000000..ad5a87c745 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java @@ -0,0 +1,136 @@ +// Copyright 2016 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.runtime; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; +import com.google.devtools.build.lib.buildeventstream.transports.BinaryFormatFileTransport; +import com.google.devtools.build.lib.buildeventstream.transports.BuildEventStreamOptions; +import com.google.devtools.build.lib.buildeventstream.transports.TextFormatFileTransport; +import com.google.devtools.build.lib.runtime.BlazeModule.ModuleEnvironment; +import com.google.devtools.common.options.OptionsBase; +import com.google.devtools.common.options.OptionsParser; +import com.google.devtools.common.options.OptionsProvider; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +/** Tests {@link BuildEventStreamerModule}. **/ +@RunWith(JUnit4.class) +public class BuildEventStreamerModuleTest { + + private static final Function<Object, Class<?>> GET_CLASS = + new Function<Object, Class<?>>() { + @Override + public Class<?> apply(Object o) { + return o.getClass(); + } + }; + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + @Mock public BuildEventStreamOptions options; + + @Mock public OptionsProvider optionsProvider; + + @Mock public ModuleEnvironment moduleEnvironment; + + @Mock public Command command; + + @Before + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @After + public void validateMocks() { + Mockito.validateMockitoUsage(); + } + + @Test + public void testReturnsBuildEventStreamerOptions() throws Exception { + BuildEventStreamerModule module = new BuildEventStreamerModule(); + Iterable<Class<? extends OptionsBase>> commandOptions = module.getCommandOptions(command); + assertThat(commandOptions).isNotEmpty(); + OptionsParser optionsParser = OptionsParser.newOptionsParser(commandOptions); + optionsParser.parse( + "--experimental_build_event_text_file", "/tmp/foo.txt", + "--experimental_build_event_binary_file", "/tmp/foo.bin"); + BuildEventStreamOptions options = optionsParser.getOptions(BuildEventStreamOptions.class); + assertThat(options.getBuildEventTextFile()).isEqualTo("/tmp/foo.txt"); + assertThat(options.getBuildEventBinaryFile()).isEqualTo("/tmp/foo.bin"); + } + + @Test + public void testCreatesStreamerForTextFormatFileTransport() throws Exception { + when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options); + when(options.getBuildEventTextFile()).thenReturn(tmp.newFile().getAbsolutePath()); + + BuildEventStreamerModule module = new BuildEventStreamerModule(); + Optional<BuildEventStreamer> buildEventStreamer = + module.tryCreateStreamer(optionsProvider, moduleEnvironment); + assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class); + assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS)) + .containsExactly(TextFormatFileTransport.class); + } + + @Test + public void testCreatesStreamerForBinaryFormatFileTransport() throws Exception { + when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options); + when(options.getBuildEventBinaryFile()).thenReturn(tmp.newFile().getAbsolutePath()); + + BuildEventStreamerModule module = new BuildEventStreamerModule(); + Optional<BuildEventStreamer> buildEventStreamer = + module.tryCreateStreamer(optionsProvider, moduleEnvironment); + assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class); + assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS)) + .containsExactly(BinaryFormatFileTransport.class); + } + + @Test + public void testCreatesStreamerForAllTransports() throws Exception { + when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options); + when(options.getBuildEventTextFile()).thenReturn(tmp.newFile().getAbsolutePath()); + when(options.getBuildEventBinaryFile()).thenReturn(tmp.newFile().getAbsolutePath()); + + BuildEventStreamerModule module = new BuildEventStreamerModule(); + Optional<BuildEventStreamer> buildEventStreamer = + module.tryCreateStreamer(optionsProvider, moduleEnvironment); + assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class); + assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS)) + .containsExactly(TextFormatFileTransport.class, BinaryFormatFileTransport.class); + } + + @Test + public void testDoesNotCreatesStreamerWithoutTransports() throws Exception { + when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options); + + BuildEventStreamerModule module = new BuildEventStreamerModule(); + Optional<BuildEventStreamer> buildEventStreamer = + module.tryCreateStreamer(optionsProvider, moduleEnvironment); + assertThat(buildEventStreamer.isPresent()).isFalse(); + } +} |