mobile/android/tests/background/junit3/src/healthreport/upload/TestAndroidSubmissionClient.java

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mobile/android/tests/background/junit3/src/healthreport/upload/TestAndroidSubmissionClient.java	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,204 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 +   http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +package org.mozilla.gecko.background.healthreport.upload;
     1.8 +
     1.9 +import java.util.Collection;
    1.10 +
    1.11 +import org.mozilla.gecko.background.bagheera.BagheeraRequestDelegate;
    1.12 +import org.mozilla.gecko.background.healthreport.Environment;
    1.13 +import org.mozilla.gecko.background.healthreport.HealthReportStorage;
    1.14 +import org.mozilla.gecko.background.healthreport.HealthReportDatabaseStorage;
    1.15 +import org.mozilla.gecko.background.healthreport.MockHealthReportDatabaseStorage.PrepopulatedMockHealthReportDatabaseStorage;
    1.16 +import org.mozilla.gecko.background.healthreport.MockProfileInformationCache;
    1.17 +import org.mozilla.gecko.background.healthreport.ProfileInformationCache;
    1.18 +import org.mozilla.gecko.background.healthreport.upload.AndroidSubmissionClient;
    1.19 +import org.mozilla.gecko.background.healthreport.upload.AndroidSubmissionClient.SubmissionsFieldName;
    1.20 +import org.mozilla.gecko.background.helpers.FakeProfileTestCase;
    1.21 +import org.mozilla.gecko.background.testhelpers.StubDelegate;
    1.22 +
    1.23 +import android.content.ContentProviderClient;
    1.24 +import android.content.Context;
    1.25 +import android.content.SharedPreferences;
    1.26 +import org.json.JSONException;
    1.27 +import org.json.JSONObject;
    1.28 +
    1.29 +public class TestAndroidSubmissionClient extends FakeProfileTestCase {
    1.30 +  public static class MockAndroidSubmissionClient extends AndroidSubmissionClient {
    1.31 +    protected final PrepopulatedMockHealthReportDatabaseStorage storage;
    1.32 +
    1.33 +    public SubmissionState submissionState = SubmissionState.SUCCESS;
    1.34 +    public DocumentStatus documentStatus = DocumentStatus.VALID;
    1.35 +    public boolean hasUploadBeenRequested = true;
    1.36 +
    1.37 +    public MockAndroidSubmissionClient(final Context context, final SharedPreferences sharedPrefs,
    1.38 +        final PrepopulatedMockHealthReportDatabaseStorage storage) {
    1.39 +      super(context, sharedPrefs, "profilePath");
    1.40 +      this.storage = storage;
    1.41 +    }
    1.42 +
    1.43 +    @Override
    1.44 +    public HealthReportDatabaseStorage getStorage(final ContentProviderClient client) {
    1.45 +      return storage;
    1.46 +    }
    1.47 +
    1.48 +    @Override
    1.49 +    public boolean hasUploadBeenRequested() {
    1.50 +      return hasUploadBeenRequested;
    1.51 +    }
    1.52 +
    1.53 +    @Override
    1.54 +    protected void uploadPayload(String id, String payload, Collection<String> oldIds,
    1.55 +        BagheeraRequestDelegate delegate) {
    1.56 +      switch (submissionState) {
    1.57 +      case SUCCESS:
    1.58 +        delegate.handleSuccess(0, null, id, null);
    1.59 +        break;
    1.60 +
    1.61 +      case FAILURE:
    1.62 +        delegate.handleFailure(0, null, null);
    1.63 +        break;
    1.64 +
    1.65 +      case ERROR:
    1.66 +        delegate.handleError(null);
    1.67 +        break;
    1.68 +
    1.69 +      default:
    1.70 +        throw new IllegalStateException("Unknown submissionState, " + submissionState);
    1.71 +      }
    1.72 +    }
    1.73 +
    1.74 +    @Override
    1.75 +    public SubmissionsTracker getSubmissionsTracker(final HealthReportStorage storage,
    1.76 +        final long localTime, final boolean hasUploadBeenRequested) {
    1.77 +      return new MockSubmissionsTracker(storage, localTime, hasUploadBeenRequested);
    1.78 +    }
    1.79 +
    1.80 +    public class MockSubmissionsTracker extends SubmissionsTracker {
    1.81 +      public MockSubmissionsTracker (final HealthReportStorage storage, final long localTime,
    1.82 +          final boolean hasUploadBeenRequested) {
    1.83 +        super(storage, localTime, hasUploadBeenRequested);
    1.84 +      }
    1.85 +
    1.86 +      @Override
    1.87 +      public ProfileInformationCache getProfileInformationCache() {
    1.88 +        final MockProfileInformationCache cache = new MockProfileInformationCache(profilePath);
    1.89 +        cache.setInitialized(true); // Will throw errors otherwise.
    1.90 +        return cache;
    1.91 +      }
    1.92 +
    1.93 +      @Override
    1.94 +      public TrackingGenerator getGenerator() {
    1.95 +        return new MockTrackingGenerator();
    1.96 +      }
    1.97 +
    1.98 +      public class MockTrackingGenerator extends TrackingGenerator {
    1.99 +        @Override
   1.100 +        public JSONObject generateDocument(final long localTime, final long last,
   1.101 +            final String profilePath) throws JSONException {
   1.102 +          switch (documentStatus) {
   1.103 +          case VALID:
   1.104 +            return new JSONObject(); // Beyond == null, we don't check for valid FHR documents.
   1.105 +
   1.106 +          case NULL:
   1.107 +            // The overridden method should return null since we return a null has for the current
   1.108 +            // Environment.
   1.109 +            return super.generateDocument(localTime, last, profilePath);
   1.110 +
   1.111 +          case EXCEPTION:
   1.112 +            throw new IllegalStateException("Intended Exception");
   1.113 +
   1.114 +          default:
   1.115 +            throw new IllegalStateException("Unintended Exception");
   1.116 +          }
   1.117 +        }
   1.118 +
   1.119 +        // Used in super.generateDocument, where a null document is returned if getHash returns null
   1.120 +        @Override
   1.121 +        public Environment getCurrentEnvironment() {
   1.122 +          return new Environment() {
   1.123 +            @Override
   1.124 +            public int register() {
   1.125 +              return 0;
   1.126 +            }
   1.127 +
   1.128 +            @Override
   1.129 +            public String getHash() {
   1.130 +              return null;
   1.131 +            }
   1.132 +          };
   1.133 +        }
   1.134 +      }
   1.135 +    }
   1.136 +  }
   1.137 +
   1.138 +  public final SubmissionsFieldName[] SUBMISSIONS_STATUS_FIELD_NAMES = new SubmissionsFieldName[] {
   1.139 +    SubmissionsFieldName.SUCCESS,
   1.140 +    SubmissionsFieldName.CLIENT_FAILURE,
   1.141 +    SubmissionsFieldName.TRANSPORT_FAILURE,
   1.142 +    SubmissionsFieldName.SERVER_FAILURE
   1.143 +  };
   1.144 +
   1.145 +  public static enum SubmissionState { SUCCESS, FAILURE, ERROR }
   1.146 +  public static enum DocumentStatus { VALID, NULL, EXCEPTION };
   1.147 +
   1.148 +  public StubDelegate stubDelegate;
   1.149 +  public PrepopulatedMockHealthReportDatabaseStorage storage;
   1.150 +  public MockAndroidSubmissionClient client;
   1.151 +
   1.152 +  public void setUp() throws Exception {
   1.153 +    super.setUp();
   1.154 +    stubDelegate = new StubDelegate();
   1.155 +    storage = new PrepopulatedMockHealthReportDatabaseStorage(context, fakeProfileDirectory);
   1.156 +    client = new MockAndroidSubmissionClient(context, getSharedPreferences(), storage);
   1.157 +  }
   1.158 +
   1.159 +  public int getSubmissionsCount(final SubmissionsFieldName fieldName) {
   1.160 +    final int id = fieldName.getID(storage);
   1.161 +    return storage.getIntFromQuery("SELECT COUNT(*) FROM events WHERE field = " + id, null);
   1.162 +  }
   1.163 +
   1.164 +  public void testUploadSubmissionsFirstAttemptCount() throws Exception {
   1.165 +    client.hasUploadBeenRequested = false;
   1.166 +    client.upload(storage.now, null, null, stubDelegate);
   1.167 +    assertEquals(1, getSubmissionsCount(SubmissionsFieldName.FIRST_ATTEMPT));
   1.168 +    assertEquals(0, getSubmissionsCount(SubmissionsFieldName.CONTINUATION_ATTEMPT));
   1.169 +  }
   1.170 +
   1.171 +  public void testUploadSubmissionsContinuationAttemptCount() throws Exception {
   1.172 +    client.upload(storage.now, null, null, stubDelegate);
   1.173 +    assertEquals(0, getSubmissionsCount(SubmissionsFieldName.FIRST_ATTEMPT));
   1.174 +    assertEquals(1, getSubmissionsCount(SubmissionsFieldName.CONTINUATION_ATTEMPT));
   1.175 +  }
   1.176 +
   1.177 +  /**
   1.178 +   * Asserts that the given field name has a count of 1 and all other status (success and failures)
   1.179 +   * have a count of 0.
   1.180 +   */
   1.181 +  public void assertStatusCount(final SubmissionsFieldName fieldName) {
   1.182 +    for (SubmissionsFieldName name : SUBMISSIONS_STATUS_FIELD_NAMES) {
   1.183 +      if (name == fieldName) {
   1.184 +        assertEquals(1, getSubmissionsCount(name));
   1.185 +      } else {
   1.186 +        assertEquals(0, getSubmissionsCount(name));
   1.187 +      }
   1.188 +    }
   1.189 +  }
   1.190 +
   1.191 +  public void testUploadSubmissionsSuccessCount() throws Exception {
   1.192 +    client.upload(storage.now, null, null, stubDelegate);
   1.193 +    assertStatusCount(SubmissionsFieldName.SUCCESS);
   1.194 +  }
   1.195 +
   1.196 +  public void testUploadNullDocumentSubmissionsFailureCount() throws Exception {
   1.197 +    client.documentStatus = DocumentStatus.NULL;
   1.198 +    client.upload(storage.now, null, null, stubDelegate);
   1.199 +    assertStatusCount(SubmissionsFieldName.CLIENT_FAILURE);
   1.200 +  }
   1.201 +
   1.202 +  public void testUploadDocumentGenerationExceptionSubmissionsFailureCount() throws Exception {
   1.203 +    client.documentStatus = DocumentStatus.EXCEPTION;
   1.204 +    client.upload(storage.now, null, null, stubDelegate);
   1.205 +    assertStatusCount(SubmissionsFieldName.CLIENT_FAILURE);
   1.206 +  }
   1.207 +}

mercurial