Skip to content

Commit ed904f2

Browse files
committed
exception for permission errors
1 parent d14e78b commit ed904f2

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

firebase-ml-modeldownloader/src/main/java/com/google/firebase/ml/modeldownloader/internal/CustomModelDownloadService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ private Task<CustomModel> fetchDownloadDetails(String modelName, HttpURLConnecti
229229
modelName,
230230
httpResponseCode,
231231
"Too many requests to server please wait before trying again.",
232-
FirebaseMlException.INVALID_ARGUMENT);
233-
case HttpURLConnection.HTTP_SERVER_ERROR:
232+
FirebaseMlException.RESOURCE_EXHAUSTED);
233+
case HttpURLConnection.HTTP_INTERNAL_ERROR:
234234
return setAndLogException(
235235
modelName,
236236
httpResponseCode,
@@ -240,6 +240,17 @@ private Task<CustomModel> fetchDownloadDetails(String modelName, HttpURLConnecti
240240
modelName,
241241
errorMessage),
242242
FirebaseMlException.INTERNAL);
243+
case HttpURLConnection.HTTP_UNAUTHORIZED:
244+
case HttpURLConnection.HTTP_FORBIDDEN:
245+
return setAndLogException(
246+
modelName,
247+
httpResponseCode,
248+
String.format(
249+
Locale.getDefault(),
250+
"Issue while fetching model (%s); error message: %s",
251+
modelName,
252+
errorMessage),
253+
FirebaseMlException.PERMISSION_DENIED);
243254
default:
244255
return setAndLogException(
245256
modelName,

firebase-ml-modeldownloader/src/test/java/com/google/firebase/ml/modeldownloader/internal/CustomModelDownloadServiceTest.java

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,89 @@ public void downloadService_badRequest() {
329329
eq(HttpURLConnection.HTTP_BAD_REQUEST));
330330
}
331331

332+
@Test
333+
public void downloadService_forbidden() {
334+
String downloadPath =
335+
String.format(CustomModelDownloadService.DOWNLOAD_MODEL_REGEX, "", PROJECT_ID, MODEL_NAME);
336+
stubFor(
337+
get(urlEqualTo(downloadPath))
338+
.withHeader(
339+
CustomModelDownloadService.INSTALLATIONS_AUTH_TOKEN_HEADER,
340+
equalTo(INSTALLATION_TOKEN))
341+
.withHeader(
342+
CustomModelDownloadService.CONTENT_TYPE,
343+
equalTo(CustomModelDownloadService.APPLICATION_JSON))
344+
.withHeader(CustomModelDownloadService.IF_NONE_MATCH_HEADER_KEY, equalTo(MODEL_HASH))
345+
.willReturn(
346+
aResponse()
347+
.withStatus(HttpURLConnection.HTTP_FORBIDDEN)
348+
.withBody(
349+
"{\"status\":\"PERMISSION_DENIED\",\"message\":\"Request not valid\"}")));
350+
351+
CustomModelDownloadService service =
352+
new CustomModelDownloadService(
353+
installationsApiMock, directExecutor, API_KEY, TEST_ENDPOINT, mockEventLogger);
354+
355+
Task<CustomModel> modelTask = service.getCustomModelDetails(PROJECT_ID, MODEL_NAME, MODEL_HASH);
356+
357+
Assert.assertTrue(modelTask.getException() instanceof FirebaseMlException);
358+
Assert.assertEquals(
359+
((FirebaseMlException) modelTask.getException()).getCode(),
360+
FirebaseMlException.PERMISSION_DENIED);
361+
362+
WireMock.verify(
363+
getRequestedFor(urlEqualTo(downloadPath))
364+
.withHeader(
365+
CustomModelDownloadService.INSTALLATIONS_AUTH_TOKEN_HEADER,
366+
equalTo(INSTALLATION_TOKEN)));
367+
verify(mockEventLogger, times(1))
368+
.logModelInfoRetrieverFailure(
369+
any(),
370+
eq(ErrorCode.MODEL_INFO_DOWNLOAD_UNSUCCESSFUL_HTTP_STATUS),
371+
eq(HttpURLConnection.HTTP_FORBIDDEN));
372+
}
373+
374+
@Test
375+
public void downloadService_internalError() {
376+
String downloadPath =
377+
String.format(CustomModelDownloadService.DOWNLOAD_MODEL_REGEX, "", PROJECT_ID, MODEL_NAME);
378+
stubFor(
379+
get(urlEqualTo(downloadPath))
380+
.withHeader(
381+
CustomModelDownloadService.INSTALLATIONS_AUTH_TOKEN_HEADER,
382+
equalTo(INSTALLATION_TOKEN))
383+
.withHeader(
384+
CustomModelDownloadService.CONTENT_TYPE,
385+
equalTo(CustomModelDownloadService.APPLICATION_JSON))
386+
.withHeader(CustomModelDownloadService.IF_NONE_MATCH_HEADER_KEY, equalTo(MODEL_HASH))
387+
.willReturn(
388+
aResponse()
389+
.withStatus(HttpURLConnection.HTTP_INTERNAL_ERROR)
390+
.withBody(
391+
"{\"status\":\"INTERNAL\",\"message\":\"Request cannot reach server\"}")));
392+
393+
CustomModelDownloadService service =
394+
new CustomModelDownloadService(
395+
installationsApiMock, directExecutor, API_KEY, TEST_ENDPOINT, mockEventLogger);
396+
397+
Task<CustomModel> modelTask = service.getCustomModelDetails(PROJECT_ID, MODEL_NAME, MODEL_HASH);
398+
399+
Assert.assertTrue(modelTask.getException() instanceof FirebaseMlException);
400+
Assert.assertEquals(
401+
((FirebaseMlException) modelTask.getException()).getCode(), FirebaseMlException.INTERNAL);
402+
403+
WireMock.verify(
404+
getRequestedFor(urlEqualTo(downloadPath))
405+
.withHeader(
406+
CustomModelDownloadService.INSTALLATIONS_AUTH_TOKEN_HEADER,
407+
equalTo(INSTALLATION_TOKEN)));
408+
verify(mockEventLogger, times(1))
409+
.logModelInfoRetrieverFailure(
410+
any(),
411+
eq(ErrorCode.MODEL_INFO_DOWNLOAD_UNSUCCESSFUL_HTTP_STATUS),
412+
eq(HttpURLConnection.HTTP_INTERNAL_ERROR));
413+
}
414+
332415
@Test
333416
public void downloadService_tooManyRequest() {
334417
String downloadPath =
@@ -357,7 +440,7 @@ public void downloadService_tooManyRequest() {
357440
Assert.assertTrue(modelTask.getException() instanceof FirebaseMlException);
358441
Assert.assertEquals(
359442
((FirebaseMlException) modelTask.getException()).getCode(),
360-
FirebaseMlException.INVALID_ARGUMENT);
443+
FirebaseMlException.RESOURCE_EXHAUSTED);
361444

362445
WireMock.verify(
363446
getRequestedFor(urlEqualTo(downloadPath))
@@ -396,7 +479,8 @@ public void downloadService_authenticationIssue() {
396479

397480
Assert.assertTrue(modelTask.getException() instanceof FirebaseMlException);
398481
Assert.assertEquals(
399-
((FirebaseMlException) modelTask.getException()).getCode(), FirebaseMlException.INTERNAL);
482+
((FirebaseMlException) modelTask.getException()).getCode(),
483+
FirebaseMlException.PERMISSION_DENIED);
400484
Assert.assertTrue(
401485
modelTask
402486
.getException()

0 commit comments

Comments
 (0)