Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/omaha/OmahaClientTest.java

Issue 2664253005: [Omaha] Move most functionality to OmahaBase, add JobService (Closed)
Patch Set: [Omaha] Move most functionality to OmahaBase, add JobService Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/javatests/src/org/chromium/chrome/browser/omaha/OmahaClientTest.java
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/OmahaClientTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/OmahaClientTest.java
deleted file mode 100644
index 6c40881ab380522284d3dcb5a7f299fd7844be74..0000000000000000000000000000000000000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/OmahaClientTest.java
+++ /dev/null
@@ -1,696 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.omaha;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.support.test.filters.SmallTest;
-import android.test.InstrumentationTestCase;
-
-import org.chromium.base.test.util.AdvancedMockContext;
-import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.test.omaha.MockRequestGenerator;
-import org.chromium.chrome.test.omaha.MockRequestGenerator.DeviceType;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Tests for the {@link OmahaClient}.
- * Tests override the original OmahaClient's functions with the MockOmahaClient, which
- * provides a way to hook into functions to return values that would normally be provided by the
- * system, such as whether Chrome was installed through the system image.
- */
-public class OmahaClientTest extends InstrumentationTestCase {
- private static class TimestampPair {
- public long timestampNextRequest;
- public long timestampNextPost;
-
- public TimestampPair(long timestampNextRequest, long timestampNextPost) {
- this.timestampNextRequest = timestampNextRequest;
- this.timestampNextPost = timestampNextPost;
- }
- }
-
- private static class MockOmahaDelegate extends OmahaDelegate {
- private final List<Integer> mPostResults = new ArrayList<Integer>();
- private final List<Boolean> mGenerateAndPostRequestResults = new ArrayList<Boolean>();
-
- private final boolean mIsOnTablet;
- private final boolean mIsInForeground;
- private final boolean mIsInSystemImage;
- private final MockExponentialBackoffScheduler mMockScheduler;
- private MockRequestGenerator mMockGenerator;
-
- private int mNumUUIDsGenerated;
- private long mNextScheduledTimestamp = -1;
-
- private boolean mInstallEventWasSent;
- private TimestampPair mTimestampsOnRegisterNewRequest;
- private TimestampPair mTimestampsOnSaveState;
-
- MockOmahaDelegate(Context context, DeviceType deviceType, InstallSource installSource) {
- super(context);
- mIsOnTablet = deviceType == DeviceType.TABLET;
- mIsInForeground = true;
- mIsInSystemImage = installSource == InstallSource.SYSTEM_IMAGE;
-
- mMockScheduler = new MockExponentialBackoffScheduler(OmahaBase.PREF_PACKAGE, context,
- OmahaClient.MS_POST_BASE_DELAY, OmahaClient.MS_POST_MAX_DELAY);
- }
-
- @Override
- protected RequestGenerator createRequestGenerator(Context context) {
- mMockGenerator = new MockRequestGenerator(
- context, mIsOnTablet ? DeviceType.TABLET : DeviceType.HANDSET);
- return mMockGenerator;
- }
-
- @Override
- public boolean isInSystemImage() {
- return mIsInSystemImage;
- }
-
- @Override
- MockExponentialBackoffScheduler getScheduler() {
- return mMockScheduler;
- }
-
- @Override
- protected String generateUUID() {
- mNumUUIDsGenerated += 1;
- return "UUID" + mNumUUIDsGenerated;
- }
-
- @Override
- protected boolean isChromeBeingUsed() {
- return mIsInForeground;
- }
-
- @Override
- void scheduleService(Service service, long nextTimestamp) {
- mNextScheduledTimestamp = nextTimestamp;
- }
-
- @Override
- void onHandlePostRequestDone(int result, boolean installEventWasSent) {
- mPostResults.add(result);
- mInstallEventWasSent = installEventWasSent;
- }
-
- @Override
- void onRegisterNewRequestDone(long nextRequestTimestamp, long nextPostTimestamp) {
- mTimestampsOnRegisterNewRequest =
- new TimestampPair(nextRequestTimestamp, nextPostTimestamp);
- }
-
- @Override
- void onGenerateAndPostRequestDone(boolean result) {
- mGenerateAndPostRequestResults.add(result);
- }
-
- @Override
- void onSaveStateDone(long nextRequestTimestamp, long nextPostTimestamp) {
- mTimestampsOnSaveState = new TimestampPair(nextRequestTimestamp, nextPostTimestamp);
- }
- }
-
- private enum InstallSource { SYSTEM_IMAGE, ORGANIC }
- private enum ServerResponse { SUCCESS, FAILURE }
- private enum ConnectionStatus { RESPONDS, TIMES_OUT }
- private enum InstallEvent { SEND, DONT_SEND }
- private enum PostStatus { DUE, NOT_DUE }
-
- private AdvancedMockContext mContext;
- private MockOmahaDelegate mDelegate;
- private MockOmahaClient mOmahaClient;
-
- private MockOmahaClient createOmahaClient() {
- return createOmahaClient(
- ServerResponse.SUCCESS, ConnectionStatus.RESPONDS, DeviceType.HANDSET);
- }
-
- private MockOmahaClient createOmahaClient(
- ServerResponse response, ConnectionStatus status, DeviceType deviceType) {
- MockOmahaClient omahaClient = new MockOmahaClient(mContext, response, status, deviceType);
- omahaClient.onCreate();
- omahaClient.restoreState(mContext);
- return omahaClient;
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- Context targetContext = getInstrumentation().getTargetContext();
- OmahaBase.setIsDisabledForTesting(false);
- mContext = new AdvancedMockContext(targetContext);
- }
-
- @Override
- public void tearDown() throws Exception {
- OmahaBase.setIsDisabledForTesting(true);
- super.tearDown();
- }
-
- private class MockOmahaClient extends OmahaClient {
- private final LinkedList<MockConnection> mMockConnections = new LinkedList<>();
-
- private final boolean mSendValidResponse;
- private final boolean mConnectionTimesOut;
- private final boolean mIsOnTablet;
-
- public MockOmahaClient(Context context, ServerResponse serverResponse,
- ConnectionStatus connectionStatus, DeviceType deviceType) {
- attachBaseContext(context);
- setDelegateForTests(mDelegate);
-
- mSendValidResponse = serverResponse == ServerResponse.SUCCESS;
- mConnectionTimesOut = connectionStatus == ConnectionStatus.TIMES_OUT;
- mIsOnTablet = deviceType == DeviceType.TABLET;
- }
-
- /**
- * Gets the number of MockConnections created.
- */
- public int getNumConnectionsMade() {
- return mMockConnections.size();
- }
-
- /**
- * Returns a particular connection.
- */
- public MockConnection getConnection(int index) {
- return mMockConnections.get(index);
- }
-
- /**
- * Returns the last MockPingConection used to simulate communication with the server.
- */
- public MockConnection getLastConnection() {
- return mMockConnections.getLast();
- }
-
- public boolean isSendInstallEvent() {
- return mSendInstallEvent;
- }
-
- public void setSendInstallEvent(boolean state) {
- mSendInstallEvent = state;
- }
-
- @Override
- protected HttpURLConnection createConnection() throws RequestFailureException {
- MockConnection connection = null;
- try {
- URL url = new URL(mDelegate.getRequestGenerator().getServerUrl());
- connection = new MockConnection(url, mIsOnTablet, mSendValidResponse,
- mSendInstallEvent, mConnectionTimesOut);
- mMockConnections.addLast(connection);
- } catch (MalformedURLException e) {
- fail("Caught a malformed URL exception: " + e);
- }
- return connection;
- }
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testPipelineFreshInstall() {
- final long now = 11684;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // A fresh install results in two requests to the Omaha server: one for the install request
- // and one for the ping request.
- assertTrue(mDelegate.mInstallEventWasSent);
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SENT, mDelegate.mPostResults.get(0).intValue());
- assertEquals(2, mDelegate.mGenerateAndPostRequestResults.size());
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0));
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(1));
-
- // Successful requests mean that the next scheduled event should be checking for when the
- // user is active.
- assertEquals(now + OmahaClient.MS_BETWEEN_REQUESTS, mDelegate.mNextScheduledTimestamp);
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testPipelineRegularPing() {
- final long now = 11684;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- // Record that an install event has already been sent and that we're due for a new request.
- SharedPreferences.Editor editor = OmahaBase.getSharedPreferences(mContext).edit();
- editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, now);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, now);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Only the regular ping should have been sent.
- assertFalse(mDelegate.mInstallEventWasSent);
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SENT, mDelegate.mPostResults.get(0).intValue());
- assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size());
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0));
-
- // Successful requests mean that the next scheduled event should be checking for when the
- // user is active.
- assertEquals(now + OmahaClient.MS_BETWEEN_REQUESTS, mDelegate.mNextScheduledTimestamp);
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testTooEarlyToPing() {
- final long now = 0;
- final long later = 10000;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- // Put the time for the next request in the future.
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- prefs.edit().putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, later).apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Nothing should have been POSTed.
- assertEquals(0, mDelegate.mPostResults.size());
- assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size());
-
- // The next scheduled event is the request generation. Because there was nothing to POST,
- // its timestamp should have remained unchanged and shouldn't have been considered when the
- // new alarm was scheduled.
- assertEquals(later, mDelegate.mNextScheduledTimestamp);
- checkTimestamps(later, now, mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testTooEarlyToPostExistingRequest() {
- final long timeGeneratedRequest = 0L;
- final long now = 10000L;
- final long timeSendNewPost = 20000L;
- final long timeSendNewRequest = 50000L;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- SharedPreferences.Editor editor = prefs.edit();
-
- // Make it so that a request was generated and is just waiting to be sent.
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeSendNewRequest);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest);
- editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id");
-
- // Put the time for the next post in the future.
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendNewPost);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Request generation code should be skipped.
- assertNull(mDelegate.mTimestampsOnRegisterNewRequest);
-
- // Should be too early to post, causing it to be rescheduled.
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SCHEDULED, mDelegate.mPostResults.get(0).intValue());
- assertEquals(0, mDelegate.mGenerateAndPostRequestResults.size());
-
- // The next scheduled event is the POST. Because request generation code wasn't run, the
- // timestamp for it shouldn't have changed.
- assertEquals(timeSendNewPost, mDelegate.mNextScheduledTimestamp);
- checkTimestamps(timeSendNewRequest, timeSendNewPost, mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testPostExistingRequestSuccessfully() {
- final long timeGeneratedRequest = 0L;
- final long now = 10000L;
- final long timeSendNewPost = now;
- final long timeRegisterNewRequest = 20000L;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- SharedPreferences.Editor editor = prefs.edit();
-
- // Make it so that a regular <ping> was generated and is just waiting to be sent.
- editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNewRequest);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest);
- editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id");
-
- // Send the POST now.
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendNewPost);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Registering code shouldn't have fired.
- assertNull(mDelegate.mTimestampsOnRegisterNewRequest);
-
- // Because we didn't send an install event, only one POST should have occurred.
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SENT, mDelegate.mPostResults.get(0).intValue());
- assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size());
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0));
-
- // The next scheduled event is the request generation because there is nothing to POST.
- // A successful POST adjusts all timestamps for the current time.
- assertEquals(timeRegisterNewRequest, mDelegate.mNextScheduledTimestamp);
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testPostExistingButFails() {
- final long timeGeneratedRequest = 0L;
- final long now = 10000L;
- final long timeSendNewPost = now;
- final long timeRegisterNewRequest = timeGeneratedRequest + OmahaClient.MS_BETWEEN_REQUESTS;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- SharedPreferences.Editor editor = prefs.edit();
-
- // Make it so that a regular <ping> was generated and is just waiting to be sent.
- editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNewRequest);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest);
- editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id");
-
- // Send the POST now.
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendNewPost);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient(
- ServerResponse.FAILURE, ConnectionStatus.RESPONDS, DeviceType.HANDSET);
- mOmahaClient.run();
-
- // Registering code shouldn't have fired.
- assertNull(mDelegate.mTimestampsOnRegisterNewRequest);
-
- // Because we didn't send an install event, only one POST should have occurred.
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_FAILED, mDelegate.mPostResults.get(0).intValue());
- assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size());
- assertFalse(mDelegate.mGenerateAndPostRequestResults.get(0));
-
- // The next scheduled event should be the POST event, which is delayed by the base delay
- // because no failures have happened yet.
- assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextPost,
- mDelegate.mNextScheduledTimestamp);
- checkTimestamps(timeRegisterNewRequest, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testTimestampWithinBounds() {
- final long now = 0L;
- final long timeRegisterNewRequest = OmahaClient.MS_BETWEEN_REQUESTS + 1;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- SharedPreferences.Editor editor = prefs.edit();
-
- // Indicate that the next request should be generated way past an expected timeframe.
- editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNewRequest);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Request generation code should fire.
- assertNotNull(mDelegate.mTimestampsOnRegisterNewRequest);
-
- // Because we didn't send an install event, only one POST should have occurred.
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SENT, mDelegate.mPostResults.get(0).intValue());
- assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size());
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0));
-
- // The next scheduled event should be the timestamp for a new request generation.
- assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextRequest,
- mDelegate.mNextScheduledTimestamp);
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- @SmallTest
- @Feature({"Omaha"})
- public void testOverdueRequestCausesNewRegistration() {
- final long timeGeneratedRequest = 0L;
- final long now = 10000L;
- final long timeSendNewPost = now;
- final long timeRegisterNewRequest =
- timeGeneratedRequest + OmahaClient.MS_BETWEEN_REQUESTS * 5;
-
- mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC);
- mDelegate.getScheduler().setCurrentTime(now);
-
- // Record that a regular <ping> was generated, but not sent, then assign it an invalid
- // timestamp and try to send it now.
- SharedPreferences prefs = OmahaBase.getSharedPreferences(mContext);
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEW_REQUEST, timeRegisterNewRequest);
- editor.putLong(OmahaBase.PREF_TIMESTAMP_OF_REQUEST, timeGeneratedRequest);
- editor.putString(OmahaBase.PREF_PERSISTED_REQUEST_ID, "persisted_id");
- editor.putLong(OmahaBase.PREF_TIMESTAMP_FOR_NEXT_POST_ATTEMPT, timeSendNewPost);
- editor.apply();
-
- // Trigger Omaha.
- mOmahaClient = createOmahaClient();
- mOmahaClient.run();
-
- // Registering code shouldn't have fired.
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now,
- mDelegate.mTimestampsOnRegisterNewRequest);
-
- // Because we didn't send an install event, only one POST should have occurred.
- assertEquals(1, mDelegate.mPostResults.size());
- assertEquals(OmahaClient.POST_RESULT_SENT, mDelegate.mPostResults.get(0).intValue());
- assertEquals(1, mDelegate.mGenerateAndPostRequestResults.size());
- assertTrue(mDelegate.mGenerateAndPostRequestResults.get(0));
-
- // The next scheduled event should be the registration event.
- assertEquals(mDelegate.mTimestampsOnSaveState.timestampNextRequest,
- mDelegate.mNextScheduledTimestamp);
- checkTimestamps(now + OmahaClient.MS_BETWEEN_REQUESTS, now + OmahaClient.MS_POST_BASE_DELAY,
- mDelegate.mTimestampsOnSaveState);
- }
-
- private void checkTimestamps(
- long expectedRequestTimestamp, long expectedPostTimestamp, TimestampPair timestamps) {
- assertEquals(expectedRequestTimestamp, timestamps.timestampNextRequest);
- assertEquals(expectedPostTimestamp, timestamps.timestampNextPost);
- }
-
- /**
- * Simulates communication with the actual Omaha server.
- */
- private static class MockConnection extends HttpURLConnection {
- // Omaha appends a "/" to the URL.
- private static final String STRIPPED_MARKET_URL =
- "https://market.android.com/details?id=com.google.android.apps.chrome";
- private static final String MARKET_URL = STRIPPED_MARKET_URL + "/";
-
- private static final String UPDATE_VERSION = "1.2.3.4";
-
- // Parameters.
- private final boolean mConnectionTimesOut;
- private final ByteArrayInputStream mServerResponse;
- private final ByteArrayOutputStream mOutputStream;
- private final int mHTTPResponseCode;
-
- // Result variables.
- private int mContentLength;
- private int mNumTimesResponseCodeRetrieved;
- private boolean mSentRequest;
- private boolean mGotInputStream;
- private String mRequestPropertyField;
- private String mRequestPropertyValue;
-
- MockConnection(URL url, boolean usingTablet, boolean sendValidResponse,
- boolean sendInstallEvent, boolean connectionTimesOut) {
- super(url);
- assertEquals(MockRequestGenerator.SERVER_URL, url.toString());
-
- String mockResponse = buildServerResponseString(usingTablet, sendInstallEvent);
- mOutputStream = new ByteArrayOutputStream();
- mServerResponse = new ByteArrayInputStream(mockResponse.getBytes());
- mConnectionTimesOut = connectionTimesOut;
-
- if (sendValidResponse) {
- mHTTPResponseCode = 200;
- } else {
- mHTTPResponseCode = 404;
- }
- }
-
- /**
- * Build a simulated response from the Omaha server indicating an update is available.
- * The response changes based on the device type.
- */
- private String buildServerResponseString(boolean isOnTablet, boolean sendInstallEvent) {
- String response = "";
- response += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- response += "<response protocol=\"3.0\" server=\"prod\">";
- response += "<daystart elapsed_seconds=\"12345\"/>";
- response += "<app appid=\"";
- response += (isOnTablet
- ? MockRequestGenerator.UUID_TABLET : MockRequestGenerator.UUID_PHONE);
- response += "\" status=\"ok\">";
- if (sendInstallEvent) {
- response += "<event status=\"ok\"/>";
- } else {
- response += "<updatecheck status=\"ok\">";
- response += "<urls><url codebase=\"" + MARKET_URL + "\"/></urls>";
- response += "<manifest version=\"" + UPDATE_VERSION + "\">";
- response += "<packages>";
- response += "<package hash=\"0\" name=\"dummy.apk\" required=\"true\" size=\"0\"/>";
- response += "</packages>";
- response += "<actions>";
- response += "<action event=\"install\" run=\"dummy.apk\"/>";
- response += "<action event=\"postinstall\"/>";
- response += "</actions>";
- response += "</manifest>";
- response += "</updatecheck>";
- response += "<ping status=\"ok\"/>";
- }
- response += "</app>";
- response += "</response>";
- return response;
- }
-
- @Override
- public boolean usingProxy() {
- return false;
- }
-
- @Override
- public void connect() throws SocketTimeoutException {
- if (mConnectionTimesOut) {
- throw new SocketTimeoutException("Connection timed out.");
- }
- }
-
- @Override
- public void disconnect() {}
-
- @Override
- public void setDoOutput(boolean value) throws IllegalAccessError {
- assertTrue("Told the HTTPUrlConnection to send no request.", value);
- }
-
- @Override
- public void setFixedLengthStreamingMode(int contentLength) {
- mContentLength = contentLength;
- }
-
- @Override
- public int getResponseCode() {
- if (mNumTimesResponseCodeRetrieved == 0) {
- // The output stream should now have the generated XML for the request.
- // Check if its length is correct.
- assertEquals("Expected OmahaClient to write out certain number of bytes",
- mContentLength, mOutputStream.toByteArray().length);
- }
- assertTrue("Tried to retrieve response code more than twice",
- mNumTimesResponseCodeRetrieved < 2);
- mNumTimesResponseCodeRetrieved++;
- return mHTTPResponseCode;
- }
-
- @Override
- public OutputStream getOutputStream() throws IOException {
- mSentRequest = true;
- connect();
- return mOutputStream;
- }
-
- public String getOutputStreamContents() {
- return mOutputStream.toString();
- }
-
- @Override
- public InputStream getInputStream() {
- assertTrue("Tried to read server response without sending request.", mSentRequest);
- mGotInputStream = true;
- return mServerResponse;
- }
-
- @Override
- public void addRequestProperty(String field, String newValue) {
- mRequestPropertyField = field;
- mRequestPropertyValue = newValue;
- }
-
- public int getNumTimesResponseCodeRetrieved() {
- return mNumTimesResponseCodeRetrieved;
- }
-
- public boolean getGotInputStream() {
- return mGotInputStream;
- }
-
- public boolean getSentRequest() {
- return mSentRequest;
- }
-
- public String getRequestPropertyField() {
- return mRequestPropertyField;
- }
-
- public String getRequestPropertyValue() {
- return mRequestPropertyValue;
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698