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 +}