@@ -61,6 +61,7 @@ public class FirebaseModelDownloaderTest {
61
61
private static final String MODEL_NAME = "MODEL_NAME_1" ;
62
62
private static final String MODEL_URL = "https://project.firebase.com/modelName/23424.jpg" ;
63
63
private static final long URL_EXPIRATION = 604800L ;
64
+ private static final long DOWNLOAD_ID = 99 ;
64
65
65
66
private static final CustomModelDownloadConditions DEFAULT_DOWNLOAD_CONDITIONS =
66
67
new CustomModelDownloadConditions .Builder ().build ();
@@ -73,6 +74,8 @@ public class FirebaseModelDownloaderTest {
73
74
private final CustomModel CUSTOM_MODEL = new CustomModel (MODEL_NAME , MODEL_HASH , 100 , 0 );
74
75
private final CustomModel UPDATE_CUSTOM_MODEL_URL =
75
76
new CustomModel (MODEL_NAME , UPDATE_MODEL_HASH , 100 , MODEL_URL , URL_EXPIRATION + 10L );
77
+ private final CustomModel UPDATE_CUSTOM_MODEL_DOWNLOADING =
78
+ new CustomModel (MODEL_NAME , UPDATE_MODEL_HASH , 100 , DOWNLOAD_ID );
76
79
private CustomModel customModelUploaded ;
77
80
private CustomModel customModelLoaded ;
78
81
@@ -262,6 +265,31 @@ public void getModel_latestModel_localExists_UpdateFound() throws Exception {
262
265
assertEquals (customModel , customModelUploaded );
263
266
}
264
267
268
+ @ Test
269
+ public void getModel_latestModel_localExists_DownloadInProgress () throws Exception {
270
+ CustomModel customModelLoadedWithDownload =
271
+ new CustomModel (MODEL_NAME , MODEL_HASH , 100 , 99 , expectedDestinationFolder + "/0" );
272
+
273
+ when (mockPrefs .getCustomModelDetails (eq (MODEL_NAME ))).thenReturn (customModelLoadedWithDownload );
274
+ when (mockPrefs .getDownloadingCustomModelDetails (eq (MODEL_NAME )))
275
+ .thenReturn (UPDATE_CUSTOM_MODEL_DOWNLOADING );
276
+
277
+ when (mockModelDownloadService .getCustomModelDetails (
278
+ eq (TEST_PROJECT_ID ), eq (MODEL_NAME ), eq (MODEL_HASH )))
279
+ .thenReturn (Tasks .forResult (UPDATE_CUSTOM_MODEL_URL ));
280
+
281
+ TestOnCompleteListener <CustomModel > onCompleteListener = new TestOnCompleteListener <>();
282
+ Task <CustomModel > task =
283
+ firebaseModelDownloader .getModel (
284
+ MODEL_NAME , DownloadType .LATEST_MODEL , DEFAULT_DOWNLOAD_CONDITIONS );
285
+ task .addOnCompleteListener (executor , onCompleteListener );
286
+ CustomModel customModel = onCompleteListener .await ();
287
+
288
+ verify (mockPrefs , times (2 )).getCustomModelDetails (eq (MODEL_NAME ));
289
+ assertThat (task .isComplete ()).isTrue ();
290
+ assertEquals (customModel , UPDATE_CUSTOM_MODEL_DOWNLOADING );
291
+ }
292
+
265
293
@ Test
266
294
public void getModel_latestModel_noLocalModel () throws Exception {
267
295
when (mockPrefs .getCustomModelDetails (eq (MODEL_NAME )))
@@ -459,6 +487,58 @@ public void getModel_local_noLocalModel() throws Exception {
459
487
assertEquals (customModel , CUSTOM_MODEL );
460
488
}
461
489
490
+ @ Test
491
+ public void getModel_local_noLocalModel_urlRetry () throws Exception {
492
+ when (mockPrefs .getCustomModelDetails (eq (MODEL_NAME ))).thenReturn (null ).thenReturn (CUSTOM_MODEL );
493
+ when (mockModelDownloadService .getCustomModelDetails (
494
+ eq (TEST_PROJECT_ID ), eq (MODEL_NAME ), eq (null )))
495
+ .thenReturn (Tasks .forResult (CUSTOM_MODEL ));
496
+ when (mockFileDownloadService .download (any (), eq (DOWNLOAD_CONDITIONS )))
497
+ .thenReturn (Tasks .forException (new Exception ("Retry: Expired URL" )))
498
+ .thenReturn (Tasks .forResult (null ));
499
+ when (mockFileDownloadService .loadNewlyDownloadedModelFile (eq (customModelUploaded )))
500
+ .thenReturn (firstDeviceModelFile );
501
+ TestOnCompleteListener <CustomModel > onCompleteListener = new TestOnCompleteListener <>();
502
+ Task <CustomModel > task =
503
+ firebaseModelDownloader .getModel (MODEL_NAME , DownloadType .LOCAL_MODEL , DOWNLOAD_CONDITIONS );
504
+ task .addOnCompleteListener (executor , onCompleteListener );
505
+ CustomModel customModel = onCompleteListener .await ();
506
+
507
+ verify (mockPrefs , times (3 )).getCustomModelDetails (eq (MODEL_NAME ));
508
+ verify (mockFileDownloadService , times (2 )).download (any (), eq (DOWNLOAD_CONDITIONS ));
509
+ assertThat (task .isComplete ()).isTrue ();
510
+ assertEquals (customModel , CUSTOM_MODEL );
511
+ }
512
+
513
+ @ Test
514
+ public void getModel_local_noLocalModel_urlRetry_maxTries () throws Exception {
515
+ when (mockPrefs .getCustomModelDetails (eq (MODEL_NAME )))
516
+ .thenReturn (null )
517
+ .thenReturn (null )
518
+ .thenReturn (CUSTOM_MODEL );
519
+ when (mockModelDownloadService .getCustomModelDetails (
520
+ eq (TEST_PROJECT_ID ), eq (MODEL_NAME ), eq (null )))
521
+ .thenReturn (Tasks .forResult (CUSTOM_MODEL ));
522
+ when (mockFileDownloadService .download (any (), eq (DOWNLOAD_CONDITIONS )))
523
+ .thenReturn (Tasks .forException (new Exception ("Retry: Expired URL" )));
524
+ TestOnCompleteListener <CustomModel > onCompleteListener = new TestOnCompleteListener <>();
525
+ Task <CustomModel > task =
526
+ firebaseModelDownloader .getModel (MODEL_NAME , DownloadType .LOCAL_MODEL , DOWNLOAD_CONDITIONS );
527
+ task .addOnCompleteListener (executor , onCompleteListener );
528
+ try {
529
+ onCompleteListener .await ();
530
+ } catch (Exception ex ) {
531
+ assertThat (ex .getMessage ().contains ("download failed" )).isTrue ();
532
+ assertThat (ex .getMessage ().contains ("Too many attempts" )).isTrue ();
533
+ }
534
+
535
+ verify (mockPrefs , times (2 )).getCustomModelDetails (eq (MODEL_NAME ));
536
+ verify (mockFileDownloadService , times (3 )).download (any (), eq (DOWNLOAD_CONDITIONS ));
537
+ verify (mockFileDownloadService , never ()).loadNewlyDownloadedModelFile (any ());
538
+ assertThat (task .isComplete ()).isTrue ();
539
+ assertThat (task .isSuccessful ()).isFalse ();
540
+ }
541
+
462
542
@ Test
463
543
public void getModel_local_noLocalModel_error () throws Exception {
464
544
when (mockPrefs .getCustomModelDetails (eq (MODEL_NAME )))
0 commit comments