From a87d202652c822796630aaf2bc8925183c8db883 Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Wed, 19 Oct 2016 14:36:44 +0000 Subject: Made HttpDownloader download calls non-static. To set and use a RepositoryCache instance in HttpDownloader while parsing the command line options, we can pass an AtomicReference instance from BazelRepositoryModule to the HttpArchiveFunctions. However, we'll need to change HttpDownloader download() calls to be non-static in order to initialize an instance of HttpDownloader in BazelRepositoryModule. Remaining TODOs: - RepositoryCache implementation and unit testing - RepositoryCache lockfiles - RepositoryCache integration testing GITHUB: #1752 -- MOS_MIGRATED_REVID=136593517 --- src/main/java/com/google/devtools/build/lib/BUILD | 1 + .../build/lib/bazel/BazelRepositoryModule.java | 21 +++--- .../lib/bazel/repository/HttpArchiveFunction.java | 24 ++----- .../lib/bazel/repository/HttpFileFunction.java | 7 ++ .../lib/bazel/repository/HttpJarFunction.java | 7 ++ .../lib/bazel/repository/MavenJarFunction.java | 6 ++ .../bazel/repository/NewHttpArchiveFunction.java | 8 ++- .../repository/downloader/HttpDownloader.java | 76 +++++----------------- .../skylark/SkylarkRepositoryContext.java | 18 +++-- .../skylark/SkylarkRepositoryFunction.java | 13 +++- .../skylark/SkylarkRepositoryContextTest.java | 7 +- .../skylark/SkylarkRepositoryIntegrationTest.java | 9 ++- 12 files changed, 101 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 9f6783487c..111786eee2 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -608,6 +608,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/bazel/dash", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", + "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader", "//src/main/java/com/google/devtools/build/lib/remote", "//src/main/java/com/google/devtools/build/lib/sandbox", "//src/main/java/com/google/devtools/build/lib/ssd", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index 282508b9e5..da9b9b9b25 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.bazel.repository.NewGitRepositoryFunction; import com.google.devtools.build.lib.bazel.repository.NewHttpArchiveFunction; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryFunction; import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryModule; import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryFunction; @@ -81,21 +82,22 @@ public class BazelRepositoryModule extends BlazeModule { // A map of repository handlers that can be looked up by rule class name. private final ImmutableMap repositoryHandlers; private final AtomicBoolean isFetch = new AtomicBoolean(false); - private final SkylarkRepositoryFunction skylarkRepositoryFunction = - new SkylarkRepositoryFunction(); + private final SkylarkRepositoryFunction skylarkRepositoryFunction; private final RepositoryDelegatorFunction delegator; - private final AtomicReference repositoryCache = new AtomicReference<>(); + private final AtomicReference httpDownloader = + new AtomicReference<>(new HttpDownloader()); public BazelRepositoryModule() { + this.skylarkRepositoryFunction = new SkylarkRepositoryFunction(httpDownloader); this.repositoryHandlers = ImmutableMap.builder() .put(LocalRepositoryRule.NAME, new LocalRepositoryFunction()) - .put(HttpArchiveRule.NAME, new HttpArchiveFunction(repositoryCache)) + .put(HttpArchiveRule.NAME, new HttpArchiveFunction(httpDownloader)) .put(GitRepositoryRule.NAME, new GitRepositoryFunction()) - .put(HttpJarRule.NAME, new HttpJarFunction()) - .put(HttpFileRule.NAME, new HttpFileFunction()) - .put(MavenJarRule.NAME, new MavenJarFunction()) - .put(NewHttpArchiveRule.NAME, new NewHttpArchiveFunction()) + .put(HttpJarRule.NAME, new HttpJarFunction(httpDownloader)) + .put(HttpFileRule.NAME, new HttpFileFunction(httpDownloader)) + .put(MavenJarRule.NAME, new MavenJarFunction(httpDownloader)) + .put(NewHttpArchiveRule.NAME, new NewHttpArchiveFunction(httpDownloader)) .put(NewGitRepositoryRule.NAME, new NewGitRepositoryFunction()) .put(NewLocalRepositoryRule.NAME, new NewLocalRepositoryFunction()) .put(AndroidSdkRepositoryRule.NAME, new AndroidSdkRepositoryFunction()) @@ -171,7 +173,8 @@ public class BazelRepositoryModule extends BlazeModule { RepositoryOptions repoOptions = optionsProvider.getOptions(RepositoryOptions.class); if (repoOptions != null && repoOptions.experimentalRepositoryCache != null) { - repositoryCache.set(new RepositoryCache(repoOptions.experimentalRepositoryCache)); + httpDownloader.get().setRepositoryCache( + new RepositoryCache(repoOptions.experimentalRepositoryCache)); } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java index ca9a446fd0..059c5987fd 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.bazel.repository; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; -import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache; import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.bazel.rules.workspace.HttpArchiveRule; import com.google.devtools.build.lib.packages.Rule; @@ -39,17 +38,10 @@ import java.util.concurrent.atomic.AtomicReference; */ public class HttpArchiveFunction extends RepositoryFunction { - private final AtomicReference repositoryCache; + protected final AtomicReference httpDownloader; - protected HttpArchiveFunction() { - repositoryCache = new AtomicReference<>(); - } - - /** - * @param repositoryCache the reference to the repository cache. - */ - public HttpArchiveFunction(AtomicReference repositoryCache) { - this.repositoryCache = repositoryCache; + public HttpArchiveFunction(AtomicReference httpDownloader) { + this.httpDownloader = httpDownloader; } @Override @@ -70,18 +62,16 @@ public class HttpArchiveFunction extends RepositoryFunction { public SkyValue fetch( Rule rule, Path outputDirectory, BlazeDirectories directories, Environment env) throws RepositoryFunctionException, InterruptedException { - // The output directory is always under .external-repository (to stay out of the way of + // The output directory is always under output_base/external (to stay out of the way of // artifacts from this repository) and uses the rule's name to avoid conflicts with other // remote repository rules. For example, suppose you had the following WORKSPACE file: // // http_archive(name = "png", url = "http://example.com/downloads/png.tar.gz", sha256 = "...") // - // This would download png.tar.gz to .external-repository/png/png.tar.gz. + // This would download png.tar.gz to output_base/external/png/png.tar.gz. createDirectory(outputDirectory); - Path downloadedPath = (repositoryCache == null || repositoryCache.get() == null) - ? HttpDownloader.download(rule, outputDirectory, env.getListener(), clientEnvironment) - : HttpDownloader.download(rule, outputDirectory, env.getListener(), clientEnvironment, - repositoryCache.get()); + Path downloadedPath = httpDownloader.get().download(rule, outputDirectory, + env.getListener(), clientEnvironment); DecompressorValue.decompress(getDescriptor(rule, downloadedPath, outputDirectory)); return RepositoryDirectoryValue.create(outputDirectory); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java index 1ded55400b..be19da3d08 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.bazel.repository; import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.bazel.rules.workspace.HttpFileRule; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper; @@ -22,11 +23,17 @@ import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; +import java.util.concurrent.atomic.AtomicReference; /** * Downloads a jar file from a URL. */ public class HttpFileFunction extends HttpArchiveFunction { + + public HttpFileFunction(AtomicReference httpDownloader) { + super(httpDownloader); + } + @Override protected DecompressorDescriptor getDescriptor(Rule rule, Path downloadPath, Path outputDirectory) throws RepositoryFunctionException { diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java index a09ee1c8d0..d260a3957b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java @@ -15,14 +15,21 @@ package com.google.devtools.build.lib.bazel.repository; import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.bazel.rules.workspace.HttpJarRule; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.vfs.Path; +import java.util.concurrent.atomic.AtomicReference; /** * Downloads a jar file from a URL. */ public class HttpJarFunction extends HttpArchiveFunction { + + public HttpJarFunction(AtomicReference httpDownloader) { + super(httpDownloader); + } + @Override protected DecompressorDescriptor getDescriptor(Rule rule, Path downloadPath, Path outputDirectory) throws RepositoryFunctionException { diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java index a41f3ab076..60ed5558f3 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java @@ -35,6 +35,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; import org.apache.maven.settings.Server; import org.eclipse.aether.RepositorySystem; @@ -53,6 +54,11 @@ import org.eclipse.aether.resolution.ArtifactResult; * Implementation of maven_jar. */ public class MavenJarFunction extends HttpArchiveFunction { + + public MavenJarFunction(AtomicReference httpDownloader) { + super(httpDownloader); + } + private static final String DEFAULT_SERVER = "default"; @Override diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java index 04ad0b708c..24562c3c21 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java @@ -29,7 +29,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; - +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; /** @@ -38,6 +38,10 @@ import javax.annotation.Nullable; */ public class NewHttpArchiveFunction extends HttpArchiveFunction { + public NewHttpArchiveFunction(AtomicReference httpDownloader) { + super(httpDownloader); + } + @Nullable @Override public SkyValue fetch( @@ -57,7 +61,7 @@ public class NewHttpArchiveFunction extends HttpArchiveFunction { } // Download. - Path downloadedPath = HttpDownloader.download( + Path downloadedPath = httpDownloader.get().download( rule, outputDirectory, env.getListener(), clientEnvironment); // Decompress. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java index 5f738cd1e4..c25699ae76 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java @@ -40,8 +40,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.Nullable; - /** * Helper class for downloading a file from a URL. */ @@ -51,28 +49,13 @@ public class HttpDownloader { private static final String UNITS = " KMGTPEY"; private static final double LOG_OF_KB = Math.log(1024); - private final String urlString; - private final String sha256; - private final String type; - private final Path outputDirectory; - private final EventHandler eventHandler; private final ScheduledExecutorService scheduler; - private final Map clientEnv; - private HttpDownloader( - EventHandler eventHandler, String urlString, String sha256, Path outputDirectory, - String type, Map clientEnv) { - this.urlString = urlString; - this.sha256 = sha256; - this.outputDirectory = outputDirectory; - this.eventHandler = eventHandler; + public HttpDownloader() { this.scheduler = Executors.newScheduledThreadPool(1); - this.type = type; - this.clientEnv = clientEnv; } - @Nullable - public static Path download( + public Path download( Rule rule, Path outputDirectory, EventHandler eventHandler, Map clientEnv) throws RepositoryFunctionException, InterruptedException { WorkspaceAttributeMapper mapper = WorkspaceAttributeMapper.of(rule); @@ -89,42 +72,11 @@ public class HttpDownloader { } try { - return new HttpDownloader(eventHandler, url, sha256, outputDirectory, type, clientEnv) - .download(); - } catch (IOException e) { - throw new RepositoryFunctionException(new IOException("Error downloading from " - + url + " to " + outputDirectory + ": " + e.getMessage()), - SkyFunctionException.Transience.TRANSIENT); - } - } - - @SuppressWarnings("unused") - @Nullable - public static Path download( - Rule rule, Path outputDirectory, EventHandler eventHandler, Map clientEnv, - RepositoryCache repositoryCache) - throws RepositoryFunctionException, InterruptedException { - - /* TODO(jingwen): No-op with the cache controller for now. - * This will be the place where we detect cache hits with the sha256 value - * and copy the values accordingly. - * - * For now, delegating operation to the original download method. - */ - return download(rule, outputDirectory, eventHandler, clientEnv); - } - - @Nullable - public static Path download( - String url, String sha256, String type, Path output, EventHandler eventHandler, Map clientEnv) - throws RepositoryFunctionException, InterruptedException { - try { - return new HttpDownloader(eventHandler, url, sha256, output, type, clientEnv).download(); + return download(url, sha256, type, outputDirectory, eventHandler, clientEnv); } catch (IOException e) { throw new RepositoryFunctionException( new IOException( - "Error downloading from " + url + " to " + output + ": " + e.getMessage()), + "Error downloading from " + url + " to " + outputDirectory + ": " + e.getMessage()), SkyFunctionException.Transience.TRANSIENT); } } @@ -132,7 +84,10 @@ public class HttpDownloader { /** * Attempt to download a file from the repository's URL. Returns the path to the file downloaded. */ - public Path download() throws IOException, InterruptedException { + public Path download( + String urlString, String sha256, String type, Path outputDirectory, + EventHandler eventHandler, Map clientEnv) + throws IOException, InterruptedException { URL url = new URL(urlString); Path destination; if (type == null) { @@ -160,10 +115,10 @@ public class HttpDownloader { } AtomicInteger totalBytes = new AtomicInteger(0); - final ScheduledFuture loggerHandle = getLoggerHandle(totalBytes); + final ScheduledFuture loggerHandle = getLoggerHandle(totalBytes, eventHandler, urlString); try (OutputStream out = destination.getOutputStream(); - HttpConnection connection = HttpConnection.createAndConnect(url, this.clientEnv)) { + HttpConnection connection = HttpConnection.createAndConnect(url, clientEnv)) { InputStream inputStream = connection.getInputStream(); int read; byte[] buf = new byte[BUFFER_SIZE]; @@ -191,11 +146,11 @@ public class HttpDownloader { }, 0, TimeUnit.SECONDS); } - compareHashes(destination); + compareHashes(destination, sha256); return destination; } - private void compareHashes(Path destination) throws IOException { + private void compareHashes(Path destination, String sha256) throws IOException { if (sha256.isEmpty()) { return; } @@ -214,7 +169,8 @@ public class HttpDownloader { } } - private ScheduledFuture getLoggerHandle(final AtomicInteger totalBytes) { + private ScheduledFuture getLoggerHandle( + final AtomicInteger totalBytes, EventHandler eventHandler, String urlString) { final Runnable logger = new Runnable() { @Override public void run() { @@ -256,4 +212,8 @@ public class HttpDownloader { } return hasher.hash().toString(); } + + public void setRepositoryCache(@SuppressWarnings("unused") RepositoryCache repositoryCache) { + // TODO(jingwen): Implement repository cache bridge + } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java index 4614b21d0a..69ffa1c402 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java @@ -55,6 +55,7 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; /** Skylark API for the repository_rule's context. */ @SkylarkModule( @@ -73,6 +74,7 @@ public class SkylarkRepositoryContext { private final SkylarkClassObject attrObject; private final SkylarkOS osObject; private final Environment env; + private final AtomicReference httpDownloader; /** * Convert attribute name from native naming convention to Skylark naming convention. @@ -92,12 +94,14 @@ public class SkylarkRepositoryContext { * argument). */ SkylarkRepositoryContext( - Rule rule, Path outputDirectory, Environment environment, Map env) + Rule rule, Path outputDirectory, Environment environment, + Map env, AtomicReference httpDownloader) throws EvalException { this.rule = rule; this.outputDirectory = outputDirectory; this.env = environment; this.osObject = new SkylarkOS(env); + this.httpDownloader = httpDownloader; WorkspaceAttributeMapper attrs = WorkspaceAttributeMapper.of(rule); ImmutableMap.Builder attrBuilder = new ImmutableMap.Builder<>(); for (String name : attrs.getAttributeNames()) { @@ -485,7 +489,7 @@ public class SkylarkRepositoryContext { try { checkInOutputDirectory(outputPath); makeDirectories(outputPath.getPath()); - HttpDownloader.download(url, sha256, null, outputPath.getPath(), env.getListener(), + httpDownloader.get().download(url, sha256, null, outputPath.getPath(), env.getListener(), osObject.getEnvironmentVariables()); if (executable) { outputPath.getPath().setExecutable(true); @@ -562,9 +566,13 @@ public class SkylarkRepositoryContext { SkylarkPath outputPath = getPath("download_and_extract()", output); checkInOutputDirectory(outputPath); createDirectory(outputPath.getPath()); - Path downloadedPath = HttpDownloader - .download(url, sha256, type, outputPath.getPath(), env.getListener(), - osObject.getEnvironmentVariables()); + Path downloadedPath; + try { + downloadedPath = httpDownloader.get().download(url, sha256, type, outputPath.getPath(), + env.getListener(), osObject.getEnvironmentVariables()); + } catch (IOException e) { + throw new RepositoryFunctionException(e, Transience.TRANSIENT); + } DecompressorValue.decompress( DecompressorDescriptor.builder() .setTargetKind(rule.getTargetKind()) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java index 0d3ba70ef1..71a8fdacd9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; @@ -36,7 +37,7 @@ import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.util.Map; - +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; /** @@ -55,6 +56,12 @@ public class SkylarkRepositoryFunction extends RepositoryFunction { } } + private final AtomicReference httpDownloader; + + public SkylarkRepositoryFunction(AtomicReference httpDownloader) { + this.httpDownloader = httpDownloader; + } + /** * Skylark repository context functions can throw the result of this function to notify the * SkylarkRepositoryFunction that a dependency was missing and the evaluation of the function must @@ -89,8 +96,8 @@ public class SkylarkRepositoryFunction extends RepositoryFunction { .setSkylark() .setEventHandler(env.getListener()) .build(); - SkylarkRepositoryContext skylarkRepositoryContext = - new SkylarkRepositoryContext(rule, outputDirectory, env, getClientEnvironment()); + SkylarkRepositoryContext skylarkRepositoryContext = new SkylarkRepositoryContext( + rule, outputDirectory, env, getClientEnvironment(), httpDownloader); // This has side-effect, we don't care about the output. // Also we do a lot of stuff in there, maybe blocking operations and we should certainly make diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java index 79b8fed690..6d19070576 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.fail; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.io.CharStreams; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.Package; @@ -40,6 +41,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -87,12 +89,15 @@ public class SkylarkRepositoryContextTest { .externalPackageData() .createAndAddRepositoryRule( packageBuilder, buildRuleClass(attributes), null, kwargs, ast); + AtomicReference httpDownloader = + new AtomicReference<>(Mockito.mock(HttpDownloader.class)); context = new SkylarkRepositoryContext( rule, outputDirectory, Mockito.mock(SkyFunction.Environment.class), - ImmutableMap.of("FOO", "BAR")); + ImmutableMap.of("FOO", "BAR"), + httpDownloader); } protected void setUpContexForRule(String name) throws Exception { diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java index 9b63536d30..e0e0b857ea 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.rules.cpp.FdoSupportFunction; @@ -38,9 +39,11 @@ import com.google.devtools.build.skyframe.SkyFunctionName; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.mockito.Mockito; /** * Integration test for skylark repository not as heavyweight than shell integration tests. @@ -66,8 +69,12 @@ public class SkylarkRepositoryIntegrationTest extends BuildViewTestCase { @Override public ImmutableMap getSkyFunctions() { // Add both the local repository and the skylark repository functions + // The HttpDownloader mock injected with the SkylarkRepositoryFunction + AtomicReference httpDownloader = + new AtomicReference<>(Mockito.mock(HttpDownloader.class)); RepositoryFunction localRepositoryFunction = new LocalRepositoryFunction(); - SkylarkRepositoryFunction skylarkRepositoryFunction = new SkylarkRepositoryFunction(); + SkylarkRepositoryFunction skylarkRepositoryFunction = + new SkylarkRepositoryFunction(httpDownloader); ImmutableMap repositoryHandlers = ImmutableMap.of(LocalRepositoryRule.NAME, localRepositoryFunction); -- cgit v1.2.3