Skip to content

Commit

Permalink
Merge pull request getodk#4357 from seadowg/fix-redownload
Browse files Browse the repository at this point in the history
Make sure redownloading the same form doesn't break anything
  • Loading branch information
lognaturel authored Jan 25, 2021
2 parents 8eb307d + d056b03 commit 35a2534
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,16 @@ boolean installEverything(String tempMediaPath, FileResult fileResult, Map<Strin
UriResult uriResult = null;

try {
// Copy form to forms dir
File formFile = new File(formsDirPath, fileResult.file.getName());
FileUtils.copyFile(fileResult.file, formFile);
File formFile;

if (fileResult.isNew()) {
// Copy form to forms dir
formFile = new File(formsDirPath, fileResult.file.getName());
FileUtils.copyFile(fileResult.file, formFile);
} else {
formFile = fileResult.file;
}


// Save form in database
uriResult = findExistingOrCreateNewUri(formFile, parsedFields, formsDirPath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,50 @@ public void whenFormIsSoftDeleted_unDeletesForm() throws Exception {
assertThat(formsRepository.get(1L).isDeleted(), is(false));
}

@Test
public void whenFormAlreadyDownloaded_formRemainsOnDevice() throws Exception {
String xform = createXForm("id", "version");
ServerFormDetails serverFormDetails = new ServerFormDetails(
"Form",
"http://downloadUrl",
"http://manifestUrl",
"id",
"version",
"md5:" + FileUtils.getMd5Hash(new ByteArrayInputStream(xform.getBytes())),
true,
false,
null);

FormSource formSource = mock(FormSource.class);
when(formSource.fetchForm("http://downloadUrl")).thenReturn(new ByteArrayInputStream(xform.getBytes()));

ServerFormDownloader downloader = new ServerFormDownloader(formSource, formsRepository, cacheDir, formsDir.getAbsolutePath(), new FormMetadataParser(ReferenceManager.instance()), mock(Analytics.class));

// Initial download
downloader.downloadForm(serverFormDetails, null, null);

ServerFormDetails serverFormDetailsAlreadyOnDevice = new ServerFormDetails(
"Form",
"http://downloadUrl",
"http://manifestUrl",
"id",
"version",
"md5:" + FileUtils.getMd5Hash(new ByteArrayInputStream(xform.getBytes())),
false,
false,
null);

when(formSource.fetchForm("http://downloadUrl")).thenReturn(new ByteArrayInputStream(xform.getBytes()));
downloader.downloadForm(serverFormDetailsAlreadyOnDevice, null, null);

List<Form> allForms = formsRepository.getAll();
assertThat(allForms.size(), is(1));

Form form = allForms.get(0);
File formFile = new File(getAbsoluteFilePath(formsDir.getAbsolutePath(), form.getFormFilePath()));
assertThat(new String(read(formFile)), is(xform));
}

@Test
public void whenFormAlreadyDownloaded_andFormHasNewMediaFiles_andMediaFetchFails_throwsFormDownloadException() throws Exception {
String xform = createXForm("id", "version");
Expand All @@ -384,6 +428,8 @@ public void whenFormAlreadyDownloaded_andFormHasNewMediaFiles_andMediaFetchFails
when(formSource.fetchMediaFile("http://file1")).thenReturn(new ByteArrayInputStream("contents".getBytes()));

ServerFormDownloader downloader = new ServerFormDownloader(formSource, formsRepository, cacheDir, formsDir.getAbsolutePath(), new FormMetadataParser(ReferenceManager.instance()), mock(Analytics.class));

// Initial download
downloader.downloadForm(serverFormDetails, null, null);

try {
Expand Down

0 comments on commit 35a2534

Please sign in to comment.