@@ -97,7 +97,7 @@ public void testSaveAsyncNotDirty() throws Exception {
9797 ParseFile .State state = new ParseFile .State .Builder ()
9898 .url ("http://example.com" )
9999 .build ();
100- Task <ParseFile .State > task = controller .saveAsync (state , null , null , null , null );
100+ Task <ParseFile .State > task = controller .saveAsync (state , ( byte []) null , null , null , null );
101101 task .waitForCompletion ();
102102
103103 verify (restClient , times (0 )).execute (any (ParseHttpRequest .class ));
@@ -113,15 +113,15 @@ public void testSaveAsyncAlreadyCancelled() throws Exception {
113113
114114 ParseFile .State state = new ParseFile .State .Builder ().build ();
115115 Task <Void > cancellationToken = Task .cancelled ();
116- Task <ParseFile .State > task = controller .saveAsync (state , null , null , null , cancellationToken );
116+ Task <ParseFile .State > task = controller .saveAsync (state , ( byte []) null , null , null , cancellationToken );
117117 task .waitForCompletion ();
118118
119119 verify (restClient , times (0 )).execute (any (ParseHttpRequest .class ));
120120 assertTrue (task .isCancelled ());
121121 }
122122
123123 @ Test
124- public void testSaveAsyncSuccess () throws Exception {
124+ public void testSaveAsyncSuccessWithByteArray () throws Exception {
125125 JSONObject json = new JSONObject ();
126126 json .put ("name" , "new_file_name" );
127127 json .put ("url" , "http://example.com" );
@@ -155,7 +155,43 @@ public void testSaveAsyncSuccess() throws Exception {
155155 }
156156
157157 @ Test
158- public void testSaveAsyncFailure () throws Exception {
158+ public void testSaveAsyncSuccessWithFile () throws Exception {
159+ JSONObject json = new JSONObject ();
160+ json .put ("name" , "new_file_name" );
161+ json .put ("url" , "http://example.com" );
162+ String content = json .toString ();
163+
164+ ParseHttpResponse response = mock (ParseHttpResponse .class );
165+ when (response .getStatusCode ()).thenReturn (200 );
166+ when (response .getContent ()).thenReturn (new ByteArrayInputStream (content .getBytes ()));
167+ when (response .getTotalSize ()).thenReturn ((long ) content .length ());
168+
169+ ParseHttpClient restClient = mock (ParseHttpClient .class );
170+ when (restClient .execute (any (ParseHttpRequest .class ))).thenReturn (response );
171+
172+ File root = temporaryFolder .getRoot ();
173+ ParseFileController controller = new ParseFileController (restClient , root );
174+
175+ File file = new File (root , "test" );
176+ ParseFileUtils .writeStringToFile (file , "content" , "UTF-8" );
177+ ParseFile .State state = new ParseFile .State .Builder ()
178+ .name ("file_name" )
179+ .mimeType ("mime_type" )
180+ .build ();
181+ Task <ParseFile .State > task = controller .saveAsync (state , file , null , null , null );
182+ ParseFile .State result = ParseTaskUtils .wait (task );
183+
184+ verify (restClient , times (1 )).execute (any (ParseHttpRequest .class ));
185+ assertEquals ("new_file_name" , result .name ());
186+ assertEquals ("http://example.com" , result .url ());
187+ File cachedFile = new File (root , "new_file_name" );
188+ assertTrue (cachedFile .exists ());
189+ assertTrue (file .exists ());
190+ assertEquals ("content" , ParseFileUtils .readFileToString (cachedFile , "UTF-8" ));
191+ }
192+
193+ @ Test
194+ public void testSaveAsyncFailureWithByteArray () throws Exception {
159195 // TODO(grantland): Remove once we no longer rely on retry logic.
160196 ParseRequest .setDefaultInitialRetryDelay (1L );
161197
@@ -180,6 +216,34 @@ public void testSaveAsyncFailure() throws Exception {
180216 assertEquals (0 , root .listFiles ().length );
181217 }
182218
219+ @ Test
220+ public void testSaveAsyncFailureWithFile () throws Exception {
221+ // TODO(grantland): Remove once we no longer rely on retry logic.
222+ ParseRequest .setDefaultInitialRetryDelay (1L );
223+
224+ ParseHttpClient restClient = mock (ParseHttpClient .class );
225+ when (restClient .execute (any (ParseHttpRequest .class ))).thenThrow (new IOException ());
226+
227+ File root = temporaryFolder .getRoot ();
228+ ParseFileController controller = new ParseFileController (restClient , root );
229+
230+ File file = temporaryFolder .newFile ("test" );
231+ ParseFile .State state = new ParseFile .State .Builder ()
232+ .build ();
233+ Task <ParseFile .State > task = controller .saveAsync (state , file , null , null , null );
234+ task .waitForCompletion ();
235+
236+ // TODO(grantland): Abstract out command runner so we don't have to account for retries.
237+ verify (restClient , times (5 )).execute (any (ParseHttpRequest .class ));
238+ assertTrue (task .isFaulted ());
239+ Exception error = task .getError ();
240+ assertThat (error , instanceOf (ParseException .class ));
241+ assertEquals (ParseException .CONNECTION_FAILED , ((ParseException ) error ).getCode ());
242+ // Make sure the original file is not deleted and there is no cache file in the folder
243+ assertEquals (1 , root .listFiles ().length );
244+ assertTrue (file .exists ());
245+ }
246+
183247 //endregion
184248
185249 //region testFetchAsync
0 commit comments