@Test public void testGetChangeRequestNotFound() { EasyMock.reset(batchMock); Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); batchMock.addGetChangeRequest( EasyMock.eq(ZONE_NAME), EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); EasyMock.replay(batchMock); DnsBatchResult<ChangeRequest> batchResult = dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId()); assertEquals(0, capturedOptions.getValue().size()); RpcBatch.Callback<Change> capturedCallback = callback.getValue(); GoogleJsonError error = new GoogleJsonError(); GoogleJsonError.ErrorInfo errorInfo = new GoogleJsonError.ErrorInfo(); errorInfo.setReason("reason"); errorInfo.setLocation("entity.parameters.changeId"); error.setCode(404); error.setErrors(ImmutableList.of(errorInfo)); capturedCallback.onFailure(error); assertNull(batchResult.get()); }
/** A helper that generates the error JSON payload that Google APIs produce. */ private static GoogleJsonErrorContainer errorWithReasonAndStatus(String reason, int status) { ErrorInfo info = new ErrorInfo(); info.setReason(reason); info.setDomain("global"); // GoogleJsonError contains one or more ErrorInfo objects; our utiities read the first one. GoogleJsonError error = new GoogleJsonError(); error.setErrors(ImmutableList.of(info)); error.setCode(status); error.setMessage(reason); // The actual JSON response is an error container. GoogleJsonErrorContainer container = new GoogleJsonErrorContainer(); container.setError(error); return container; }
@Override public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(reason); errorInfo.setMessage(message); errorInfo.setFactory(jsonFactory); GenericJson error = new GenericJson(); error.set("code", status); error.set("errors", Arrays.asList(errorInfo)); error.setFactory(jsonFactory); GenericJson errorResponse = new GenericJson(); errorResponse.set("error", error); errorResponse.setFactory(jsonFactory); return new MockLowLevelHttpRequest() .setResponse( new MockLowLevelHttpResponse() .setContent(errorResponse.toPrettyString()) .setContentType(Json.MEDIA_TYPE) .setStatusCode(status)); } };
@Before public void setUp() throws Exception { accessDenied = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_FORBIDDEN, "Forbidden", "Forbidden"); statusOk = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_OK, "A reason", "ok"); notFound = googleJsonResponseException( HttpStatusCodes.STATUS_CODE_NOT_FOUND, "Not found", "Not found"); badRange = googleJsonResponseException( ApiErrorExtractor.STATUS_CODE_RANGE_NOT_SATISFIABLE, "Bad range", "Bad range"); alreadyExists = googleJsonResponseException( 409, "409", "409"); resourceNotReady = googleJsonResponseException( 400, ApiErrorExtractor.RESOURCE_NOT_READY_REASON_CODE, "Resource not ready"); // This works because googleJsonResponseException takes final ErrorInfo ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(ApiErrorExtractor.RATE_LIMITED_REASON_CODE); notRateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); errorInfo.setDomain(ApiErrorExtractor.USAGE_LIMITS_DOMAIN); rateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); errorInfo.setDomain(ApiErrorExtractor.GLOBAL_DOMAIN); bigqueryRateLimited = googleJsonResponseException(POSSIBLE_RATE_LIMIT, errorInfo, ""); }
@Override public LowLevelHttpRequest buildRequest(String method, String url) throws IOException { ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(reason); errorInfo.setMessage(message); errorInfo.setFactory(jsonFactory); GenericJson error = new GenericJson(); error.set("code", status); error.set("errors", Arrays.asList(errorInfo)); error.setFactory(jsonFactory); GenericJson errorResponse = new GenericJson(); errorResponse.set("error", error); errorResponse.setFactory(jsonFactory); return new MockLowLevelHttpRequest() .setResponse( new MockLowLevelHttpResponse() .setContent(errorResponse.toPrettyString()) .setContentType(Json.MEDIA_TYPE) .setStatusCode(status)); } };
/** * Builds a fake GoogleJsonResponseException for testing API error handling. */ private static GoogleJsonResponseException googleJsonResponseException( int httpStatus, String reason, String message, String httpStatusString) throws IOException { ErrorInfo errorInfo = new ErrorInfo(); errorInfo.setReason(reason); errorInfo.setMessage(message); return googleJsonResponseException(httpStatus, errorInfo, httpStatusString); }