diff options
author | 2016-10-19 14:36:44 +0000 | |
---|---|---|
committer | 2016-10-19 15:02:06 +0000 | |
commit | a87d202652c822796630aaf2bc8925183c8db883 (patch) | |
tree | 332599310d457bd7ac7dcc9f402a5f4ed62a3f96 | |
parent | 0c06a666ba8b3e5f3582c853185cc173fe4c79bf (diff) |
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<HttpDownloader> 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
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<String, RepositoryFunction> 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> repositoryCache = new AtomicReference<>(); + private final AtomicReference<HttpDownloader> httpDownloader = + new AtomicReference<>(new HttpDownloader()); public BazelRepositoryModule() { + this.skylarkRepositoryFunction = new SkylarkRepositoryFunction(httpDownloader); this.repositoryHandlers = ImmutableMap.<String, RepositoryFunction>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> repositoryCache; + protected final AtomicReference<HttpDownloader> httpDownloader; - protected HttpArchiveFunction() { - repositoryCache = new AtomicReference<>(); - } - - /** - * @param repositoryCache the reference to the repository cache. - */ - public HttpArchiveFunction(AtomicReference<RepositoryCache> repositoryCache) { - this.repositoryCache = repositoryCache; + public HttpArchiveFunction(AtomicReference<HttpDownloader> 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> 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> 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> 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> 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<String, String> clientEnv; - private HttpDownloader( - EventHandler eventHandler, String urlString, String sha256, Path outputDirectory, - String type, Map<String, String> 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<String, String> 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<String, String> 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<String, - String> 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<String, String> 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> 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<String, String> env) + Rule rule, Path outputDirectory, Environment environment, + Map<String, String> env, AtomicReference<HttpDownloader> 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<String, Object> 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> httpDownloader; + + public SkylarkRepositoryFunction(AtomicReference<HttpDownloader> 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> 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<SkyFunctionName, SkyFunction> getSkyFunctions() { // Add both the local repository and the skylark repository functions + // The HttpDownloader mock injected with the SkylarkRepositoryFunction + AtomicReference<HttpDownloader> httpDownloader = + new AtomicReference<>(Mockito.mock(HttpDownloader.class)); RepositoryFunction localRepositoryFunction = new LocalRepositoryFunction(); - SkylarkRepositoryFunction skylarkRepositoryFunction = new SkylarkRepositoryFunction(); + SkylarkRepositoryFunction skylarkRepositoryFunction = + new SkylarkRepositoryFunction(httpDownloader); ImmutableMap<String, RepositoryFunction> repositoryHandlers = ImmutableMap.of(LocalRepositoryRule.NAME, localRepositoryFunction); |