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

branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
equal deleted inserted replaced
-1:000000000000 0:4290a3ccc1ea
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
3
4 package org.mozilla.gecko.background.healthreport.upload;
5
6 import java.util.Collection;
7
8 import org.mozilla.gecko.background.bagheera.BagheeraRequestDelegate;
9 import org.mozilla.gecko.background.healthreport.Environment;
10 import org.mozilla.gecko.background.healthreport.HealthReportStorage;
11 import org.mozilla.gecko.background.healthreport.HealthReportDatabaseStorage;
12 import org.mozilla.gecko.background.healthreport.MockHealthReportDatabaseStorage.PrepopulatedMockHealthReportDatabaseStorage;
13 import org.mozilla.gecko.background.healthreport.MockProfileInformationCache;
14 import org.mozilla.gecko.background.healthreport.ProfileInformationCache;
15 import org.mozilla.gecko.background.healthreport.upload.AndroidSubmissionClient;
16 import org.mozilla.gecko.background.healthreport.upload.AndroidSubmissionClient.SubmissionsFieldName;
17 import org.mozilla.gecko.background.helpers.FakeProfileTestCase;
18 import org.mozilla.gecko.background.testhelpers.StubDelegate;
19
20 import android.content.ContentProviderClient;
21 import android.content.Context;
22 import android.content.SharedPreferences;
23 import org.json.JSONException;
24 import org.json.JSONObject;
25
26 public class TestAndroidSubmissionClient extends FakeProfileTestCase {
27 public static class MockAndroidSubmissionClient extends AndroidSubmissionClient {
28 protected final PrepopulatedMockHealthReportDatabaseStorage storage;
29
30 public SubmissionState submissionState = SubmissionState.SUCCESS;
31 public DocumentStatus documentStatus = DocumentStatus.VALID;
32 public boolean hasUploadBeenRequested = true;
33
34 public MockAndroidSubmissionClient(final Context context, final SharedPreferences sharedPrefs,
35 final PrepopulatedMockHealthReportDatabaseStorage storage) {
36 super(context, sharedPrefs, "profilePath");
37 this.storage = storage;
38 }
39
40 @Override
41 public HealthReportDatabaseStorage getStorage(final ContentProviderClient client) {
42 return storage;
43 }
44
45 @Override
46 public boolean hasUploadBeenRequested() {
47 return hasUploadBeenRequested;
48 }
49
50 @Override
51 protected void uploadPayload(String id, String payload, Collection<String> oldIds,
52 BagheeraRequestDelegate delegate) {
53 switch (submissionState) {
54 case SUCCESS:
55 delegate.handleSuccess(0, null, id, null);
56 break;
57
58 case FAILURE:
59 delegate.handleFailure(0, null, null);
60 break;
61
62 case ERROR:
63 delegate.handleError(null);
64 break;
65
66 default:
67 throw new IllegalStateException("Unknown submissionState, " + submissionState);
68 }
69 }
70
71 @Override
72 public SubmissionsTracker getSubmissionsTracker(final HealthReportStorage storage,
73 final long localTime, final boolean hasUploadBeenRequested) {
74 return new MockSubmissionsTracker(storage, localTime, hasUploadBeenRequested);
75 }
76
77 public class MockSubmissionsTracker extends SubmissionsTracker {
78 public MockSubmissionsTracker (final HealthReportStorage storage, final long localTime,
79 final boolean hasUploadBeenRequested) {
80 super(storage, localTime, hasUploadBeenRequested);
81 }
82
83 @Override
84 public ProfileInformationCache getProfileInformationCache() {
85 final MockProfileInformationCache cache = new MockProfileInformationCache(profilePath);
86 cache.setInitialized(true); // Will throw errors otherwise.
87 return cache;
88 }
89
90 @Override
91 public TrackingGenerator getGenerator() {
92 return new MockTrackingGenerator();
93 }
94
95 public class MockTrackingGenerator extends TrackingGenerator {
96 @Override
97 public JSONObject generateDocument(final long localTime, final long last,
98 final String profilePath) throws JSONException {
99 switch (documentStatus) {
100 case VALID:
101 return new JSONObject(); // Beyond == null, we don't check for valid FHR documents.
102
103 case NULL:
104 // The overridden method should return null since we return a null has for the current
105 // Environment.
106 return super.generateDocument(localTime, last, profilePath);
107
108 case EXCEPTION:
109 throw new IllegalStateException("Intended Exception");
110
111 default:
112 throw new IllegalStateException("Unintended Exception");
113 }
114 }
115
116 // Used in super.generateDocument, where a null document is returned if getHash returns null
117 @Override
118 public Environment getCurrentEnvironment() {
119 return new Environment() {
120 @Override
121 public int register() {
122 return 0;
123 }
124
125 @Override
126 public String getHash() {
127 return null;
128 }
129 };
130 }
131 }
132 }
133 }
134
135 public final SubmissionsFieldName[] SUBMISSIONS_STATUS_FIELD_NAMES = new SubmissionsFieldName[] {
136 SubmissionsFieldName.SUCCESS,
137 SubmissionsFieldName.CLIENT_FAILURE,
138 SubmissionsFieldName.TRANSPORT_FAILURE,
139 SubmissionsFieldName.SERVER_FAILURE
140 };
141
142 public static enum SubmissionState { SUCCESS, FAILURE, ERROR }
143 public static enum DocumentStatus { VALID, NULL, EXCEPTION };
144
145 public StubDelegate stubDelegate;
146 public PrepopulatedMockHealthReportDatabaseStorage storage;
147 public MockAndroidSubmissionClient client;
148
149 public void setUp() throws Exception {
150 super.setUp();
151 stubDelegate = new StubDelegate();
152 storage = new PrepopulatedMockHealthReportDatabaseStorage(context, fakeProfileDirectory);
153 client = new MockAndroidSubmissionClient(context, getSharedPreferences(), storage);
154 }
155
156 public int getSubmissionsCount(final SubmissionsFieldName fieldName) {
157 final int id = fieldName.getID(storage);
158 return storage.getIntFromQuery("SELECT COUNT(*) FROM events WHERE field = " + id, null);
159 }
160
161 public void testUploadSubmissionsFirstAttemptCount() throws Exception {
162 client.hasUploadBeenRequested = false;
163 client.upload(storage.now, null, null, stubDelegate);
164 assertEquals(1, getSubmissionsCount(SubmissionsFieldName.FIRST_ATTEMPT));
165 assertEquals(0, getSubmissionsCount(SubmissionsFieldName.CONTINUATION_ATTEMPT));
166 }
167
168 public void testUploadSubmissionsContinuationAttemptCount() throws Exception {
169 client.upload(storage.now, null, null, stubDelegate);
170 assertEquals(0, getSubmissionsCount(SubmissionsFieldName.FIRST_ATTEMPT));
171 assertEquals(1, getSubmissionsCount(SubmissionsFieldName.CONTINUATION_ATTEMPT));
172 }
173
174 /**
175 * Asserts that the given field name has a count of 1 and all other status (success and failures)
176 * have a count of 0.
177 */
178 public void assertStatusCount(final SubmissionsFieldName fieldName) {
179 for (SubmissionsFieldName name : SUBMISSIONS_STATUS_FIELD_NAMES) {
180 if (name == fieldName) {
181 assertEquals(1, getSubmissionsCount(name));
182 } else {
183 assertEquals(0, getSubmissionsCount(name));
184 }
185 }
186 }
187
188 public void testUploadSubmissionsSuccessCount() throws Exception {
189 client.upload(storage.now, null, null, stubDelegate);
190 assertStatusCount(SubmissionsFieldName.SUCCESS);
191 }
192
193 public void testUploadNullDocumentSubmissionsFailureCount() throws Exception {
194 client.documentStatus = DocumentStatus.NULL;
195 client.upload(storage.now, null, null, stubDelegate);
196 assertStatusCount(SubmissionsFieldName.CLIENT_FAILURE);
197 }
198
199 public void testUploadDocumentGenerationExceptionSubmissionsFailureCount() throws Exception {
200 client.documentStatus = DocumentStatus.EXCEPTION;
201 client.upload(storage.now, null, null, stubDelegate);
202 assertStatusCount(SubmissionsFieldName.CLIENT_FAILURE);
203 }
204 }

mercurial