From 2348a75882bda4ed8b983fd4f8af2c45fa292e10 Mon Sep 17 00:00:00 2001 From: tomlu Date: Wed, 4 Jul 2018 08:55:42 -0700 Subject: Include more information about build events' referenced local files. Instead of just a path, events now include information about the type of file (output, source file, stdout/stderr, test logs, etc.). This information can be used by the uploaders to determine a) whether to upload, b) what kind of lease to give the files. RELNOTES: None PiperOrigin-RevId: 203285549 --- .../build/lib/actions/ActionExecutedEvent.java | 14 ++--- .../build/lib/analysis/TargetCompleteEvent.java | 10 ++-- .../BuildEventServiceTransport.java | 13 ++++- .../build/lib/buildeventstream/BuildEvent.java | 61 +++++++++++++++++++--- .../BuildEventArtifactUploader.java | 28 +++++----- .../build/lib/buildeventstream/BuildToolLogs.java | 12 ++--- .../buildeventstream/transports/FileTransport.java | 16 ++++-- .../devtools/build/lib/exec/TestAttempt.java | 14 +++-- .../devtools/build/lib/remote/RemoteModule.java | 16 +++--- .../build/lib/runtime/NamedArtifactGroup.java | 14 +++-- .../devtools/build/lib/runtime/TestSummary.java | 16 +++--- 11 files changed, 144 insertions(+), 70 deletions(-) (limited to 'src/main/java/com/google') diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java index a4fa28be5e..372c5598ec 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java @@ -17,8 +17,8 @@ package com.google.devtools.build.lib.actions; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; @@ -118,18 +118,18 @@ public class ActionExecutedEvent implements BuildEventWithConfiguration, Progres } @Override - public ImmutableSet referencedLocalFiles() { - ImmutableSet.Builder artifacts = ImmutableSet.builder(); + public Collection referencedLocalFiles() { + ImmutableList.Builder localFiles = ImmutableList.builder(); if (stdout != null) { - artifacts.add(stdout); + localFiles.add(new LocalFile(stdout, LocalFileType.STDOUT)); } if (stderr != null) { - artifacts.add(stderr); + localFiles.add(new LocalFile(stderr, LocalFileType.STDERR)); } if (exception == null) { - artifacts.add(action.getPrimaryOutput().getPath()); + localFiles.add(new LocalFile(action.getPrimaryOutput().getPath(), LocalFileType.OUTPUT)); } - return artifacts.build(); + return localFiles.build(); } @Override 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 adb71f4f9d..4ae435e091 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 @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.analysis.test.TestProvider; import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer; import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; @@ -278,12 +279,15 @@ public final class TargetCompleteEvent } @Override - public ImmutableSet referencedLocalFiles() { - ImmutableSet.Builder builder = ImmutableSet.builder(); + public Collection referencedLocalFiles() { + ImmutableList.Builder builder = ImmutableList.builder(); for (ArtifactsInOutputGroup group : outputs) { if (group.areImportant()) { for (Artifact artifact : group.getArtifacts()) { - builder.add(artifact.getPath()); + builder.add( + new LocalFile( + artifact.getPath(), + artifact.isSourceArtifact() ? LocalFileType.SOURCE : LocalFileType.OUTPUT)); } } } diff --git a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceTransport.java b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceTransport.java index f5afa63a22..cb02ae3693 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceTransport.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceTransport.java @@ -27,6 +27,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; @@ -35,6 +36,7 @@ import com.google.devtools.build.lib.buildeventservice.client.BuildEventServiceC import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer; import com.google.devtools.build.lib.buildeventstream.BuildCompletingEvent; import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile; import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventProtocolOptions; @@ -50,6 +52,7 @@ import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.ExitCode; import com.google.devtools.build.lib.util.JavaSleeper; import com.google.devtools.build.lib.util.Sleeper; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.v1.BuildStatus.Result; import com.google.devtools.build.v1.PublishBuildToolEventStreamRequest; import com.google.devtools.build.v1.PublishBuildToolEventStreamResponse; @@ -57,6 +60,7 @@ import com.google.devtools.build.v1.PublishLifecycleEventRequest; import com.google.protobuf.Any; import io.grpc.Status; import java.time.Duration; +import java.util.Collection; import java.util.Deque; import java.util.Set; import java.util.concurrent.BlockingDeque; @@ -310,8 +314,13 @@ public class BuildEventServiceTransport implements BuildEventTransport { } } - ListenableFuture upload = - artifactUploader.upload(event.referencedLocalFiles()); + Collection localFiles = event.referencedLocalFiles(); + ImmutableMap.Builder localFileMap = + ImmutableMap.builderWithExpectedSize(localFiles.size()); + for (LocalFile localFile : localFiles) { + localFileMap.put(localFile.path, localFile); + } + ListenableFuture upload = artifactUploader.upload(localFileMap.build()); InternalOrderedBuildEvent buildEvent = new DefaultInternalOrderedBuildEvent(event, namer, upload, besProtoUtil.nextSequenceNumber()); sendOrderedBuildEvent(buildEvent); diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEvent.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEvent.java index 6d6900687c..cee573cae2 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEvent.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEvent.java @@ -14,10 +14,11 @@ package com.google.devtools.build.lib.buildeventstream; -import com.google.common.collect.ImmutableSet; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.vfs.Path; -import java.util.Set; +import java.util.Collection; /** * Interface for objects that can be posted on the public event stream. @@ -27,6 +28,52 @@ import java.util.Set; */ public interface BuildEvent extends ChainableEvent, ExtendedEventHandler.Postable { + /** + * A local file that is referenced by the build event. These can be uploaded to a separate backend + * storage. + */ + final class LocalFile { + + /** + * The type of the local file. This is used by uploaders to determine how long to store the + * associated files for. + */ + public enum LocalFileType { + SOURCE, + OUTPUT, + SUCCESSFUL_TEST_OUTPUT, + FAILED_TEST_OUTPUT, + STDOUT, + STDERR, + LOG, + } + + public final Path path; + public final LocalFileType type; + + public LocalFile(Path path, LocalFileType type) { + this.path = path; + this.type = type; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LocalFile localFile = (LocalFile) o; + return Objects.equal(path, localFile.path) && type == localFile.type; + } + + @Override + public int hashCode() { + return Objects.hashCode(path, type); + } + } + /** * Returns a list of files that are referenced in the protobuf representation returned by {@link * #asStreamProto(BuildEventContext)}. @@ -35,13 +82,11 @@ public interface BuildEvent extends ChainableEvent, ExtendedEventHandler.Postabl * only returns files directly referenced in the protobuf returned by {@link * #asStreamProto(BuildEventContext)}. * - *

Note the consistency requirement - you must not attempt to pass Path objects to the - * {@link PathConverter} unless you have returned the Path object here. + *

Note the consistency requirement - you must not attempt to pass Path objects to the {@link + * PathConverter} unless you have returned a corresponding {@link LocalFile} object here. */ - // TODO(ulfjack): Consider moving the upload call to the BuildEventContext and returning a map - // from Path to URI, rather than a callback. - default Set referencedLocalFiles() { - return ImmutableSet.of(); + default Collection referencedLocalFiles() { + return ImmutableList.of(); } /** diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploader.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploader.java index 5c1fe9c5b2..3f536325db 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploader.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventArtifactUploader.java @@ -15,30 +15,32 @@ package com.google.devtools.build.lib.buildeventstream; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile; import com.google.devtools.build.lib.buildeventstream.PathConverter.FileUriPathConverter; import com.google.devtools.build.lib.vfs.Path; -import java.util.Set; +import java.util.Map; /** Uploads artifacts referenced by the Build Event Protocol (BEP). */ public interface BuildEventArtifactUploader { - BuildEventArtifactUploader LOCAL_FILES_UPLOADER = new BuildEventArtifactUploader() { - private final ListenableFuture completedPathConverter = - Futures.immediateFuture(new FileUriPathConverter()); + BuildEventArtifactUploader LOCAL_FILES_UPLOADER = + new BuildEventArtifactUploader() { + private final ListenableFuture completedPathConverter = + Futures.immediateFuture(new FileUriPathConverter()); - @Override - public ListenableFuture upload(Set files) { - return completedPathConverter; - } - }; + @Override + public ListenableFuture upload(Map files) { + return completedPathConverter; + } + }; /** - * Asynchronously uploads a set of files referenced by the protobuf representation of a - * {@link BuildEvent}. This method is expected to return quickly. + * Asynchronously uploads a set of files referenced by the protobuf representation of a {@link + * BuildEvent}. This method is expected to return quickly. * *

This method must not throw any exceptions. - * + * *

Returns a future to a {@link PathConverter} that must provide a name for each uploaded file * as it should appear in the BEP. */ - ListenableFuture upload(Set files); + ListenableFuture upload(Map files); } diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildToolLogs.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildToolLogs.java index c4eee48b28..8ac55d6db2 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildToolLogs.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildToolLogs.java @@ -14,7 +14,7 @@ package com.google.devtools.build.lib.buildeventstream; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.Path; import com.google.protobuf.ByteString; @@ -38,16 +38,16 @@ public class BuildToolLogs implements BuildEventWithOrderConstraint { @Override public Collection getChildrenEvents() { - return ImmutableList.of(); + return ImmutableList.of(); } @Override - public ImmutableSet referencedLocalFiles() { - ImmutableSet.Builder artifacts = ImmutableSet.builder(); + public Collection referencedLocalFiles() { + ImmutableList.Builder localFiles = ImmutableList.builder(); for (Pair logFile : logFiles) { - artifacts.add(logFile.getSecond()); + localFiles.add(new LocalFile(logFile.getSecond(), LocalFileType.LOG)); } - return artifacts.build(); + return localFiles.build(); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java index c193ed094b..cce4f2d213 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/transports/FileTransport.java @@ -19,12 +19,14 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer; import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile; import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventProtocolOptions; @@ -37,7 +39,7 @@ import com.google.devtools.build.lib.util.io.AsynchronousFileOutputStream; import com.google.devtools.build.lib.vfs.Path; import com.google.protobuf.Message; import java.io.IOException; -import java.util.Set; +import java.util.Collection; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; @@ -147,10 +149,14 @@ abstract class FileTransport implements BuildEventTransport { * Returns a {@link PathConverter} for the uploaded files, or {@code null} when the uploaded * failed. */ - private ListenableFuture uploadReferencedFiles(Set artifacts) { - checkNotNull(artifacts); - - ListenableFuture upload = uploader.upload(artifacts); + private ListenableFuture uploadReferencedFiles(Collection localFiles) { + checkNotNull(localFiles); + ImmutableMap.Builder localFileMap = + ImmutableMap.builderWithExpectedSize(localFiles.size()); + for (LocalFile localFile : localFiles) { + localFileMap.put(localFile.path, localFile); + } + ListenableFuture upload = uploader.upload(localFileMap.build()); Futures.addCallback( upload, new FutureCallback() { diff --git a/src/main/java/com/google/devtools/build/lib/exec/TestAttempt.java b/src/main/java/com/google/devtools/build/lib/exec/TestAttempt.java index 5d2c94a540..ea90ce7863 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/TestAttempt.java +++ b/src/main/java/com/google/devtools/build/lib/exec/TestAttempt.java @@ -17,9 +17,9 @@ package com.google.devtools.build.lib.exec; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.test.TestRunnerAction; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; @@ -189,12 +189,16 @@ public class TestAttempt implements BuildEventWithOrderConstraint { } @Override - public ImmutableSet referencedLocalFiles() { - ImmutableSet.Builder artifacts = ImmutableSet.builder(); + public ImmutableList referencedLocalFiles() { + LocalFileType localFileType = + status == TestStatus.PASSED + ? LocalFileType.SUCCESSFUL_TEST_OUTPUT + : LocalFileType.FAILED_TEST_OUTPUT; + ImmutableList.Builder localFiles = ImmutableList.builder(); for (Pair file : files) { - artifacts.add(file.getSecond()); + localFiles.add(new LocalFile(file.getSecond(), localFileType)); } - return artifacts.build(); + return localFiles.build(); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java index 7cd35bfb34..3a726bf6ca 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java @@ -17,12 +17,10 @@ package com.google.devtools.build.lib.remote; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningScheduledExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.devtools.build.lib.authandtls.AuthAndTLSOptions; import com.google.devtools.build.lib.authandtls.GoogleAuthUtils; -import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader; import com.google.devtools.build.lib.buildeventstream.PathConverter; import com.google.devtools.build.lib.buildtool.BuildRequest; import com.google.devtools.build.lib.events.Event; @@ -45,7 +43,6 @@ import com.google.devtools.remoteexecution.v1test.Digest; import io.grpc.Channel; import io.grpc.ClientInterceptors; import java.io.IOException; -import java.util.Set; import java.util.concurrent.Executors; import java.util.logging.Logger; @@ -101,13 +98,12 @@ public final class RemoteModule extends BlazeModule { @Override public void serverInit(OptionsProvider startupOptions, ServerBuilder builder) { - builder.addBuildEventArtifactUploader(new BuildEventArtifactUploader() { - @Override - public ListenableFuture upload(Set files) { - // TODO(ulfjack): Actually hook up upload here. - return Futures.immediateFuture(converter); - } - }, "remote"); + builder.addBuildEventArtifactUploader( + files -> { + // TODO(ulfjack): Actually hook up upload here. + return Futures.immediateFuture(converter); + }, + "remote"); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/runtime/NamedArtifactGroup.java b/src/main/java/com/google/devtools/build/lib/runtime/NamedArtifactGroup.java index 431b4276ad..0160345b3d 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/NamedArtifactGroup.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/NamedArtifactGroup.java @@ -14,18 +14,19 @@ package com.google.devtools.build.lib.runtime; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.EventReportingArtifacts; import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer; import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; import com.google.devtools.build.lib.buildeventstream.PathConverter; import com.google.devtools.build.lib.collect.nestedset.NestedSetView; -import com.google.devtools.build.lib.vfs.Path; import java.util.Collection; /** @@ -49,18 +50,21 @@ class NamedArtifactGroup implements BuildEvent { @Override public Collection getChildrenEvents() { - return ImmutableSet.of(); + return ImmutableSet.of(); } @Override - public ImmutableSet referencedLocalFiles() { + public Collection referencedLocalFiles() { // This has to be consistent with the code below. - ImmutableSet.Builder artifacts = ImmutableSet.builder(); + ImmutableList.Builder artifacts = ImmutableList.builder(); for (Artifact artifact : view.directs()) { if (artifact.isMiddlemanArtifact()) { continue; } - artifacts.add(artifact.getPath()); + artifacts.add( + new LocalFile( + artifact.getPath(), + artifact.isSourceArtifact() ? LocalFileType.SOURCE : LocalFileType.OUTPUT)); } return artifacts.build(); } 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 4c8d46825f..098e17ac22 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 @@ -18,12 +18,12 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile.LocalFileType; import com.google.devtools.build.lib.buildeventstream.BuildEventContext; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; @@ -491,11 +491,15 @@ public class TestSummary implements Comparable, BuildEventWithOrder } @Override - public ImmutableSet referencedLocalFiles() { - ImmutableSet.Builder artifacts = ImmutableSet.builder(); - artifacts.addAll(getFailedLogs()); - artifacts.addAll(getPassedLogs()); - return artifacts.build(); + public ImmutableList referencedLocalFiles() { + ImmutableList.Builder localFiles = ImmutableList.builder(); + for (Path path : getFailedLogs()) { + localFiles.add(new LocalFile(path, LocalFileType.FAILED_TEST_OUTPUT)); + } + for (Path path : getPassedLogs()) { + localFiles.add(new LocalFile(path, LocalFileType.SUCCESSFUL_TEST_OUTPUT)); + } + return localFiles.build(); } @Override -- cgit v1.2.3