blob: 9982bb782fdae8cc349009818e404fe6c86a12e2 [file] [log] [blame]
/*
* 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());
}
}