From 981e4b269c1bb43fdeb9a433e009c2a4ad322cd8 Mon Sep 17 00:00:00 2001 From: Harry Date: Fri, 30 Oct 2015 10:24:23 +0800 Subject: [PATCH 1/2] Add support for changing SDK Manager host and timeout --- .../sdkmanager/SdkManagerExtension.groovy | 3 ++ .../sdkmanager/internal/AndroidCommand.groovy | 31 ++++++++++++++++--- .../internal/PackageResolver.groovy | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/com/jakewharton/sdkmanager/SdkManagerExtension.groovy b/src/main/groovy/com/jakewharton/sdkmanager/SdkManagerExtension.groovy index 7ca8f3b..7903f75 100644 --- a/src/main/groovy/com/jakewharton/sdkmanager/SdkManagerExtension.groovy +++ b/src/main/groovy/com/jakewharton/sdkmanager/SdkManagerExtension.groovy @@ -3,4 +3,7 @@ package com.jakewharton.sdkmanager; class SdkManagerExtension { String emulatorVersion String emulatorArchitecture + String sdkBaseUrl + int sdkConnTimeout + int sdkReadTimeout } diff --git a/src/main/groovy/com/jakewharton/sdkmanager/internal/AndroidCommand.groovy b/src/main/groovy/com/jakewharton/sdkmanager/internal/AndroidCommand.groovy index db5b263..c650130 100644 --- a/src/main/groovy/com/jakewharton/sdkmanager/internal/AndroidCommand.groovy +++ b/src/main/groovy/com/jakewharton/sdkmanager/internal/AndroidCommand.groovy @@ -1,5 +1,6 @@ package com.jakewharton.sdkmanager.internal +import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging @@ -8,15 +9,18 @@ import static com.android.SdkConstants.androidCmdName interface AndroidCommand { int update(String filter); + String list(String filter); static final class Real implements AndroidCommand { final Logger log = Logging.getLogger Real final File androidExecutable final System system + final Project project - Real(File sdk, System system) { + Real(Project project, File sdk, System system) { this.system = system + this.project = project def toolsDir = new File(sdk, FD_TOOLS) androidExecutable = new File(toolsDir, androidCmdName()) } @@ -26,9 +30,10 @@ interface AndroidCommand { // -t == filter def options = ['-a', '-t', filter] def cmd = generateCommand('update', options) - def process = new ProcessBuilder(cmd) + def processBuilder = new ProcessBuilder(cmd) .redirectErrorStream(true) - .start() + setupSdkManEnv(processBuilder.environment()) + def process = processBuilder.start() // Press 'y' and then enter on the license prompt. def output = new OutputStreamWriter(process.out) @@ -49,9 +54,10 @@ interface AndroidCommand { // -a == all // -e == extended def cmd = generateCommand('list', ['-a', '-e']) - def process = new ProcessBuilder(cmd) + def processBuilder = new ProcessBuilder(cmd) .redirectErrorStream(true) - .start() + setupSdkManEnv(processBuilder.environment()) + def process = processBuilder.start() // Pipe the command output to our log. def input = new InputStreamReader(process.in) @@ -74,6 +80,21 @@ interface AndroidCommand { return result } + def setupSdkManEnv(map) { + def sdkBaseUrl = project.sdkManager.sdkBaseUrl; + if (sdkBaseUrl != null) { + map.put("SDK_TEST_BASE_URL", sdkBaseUrl as String); + } + def sdkConnTimeout = project.sdkManager.sdkConnTimeout + if (sdkConnTimeout != null) { + map.put("ANDROID_SDKMAN_CONN_TIMEOUT", sdkConnTimeout as String); + } + def sdkReadTimeout = project.sdkManager.sdkReadTimeout + if (sdkReadTimeout != null) { + map.put("ANDROID_SDKMAN_READ_TIMEOUT", sdkReadTimeout as String); + } + } + def generateCommand(String command, options) { // -u == no UI def result = [androidExecutable.absolutePath, command, 'sdk', '-u']; diff --git a/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy b/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy index 9d60eb3..668466b 100644 --- a/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy +++ b/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy @@ -20,7 +20,7 @@ import static com.android.SdkConstants.FD_SYSTEM_IMAGES class PackageResolver { static void resolve(Project project, File sdk) { - new PackageResolver(project, sdk, new AndroidCommand.Real(sdk, new System.Real())).resolve() + new PackageResolver(project, sdk, new AndroidCommand.Real(project, sdk, new System.Real())).resolve() } static boolean folderExists(File folder) { From 49e1190458b1e0e4fb95087a32cf1c1dc14ef7f3 Mon Sep 17 00:00:00 2001 From: Harry Date: Fri, 30 Oct 2015 11:41:10 +0800 Subject: [PATCH 2/2] Add test for changing SDK Manager host and timeout --- .../internal/AndroidCommandTest.groovy | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/com/jakewharton/sdkmanager/internal/AndroidCommandTest.groovy b/src/test/groovy/com/jakewharton/sdkmanager/internal/AndroidCommandTest.groovy index 2a29ee3..9da0963 100644 --- a/src/test/groovy/com/jakewharton/sdkmanager/internal/AndroidCommandTest.groovy +++ b/src/test/groovy/com/jakewharton/sdkmanager/internal/AndroidCommandTest.groovy @@ -1,6 +1,9 @@ package com.jakewharton.sdkmanager.internal +import com.jakewharton.sdkmanager.SdkManagerExtension import com.jakewharton.sdkmanager.util.FakeSystem +import org.gradle.api.Project +import org.gradle.testfixtures.ProjectBuilder import org.junit.Before import org.junit.Rule import org.junit.Test @@ -16,9 +19,11 @@ class AndroidCommandTest { FakeSystem system = new FakeSystem() AndroidCommand.Real command String exe + Project project @Before void setUp() { - command = new AndroidCommand.Real(sdk.root, system) + project = ProjectBuilder.builder().build(); + command = new AndroidCommand.Real(project, sdk.root, system) exe = new File(new File(sdk.root, FD_TOOLS), androidCmdName()).absolutePath } @@ -47,4 +52,18 @@ class AndroidCommandTest { def command = command.generateCommand('update', ['-a']) assertThat(command).containsExactly(exe, 'update', 'sdk', '-u', '-a') } + + @Test public void setupSdkManEnv() { + project.extensions.create("sdkManager", SdkManagerExtension) + project.sdkManager { + sdkBaseUrl 'http://example.com/android/repository/' + sdkConnTimeout 2000 + sdkReadTimeout 2000 + } + def map = new HashMap(); + command.setupSdkManEnv(map) + assertThat(map.get("SDK_TEST_BASE_URL")).isEqualTo("http://example.com/android/repository/") + assertThat(map.get("ANDROID_SDKMAN_CONN_TIMEOUT")).isEqualTo(2000 as String) + assertThat(map.get("ANDROID_SDKMAN_READ_TIMEOUT")).isEqualTo(2000 as String) + } }