| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * 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.android.sdkstats; |
| |
| import java.net.URL; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import junit.framework.TestCase; |
| |
| public class SdkStatsServiceTest extends TestCase { |
| |
| private static class MockSdkStatsService extends SdkStatsService { |
| |
| private final String mOsName; |
| private final String mOsVersion; |
| private final String mOsArch; |
| private final String mJavaVersion; |
| private final Map<String, String> mEnvVars = new HashMap<String, String>(); |
| private URL mPingUrlResult; |
| |
| public MockSdkStatsService(String osName, |
| String osVersion, |
| String osArch, |
| String javaVersion) { |
| mOsName = osName; |
| mOsVersion = osVersion; |
| mOsArch = osArch; |
| mJavaVersion = javaVersion; |
| } |
| |
| public URL getPingUrlResult() { |
| return mPingUrlResult; |
| } |
| |
| public void setSystemEnv(String varName, String value) { |
| mEnvVars.put(varName, value); |
| } |
| |
| @Override |
| protected String getSystemProperty(String name) { |
| if (SdkStatsService.SYS_PROP_OS_NAME.equals(name)) { |
| return mOsName; |
| } else if (SdkStatsService.SYS_PROP_OS_VERSION.equals(name)) { |
| return mOsVersion; |
| } else if (SdkStatsService.SYS_PROP_OS_ARCH.equals(name)) { |
| return mOsArch; |
| } else if (SdkStatsService.SYS_PROP_JAVA_VERSION.equals(name)) { |
| return mJavaVersion; |
| } |
| // Don't use current properties values, we don't want the tests to be flaky |
| fail("SdkStatsServiceTest doesn't define a system.property for " + name); |
| return null; |
| } |
| |
| @Override |
| protected String getSystemEnv(String name) { |
| if (mEnvVars.containsKey(name)) { |
| return mEnvVars.get(name); |
| } |
| // Don't use current env vars, we don't want the tests to be flaky |
| fail("SdkStatsServiceTest doesn't define a system.getenv for " + name); |
| return null; |
| } |
| |
| @Override |
| protected void doPing(String app, String version, |
| Map<String, String> extras) { |
| // The super.doPing() does: |
| // 1- normalize input, |
| // 2- check the ping time, |
| // 3- check/create the pind id, |
| // 4- create the ping URL |
| // 5- and send the network ping in a thread. |
| // In this mock version we just do steps 1 and 4 and record the URL; |
| // obvious we don't check the ping time in the prefs nor send the actual ping. |
| |
| // Validate the application and version input. |
| final String nApp = normalizeAppName(app); |
| final String nVersion = normalizeVersion(version); |
| |
| long id = 0x42; |
| try { |
| mPingUrlResult = createPingUrl(nApp, nVersion, id, extras); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| |
| public void testSdkStatsService_getJvmArch() { |
| MockSdkStatsService m; |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "i386", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "i486", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| m = new MockSdkStatsService("Linux", "4.0", "i486-linux", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "i586", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "i686", "1.7"); |
| assertEquals("x86", m.getJvmArch()); |
| |
| m = new MockSdkStatsService("Mac OS", "10.0", "x86_64", "1.7"); |
| assertEquals("x86_64", m.getJvmArch()); |
| m = new MockSdkStatsService("Mac OS", "8.0", "PowerPC", "1.7"); |
| assertEquals("ppc", m.getJvmArch()); |
| |
| m = new MockSdkStatsService("Mac OS", "4.0", "x86_64", "1.7"); |
| assertEquals("x86_64", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "ia64", "1.7"); |
| assertEquals("x86_64", m.getJvmArch()); |
| m = new MockSdkStatsService("Windows", "4.0", "amd64", "1.7"); |
| assertEquals("x86_64", m.getJvmArch()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "atom", "1.7"); |
| assertEquals("atom", m.getJvmArch()); |
| |
| // 32 chars max |
| m = new MockSdkStatsService("Windows", "4.0", |
| "one3456789ten3456789twenty6789thirty6789", "1.7"); |
| assertEquals("one3456789ten3456789twenty6789th", m.getJvmArch()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "", "1.7"); |
| assertEquals("unknown", m.getJvmArch()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", null, "1.7"); |
| assertEquals("unknown", m.getJvmArch()); |
| } |
| |
| public void testSdkStatsService_getJvmVersion() { |
| MockSdkStatsService m; |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", "1.7.8_09"); |
| assertEquals("1.7", m.getJvmVersion()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", ""); |
| assertEquals("unknown", m.getJvmVersion()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", null); |
| assertEquals("unknown", m.getJvmVersion()); |
| |
| // 8 chars max |
| m = new MockSdkStatsService("Windows", "4.0", "x86", |
| "one3456789ten3456789twenty6789thirty6789"); |
| assertEquals("one34567", m.getJvmVersion()); |
| } |
| |
| public void testSdkStatsService_getJvmInfo() { |
| MockSdkStatsService m; |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", "1.7.8_09"); |
| assertEquals("1.7-x86", m.getJvmInfo()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "amd64", "1.7.8_09"); |
| assertEquals("1.7-x86_64", m.getJvmInfo()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "", ""); |
| assertEquals("unknown-unknown", m.getJvmInfo()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", null, null); |
| assertEquals("unknown-unknown", m.getJvmInfo()); |
| |
| // 8+32 chars max |
| m = new MockSdkStatsService("Windows", "4.0", |
| "one3456789ten3456789twenty6789thirty6789", |
| "one3456789ten3456789twenty6789thirty6789"); |
| assertEquals("one34567-one3456789ten3456789twenty6789th", m.getJvmInfo()); |
| } |
| |
| public void testSdkStatsService_getOsVersion() { |
| MockSdkStatsService m; |
| |
| m = new MockSdkStatsService("Windows", "4.0.32", "x86", "1.7.8_09"); |
| assertEquals("4.0", m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Windows", "4.0", "x86", "1.7.8_09"); |
| assertEquals("4.0", m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Windows", "4", "x86", "1.7.8_09"); |
| assertEquals(null, m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Windows", "4.0;extrainfo", "x86", "1.7.8_09"); |
| assertEquals("4.0", m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Mac OS", "10.8.32", "x86_64", "1.7.8_09"); |
| assertEquals("10.8", m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Mac OS", "10.8", "x86_64", "1.7.8_09"); |
| assertEquals("10.8", m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Other", "", "x86_64", "1.7.8_09"); |
| assertEquals(null, m.getOsVersion()); |
| |
| m = new MockSdkStatsService("Other", null, "x86_64", "1.7.8_09"); |
| assertEquals(null, m.getOsVersion()); |
| } |
| |
| public void testSdkStatsService_getOsArch() { |
| MockSdkStatsService m; |
| |
| // 64 bit jvm |
| m = new MockSdkStatsService("Mac OS", "10.8.32", "x86_64", "1.7.8_09"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Windows", "8.32", "x86_64", "1.7.8_09"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Linux", "8.32", "x86_64", "1.7.8_09"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| // 32 bit jvm with 32 vs 64 bit os |
| m = new MockSdkStatsService("Windows", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("PROCESSOR_ARCHITEW6432", null); |
| assertEquals("x86", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Windows", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("PROCESSOR_ARCHITEW6432", "AMD64"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Windows", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("PROCESSOR_ARCHITEW6432", "IA64"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| // 32 bit jvm with 32 vs 64 bit os |
| m = new MockSdkStatsService("Linux", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("HOSTTYPE", null); |
| assertEquals("x86", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Linux", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("HOSTTYPE", "i686-linux"); |
| assertEquals("x86", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Linux", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("HOSTTYPE", "AMD64"); |
| assertEquals("x86_64", m.getOsArch()); |
| |
| m = new MockSdkStatsService("Linux", "8.32", "x86", "1.7.8_09"); |
| m.setSystemEnv("HOSTTYPE", "x86_64"); |
| assertEquals("x86_64", m.getOsArch()); |
| } |
| |
| public void testSdkStatsService_getOsName() { |
| MockSdkStatsService m; |
| |
| m = new MockSdkStatsService("Mac OS", "10.8.32", "x86_64", "1.7.8_09"); |
| assertEquals("mac-10.8", m.getOsName()); |
| |
| m = new MockSdkStatsService("mac", "10", "x86", "1.7.8_09"); |
| assertEquals("mac", m.getOsName()); |
| |
| m = new MockSdkStatsService("Windows", "6.2", "x86_64", "1.7.8_09"); |
| assertEquals("win-6.2", m.getOsName()); |
| |
| m = new MockSdkStatsService("win", "6.2", "x86", "1.7.8_09"); |
| assertEquals("win-6.2", m.getOsName()); |
| |
| m = new MockSdkStatsService("win", "6", "x86_64", "1.7.8_09"); |
| assertEquals("win", m.getOsName()); |
| |
| m = new MockSdkStatsService("Linux", "foobuntu-32", "x86", "1.7.8_09"); |
| assertEquals("linux", m.getOsName()); |
| |
| m = new MockSdkStatsService("linux", "1", "x86_64", "1.7.8_09"); |
| assertEquals("linux", m.getOsName()); |
| |
| m = new MockSdkStatsService("PowerPC", "32", "ppc", "1.7.8_09"); |
| assertEquals("PowerPC", m.getOsName()); |
| |
| m = new MockSdkStatsService("freebsd", "42", "x86_64", "1.7.8_09"); |
| assertEquals("freebsd", m.getOsName()); |
| |
| m = new MockSdkStatsService("openbsd", "43", "x86_64", "1.7.8_09"); |
| assertEquals("openbsd", m.getOsName()); |
| |
| // 32 chars max |
| m = new MockSdkStatsService("one3456789ten3456789twenty6789thirty6789", |
| "42", "x86_64", "1.7.8_09"); |
| assertEquals("one3456789ten3456789twenty6789th", m.getOsName()); |
| } |
| |
| public void testSdkStatsService_parseVersion() { |
| // Tests that the version parses supports the new "major.minor.micro rcPreview" format |
| // as well as "x.y.z.t" formats as well as Eclipse's "x.y.z.v2012somedate" formats. |
| |
| MockSdkStatsService m; |
| m = new MockSdkStatsService("Windows", "6.2", "x86_64", "1.7.8_09"); |
| |
| m.ping("monitor", "21"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.1"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.1.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.2.03"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.2.3.4"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.4&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // More than 4 parts or extra stuff that is not an "rc" preview are ignored. |
| m.ping("monitor", "21.2.3.4.5.6.7.8"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.4&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.2.3.4.v20120101 the rest is ignored"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.4&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // If the "rc" preview integer is present, it's equivalent to a 4th number. |
| m.ping("monitor", "21 rc4"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.0.0.4&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.01 rc5"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.1.0.5&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| m.ping("monitor", "21.02.03 rc6"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.6&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // If there's a 4-part version number, the rc preview number isn't used. |
| m.ping("monitor", "21.2.3.4 rc7"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_monitor&" + |
| "id=42&" + |
| "version=21.2.3.4&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // For Eclipse plugins, the 4th part might be a date. It is ignored. |
| m.ping("eclipse", "21.2.3.v20120102235958"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_eclipse&" + |
| "id=42&" + |
| "version=21.2.3.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| } |
| |
| public void testSdkStatsService_glPing() { |
| MockSdkStatsService m; |
| m = new MockSdkStatsService("Windows", "6.2", "x86_64", "1.7.8_09"); |
| |
| // Send emulator ping with just emulator version, no GL stuff |
| m.ping("emulator", "12"); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // Send emulator ping with just emulator version, no GL stuff. |
| // This is the same request but using the variable string list API, arg 0 is the "ping" app. |
| m.ping(new String[] { "ping", "emulator", "12" }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // Send a ping for a non-emulator app with extra parameters, no GL stuff |
| m.ping(new String[] { "ping", "not-emulator", "12", "arg1", "arg2", "arg3" }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_notemulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64", |
| m.getPingUrlResult().toString()); |
| |
| // Send a ping for the emulator app with extra parameters, GL stuff is added, 3 parameters |
| m.ping(new String[] { "ping", "emulator", "12", "Vendor Inc.", "Some cool_GPU!!! (fast one!)", "1.2.3.4_preview" }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64&" + |
| "glm=Vendor+Inc.&" + |
| "glr=Some+cool_GPU+%28fast+one+%29&" + |
| "glv=1.2.3.4_preview", |
| m.getPingUrlResult().toString()); |
| |
| // Send a ping for the emulator app with extra parameters, GL stuff is added, 2 parameters |
| m.ping(new String[] { "ping", "emulator", "12", "Vendor Inc.", "Some cool_GPU!!! (fast one!)" }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64&" + |
| "glm=Vendor+Inc.&" + |
| "glr=Some+cool_GPU+%28fast+one+%29", |
| m.getPingUrlResult().toString()); |
| |
| // Send a ping for the emulator app with extra parameters, GL stuff is added, 1 parameter |
| m.ping(new String[] { "ping", "emulator", "12", "Vendor Inc." }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64&" + |
| "glm=Vendor+Inc.", |
| m.getPingUrlResult().toString()); |
| |
| // Parameters that are more than 128 chars are cut short. |
| m.ping(new String[] { "ping", "emulator", "12", |
| // 130 chars each |
| "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", |
| "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", |
| "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" }); |
| assertEquals( |
| "http://tools.google.com/service/update?" + |
| "as=androidsdk_emulator&" + |
| "id=42&" + |
| "version=12.0.0.0&" + |
| "os=win-6.2&" + |
| "osa=x86_64&" + |
| "vma=1.7-x86_64&" + |
| "glm=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567&" + |
| "glr=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567&" + |
| "glv=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567", |
| m.getPingUrlResult().toString()); |
| } |
| } |