@@ -58,129 +58,201 @@ public class MetaDataStoreTest extends CrashlyticsTestCase {
58
58
}
59
59
60
60
private FileStore fileStore ;
61
- private final CrashlyticsWorker worker = new CrashlyticsWorker (TestOnlyExecutors .background ());
62
61
62
+ private CrashlyticsWorker diskWriteWorker ;
63
63
private MetaDataStore storeUnderTest ;
64
64
65
65
@ Override
66
66
public void setUp () throws Exception {
67
67
super .setUp ();
68
68
fileStore = new FileStore (getContext ());
69
69
storeUnderTest = new MetaDataStore (fileStore );
70
+ diskWriteWorker = new CrashlyticsWorker (TestOnlyExecutors .background ());
71
+ }
72
+
73
+ @ Override
74
+ public void tearDown () throws Exception {
75
+ fileStore .deleteAllCrashlyticsFiles ();
70
76
}
71
77
72
78
private UserMetadata metadataWithUserId (String sessionId ) {
73
79
return metadataWithUserId (sessionId , USER_ID );
74
80
}
75
81
76
82
private UserMetadata metadataWithUserId (String sessionId , String userId ) {
77
- UserMetadata metadata = new UserMetadata (sessionId , fileStore , worker );
83
+ UserMetadata metadata = new UserMetadata (sessionId , fileStore , diskWriteWorker );
78
84
metadata .setUserId (userId );
79
85
return metadata ;
80
86
}
81
87
82
- public void testWriteUserData_allFields () {
83
- storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 ).getUserId ());
84
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
88
+ @ Test
89
+ public void testWriteUserData_allFields () throws Exception {
90
+ diskWriteWorker .submit (
91
+ () -> {
92
+ storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 ).getUserId ());
93
+ });
94
+ diskWriteWorker .await ();
95
+ UserMetadata userData =
96
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
85
97
assertEquals (USER_ID , userData .getUserId ());
86
98
}
87
99
88
- public void testWriteUserData_noFields () {
89
- storeUnderTest .writeUserData (
90
- SESSION_ID_1 , new UserMetadata (SESSION_ID_1 , fileStore , null ).getUserId ());
91
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
100
+ @ Test
101
+ public void testWriteUserData_noFields () throws Exception {
102
+ diskWriteWorker .submit (
103
+ () -> {
104
+ storeUnderTest .writeUserData (
105
+ SESSION_ID_1 , new UserMetadata (SESSION_ID_1 , fileStore , null ).getUserId ());
106
+ });
107
+ diskWriteWorker .await ();
108
+ UserMetadata userData =
109
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
92
110
assertNull (userData .getUserId ());
93
111
}
94
112
95
- public void testWriteUserData_singleField () {
96
- storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 ).getUserId ());
97
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
113
+ @ Test
114
+ public void testWriteUserData_singleField () throws Exception {
115
+ diskWriteWorker .submit (
116
+ () -> {
117
+ storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 ).getUserId ());
118
+ });
119
+ diskWriteWorker .await ();
120
+ UserMetadata userData =
121
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
98
122
assertEquals (USER_ID , userData .getUserId ());
99
123
}
100
124
101
- public void testWriteUserData_null () {
102
- storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , null ).getUserId ());
103
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
125
+ @ Test
126
+ public void testWriteUserData_null () throws Exception {
127
+ diskWriteWorker .submit (
128
+ () -> {
129
+ storeUnderTest .writeUserData (
130
+ SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , null ).getUserId ());
131
+ });
132
+ diskWriteWorker .await ();
133
+ UserMetadata userData =
134
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
104
135
assertNull (userData .getUserId ());
105
136
}
106
137
107
- public void testWriteUserData_emptyString () {
108
- storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , "" ).getUserId ());
109
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
138
+ @ Test
139
+ public void testWriteUserData_emptyString () throws Exception {
140
+ diskWriteWorker .submit (
141
+ () -> {
142
+ storeUnderTest .writeUserData (
143
+ SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , "" ).getUserId ());
144
+ });
145
+ diskWriteWorker .await ();
146
+ UserMetadata userData =
147
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
110
148
assertEquals ("" , userData .getUserId ());
111
149
}
112
150
113
- public void testWriteUserData_unicode () {
151
+ @ Test
152
+ public void testWriteUserData_unicode () throws Exception {
114
153
storeUnderTest .writeUserData (
115
154
SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , UNICODE ).getUserId ());
116
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
155
+ diskWriteWorker .await ();
156
+ UserMetadata userData =
157
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
117
158
assertEquals (UNICODE , userData .getUserId ());
118
159
}
119
160
120
- public void testWriteUserData_escaped () {
121
- storeUnderTest .writeUserData (
122
- SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , ESCAPED ).getUserId ());
123
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
161
+ @ Test
162
+ public void testWriteUserData_escaped () throws Exception {
163
+ diskWriteWorker .submit (
164
+ () -> {
165
+ storeUnderTest .writeUserData (
166
+ SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 , ESCAPED ).getUserId ());
167
+ });
168
+ diskWriteWorker .await ();
169
+ UserMetadata userData =
170
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
124
171
assertEquals (ESCAPED .trim (), userData .getUserId ());
125
172
}
126
173
174
+ @ Test
127
175
public void testWriteUserData_readDifferentSession () {
128
176
storeUnderTest .writeUserData (SESSION_ID_1 , metadataWithUserId (SESSION_ID_1 ).getUserId ());
129
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_2 , fileStore , worker );
177
+ UserMetadata userData =
178
+ UserMetadata .loadFromExistingSession (SESSION_ID_2 , fileStore , diskWriteWorker );
130
179
assertNull (userData .getUserId ());
131
180
}
132
181
182
+ @ Test
133
183
public void testReadUserData_corruptData () throws IOException {
134
184
File file = storeUnderTest .getUserDataFileForSession (SESSION_ID_1 );
135
185
try (PrintWriter printWriter = new PrintWriter (file )) {
136
186
printWriter .println ("Matt says hi!" );
137
187
}
138
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
188
+ UserMetadata userData =
189
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
139
190
assertNull (userData .getUserId ());
140
191
assertFalse (file .exists ());
141
192
}
142
193
194
+ @ Test
143
195
public void testReadUserData_emptyData () throws IOException {
144
196
File file = storeUnderTest .getUserDataFileForSession (SESSION_ID_1 );
145
197
file .createNewFile ();
146
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
198
+ UserMetadata userData =
199
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
147
200
assertNull (userData .getUserId ());
148
201
assertFalse (file .exists ());
149
202
}
150
203
204
+ @ Test
151
205
public void testReadUserData_noStoredData () {
152
- UserMetadata userData = UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , worker );
206
+ UserMetadata userData =
207
+ UserMetadata .loadFromExistingSession (SESSION_ID_1 , fileStore , diskWriteWorker );
153
208
assertNull (userData .getUserId ());
154
209
}
155
210
156
211
@ Test
157
- public void testUpdateSessionId_notPersistUserIdToNewSessionIfNoUserIdSet () {
158
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
212
+ public void testUpdateSessionId_notPersistUserIdToNewSessionIfNoUserIdSet () throws Exception {
213
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
159
214
userMetadata .setNewSession (SESSION_ID_2 );
160
- assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .USERDATA_FILENAME ).exists ())
161
- .isFalse ();
215
+ diskWriteWorker .submit (
216
+ () -> {
217
+ assertThat (
218
+ fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .USERDATA_FILENAME ).exists ())
219
+ .isFalse ();
220
+ });
221
+ diskWriteWorker .await ();
162
222
}
163
223
164
224
@ Test
165
- public void testUpdateSessionId_notPersistCustomKeysToNewSessionIfNoCustomKeysSet () {
166
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
225
+ public void testUpdateSessionId_notPersistCustomKeysToNewSessionIfNoCustomKeysSet ()
226
+ throws Exception {
227
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
167
228
userMetadata .setNewSession (SESSION_ID_2 );
168
- assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .KEYDATA_FILENAME ).exists ())
169
- .isFalse ();
229
+ diskWriteWorker .submit (
230
+ () -> {
231
+ assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .KEYDATA_FILENAME ).exists ())
232
+ .isFalse ();
233
+ });
234
+ diskWriteWorker .await ();
170
235
}
171
236
172
237
@ Test
173
- public void testUpdateSessionId_notPersistRolloutsToNewSessionIfNoRolloutsSet () {
174
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
238
+ public void testUpdateSessionId_notPersistRolloutsToNewSessionIfNoRolloutsSet () throws Exception {
239
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
175
240
userMetadata .setNewSession (SESSION_ID_2 );
176
- assertThat (
177
- fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .ROLLOUTS_STATE_FILENAME ).exists ())
178
- .isFalse ();
241
+
242
+ diskWriteWorker .submit (
243
+ () -> {
244
+ assertThat (
245
+ fileStore
246
+ .getSessionFile (SESSION_ID_2 , UserMetadata .ROLLOUTS_STATE_FILENAME )
247
+ .exists ())
248
+ .isFalse ();
249
+ });
250
+ diskWriteWorker .await ();
179
251
}
180
252
181
253
@ Test
182
254
public void testUpdateSessionId_persistCustomKeysToNewSessionIfCustomKeysSet () throws Exception {
183
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
255
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
184
256
final Map <String , String > keys =
185
257
new HashMap <String , String >() {
186
258
{
@@ -191,37 +263,74 @@ public void testUpdateSessionId_persistCustomKeysToNewSessionIfCustomKeysSet() t
191
263
};
192
264
userMetadata .setCustomKeys (keys );
193
265
userMetadata .setNewSession (SESSION_ID_2 );
194
- assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .KEYDATA_FILENAME ).exists ())
195
- .isTrue ();
266
+ diskWriteWorker .submit (
267
+ () -> {
268
+ assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .KEYDATA_FILENAME ).exists ())
269
+ .isTrue ();
270
+ });
271
+ diskWriteWorker .await ();
196
272
197
273
MetaDataStore metaDataStore = new MetaDataStore (fileStore );
198
-
199
- worker .await ();
200
-
201
274
assertThat (metaDataStore .readKeyData (SESSION_ID_2 )).isEqualTo (keys );
202
275
}
203
276
204
277
@ Test
205
- public void testUpdateSessionId_persistUserIdToNewSessionIfUserIdSet () {
278
+ public void testSetSameKeysRaceCondition_preserveLastEntryValue () throws Exception {
279
+ final Map <String , String > keys =
280
+ new HashMap <String , String >() {
281
+ {
282
+ put (KEY_1 , "10000" );
283
+ put (KEY_2 , "20000" );
284
+ }
285
+ };
286
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
287
+ for (int index = 0 ; index <= 10000 ; index ++) {
288
+ userMetadata .setCustomKey (KEY_1 , String .valueOf (index ));
289
+ userMetadata .setCustomKey (KEY_2 , String .valueOf (index * 2 ));
290
+ }
291
+ diskWriteWorker .submit (
292
+ () -> {
293
+ final Map <String , String > readKeys = storeUnderTest .readKeyData (SESSION_ID_1 );
294
+ assertThat (readKeys .get (KEY_1 )).isEqualTo ("10000" );
295
+ assertThat (readKeys .get (KEY_2 )).isEqualTo ("20000" );
296
+ assertEqualMaps (keys , readKeys );
297
+ });
298
+ diskWriteWorker .await ();
299
+ }
300
+
301
+ @ Test
302
+ public void testUpdateSessionId_persistUserIdToNewSessionIfUserIdSet () throws Exception {
206
303
String userId = "ThemisWang" ;
207
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
304
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
208
305
userMetadata .setUserId (userId );
209
306
userMetadata .setNewSession (SESSION_ID_2 );
210
- assertThat (fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .USERDATA_FILENAME ).exists ())
211
- .isTrue ();
307
+
308
+ diskWriteWorker .submit (
309
+ () -> {
310
+ assertThat (
311
+ fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .USERDATA_FILENAME ).exists ())
312
+ .isTrue ();
313
+ });
314
+ diskWriteWorker .await ();
212
315
213
316
MetaDataStore metaDataStore = new MetaDataStore (fileStore );
214
317
assertThat (metaDataStore .readUserId (SESSION_ID_2 )).isEqualTo (userId );
215
318
}
216
319
217
320
@ Test
218
- public void testUpdateSessionId_persistRolloutsToNewSessionIfRolloutsSet () {
219
- UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , worker );
321
+ public void testUpdateSessionId_persistRolloutsToNewSessionIfRolloutsSet () throws Exception {
322
+ UserMetadata userMetadata = new UserMetadata (SESSION_ID_1 , fileStore , diskWriteWorker );
220
323
userMetadata .updateRolloutsState (ROLLOUTS_STATE );
221
324
userMetadata .setNewSession (SESSION_ID_2 );
222
- assertThat (
223
- fileStore .getSessionFile (SESSION_ID_2 , UserMetadata .ROLLOUTS_STATE_FILENAME ).exists ())
224
- .isTrue ();
325
+ diskWriteWorker .submit (
326
+ () -> {
327
+ assertThat (
328
+ fileStore
329
+ .getSessionFile (SESSION_ID_2 , UserMetadata .ROLLOUTS_STATE_FILENAME )
330
+ .exists ())
331
+ .isTrue ();
332
+ });
333
+ diskWriteWorker .await ();
225
334
226
335
MetaDataStore metaDataStore = new MetaDataStore (fileStore );
227
336
assertThat (metaDataStore .readRolloutsState (SESSION_ID_2 )).isEqualTo (ROLLOUTS_STATE );
0 commit comments