diff --git a/src/main/java/it/inaf/ia2/transfer/controller/PutFileController.java b/src/main/java/it/inaf/ia2/transfer/controller/PutFileController.java index 2bc9e79179ddc900a3c00df48d5574ce1f257d85..f31525d6daf55db7789666984f20f8837ec73f52 100644 --- a/src/main/java/it/inaf/ia2/transfer/controller/PutFileController.java +++ b/src/main/java/it/inaf/ia2/transfer/controller/PutFileController.java @@ -14,6 +14,8 @@ import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.xml.bind.DatatypeConverter; import net.ivoa.xml.uws.v1.ExecutionPhase; @@ -176,6 +178,14 @@ public class PutFileController extends FileController { nameWithoutExtension = fileName; } + Pattern pattern = Pattern.compile("(.*?)-(\\d+)"); + Matcher matcher = pattern.matcher(nameWithoutExtension); + if (matcher.matches()) { + nameWithoutExtension = matcher.group(1); + int fileIndex = Integer.parseInt(matcher.group(2)); + index = fileIndex + 1; + } + String newName = nameWithoutExtension + "-" + index; if (extension != null) { newName += "." + extension; diff --git a/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java b/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java index a240884f355f8c37695e1c303c1d52384596054b..03f8919e33011e8f88b11a0e71e5a3e136c3d573 100644 --- a/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java +++ b/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java @@ -11,8 +11,10 @@ import java.util.Optional; import java.util.UUID; import net.ivoa.xml.uws.v1.ExecutionPhase; import org.assertj.core.util.Files; +import org.junit.jupiter.api.AfterAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,6 +34,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.RequestPostProcessor; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.springframework.util.FileSystemUtils; @SpringBootTest @AutoConfigureMockMvc @@ -39,16 +42,28 @@ public class PutFileControllerTest { @MockBean private FileDAO fileDao; - + @MockBean private JobDAO jobDAO; - + @MockBean private ListOfFilesDAO listOfFilesDAO; @Autowired private MockMvc mockMvc; - + + private static File temporaryDirectory; + + @BeforeAll + public static void setUp() { + temporaryDirectory = Files.newTemporaryFolder(); + } + + @AfterAll + public static void tearDown() { + FileSystemUtils.deleteRecursively(temporaryDirectory); + } + @Test public void putGenericFile() throws Exception { @@ -62,18 +77,26 @@ public class PutFileControllerTest { .andDo(print()) .andExpect(status().isOk()); - File file = Path.of("/tmp", randomFileName).toFile(); + File file = Path.of(getTestFilePath(randomFileName)).toFile(); assertTrue(file.exists()); assertEquals("content", Files.contentOf(file, StandardCharsets.UTF_8)); - assertTrue(file.delete()); + assertTrue(file.delete()); } - + @Test - public void putGenericFileWithNameConflict() throws Exception { + public void putGenericFileWithNameConflictExtension() throws Exception { + putGenericFileWithNameConflict("test.txt", "test-1.txt", "test-2.txt"); + } + + @Test + public void putGenericFileWithNameConflictNoExtension() throws Exception { + putGenericFileWithNameConflict("test", "test-1", "test-2"); + } - String fileName = "pippoFile"; - createBaseFileInfo(fileName); + public void putGenericFileWithNameConflict(String name1, String name2, String name3) throws Exception { + + createBaseFileInfo(name1); MockMultipartFile fakeFile = new MockMultipartFile("file", "test.txt", "text/plain", "content".getBytes()); @@ -82,29 +105,41 @@ public class PutFileControllerTest { .andDo(print()) .andExpect(status().isOk()); - File file = Path.of("/tmp", fileName).toFile(); + File file = Path.of(getTestFilePath(name1)).toFile(); assertTrue(file.exists()); assertEquals("content", Files.contentOf(file, StandardCharsets.UTF_8)); - + MockMultipartFile fakeFile2 = new MockMultipartFile("file", "test.txt", "text/plain", "content2".getBytes()); - + mockMvc.perform(putMultipart("/path/to/test.txt") .file(fakeFile2)) .andDo(print()) .andExpect(status().isOk()); - - File file2 = Path.of("/tmp", fileName+"-1").toFile(); - assertTrue(file.exists()); + + File file2 = Path.of(getTestFilePath(name2)).toFile(); + assertTrue(file2.exists()); assertEquals("content2", Files.contentOf(file2, StandardCharsets.UTF_8)); + + MockMultipartFile fakeFile3 = new MockMultipartFile("file", "test.txt", "text/plain", "content3".getBytes()); + + mockMvc.perform(putMultipart("/path/to/test.txt") + .file(fakeFile3)) + .andDo(print()) + .andExpect(status().isOk()); + + File file3 = Path.of(getTestFilePath(name3)).toFile(); + assertTrue(file3.exists()); + assertEquals("content3", Files.contentOf(file3, StandardCharsets.UTF_8)); + assertTrue(file.delete()); assertTrue(file2.delete()); + assertTrue(file3.delete()); } - @Test public void putGenericFileWithJobId() throws Exception { - + when(jobDAO.isJobExisting("pippo10")).thenReturn(false); when(jobDAO.isJobExisting("pippo5")).thenReturn(true); @@ -112,27 +147,27 @@ public class PutFileControllerTest { createBaseFileInfo(randomFileName); MockMultipartFile fakeFile = new MockMultipartFile("file", "test.txt", "text/plain", "content".getBytes()); - + // Try with invalid jobid mockMvc.perform(putMultipart("/path/to/test.txt") .file(fakeFile).param("jobid", "pippo10")) .andDo(print()) .andExpect(status().is4xxClientError()); - + verify(jobDAO, times(1)).isJobExisting(eq("pippo10")); - + // Retry with valid jobid mockMvc.perform(putMultipart("/path/to/test.txt") .file(fakeFile).param("jobid", "pippo5")) .andDo(print()) .andExpect(status().is2xxSuccessful()); - + verify(jobDAO, times(1)).isJobExisting(eq("pippo5")); verify(jobDAO, times(1)).updateJobPhase(eq(ExecutionPhase.COMPLETED), any()); - - File file = Path.of("/tmp", randomFileName).toFile(); - assertTrue(file.exists()); + File file = Path.of(getTestFilePath(randomFileName)).toFile(); + + assertTrue(file.exists()); assertEquals("content", Files.contentOf(file, StandardCharsets.UTF_8)); assertTrue(file.delete()); } @@ -158,7 +193,7 @@ public class PutFileControllerTest { private FileInfo createBaseFileInfo(String fileName) { FileInfo fileInfo = new FileInfo(); - fileInfo.setOsPath("/tmp/" + fileName); + fileInfo.setOsPath(getTestFilePath(fileName)); fileInfo.setIsPublic(false); when(fileDao.getFileInfo(any())).thenReturn(Optional.of(fileInfo)); @@ -166,6 +201,10 @@ public class PutFileControllerTest { return fileInfo; } + private String getTestFilePath(String fileName) { + return temporaryDirectory.toPath().resolve(fileName).toFile().getAbsolutePath(); + } + private MockMultipartHttpServletRequestBuilder putMultipart(String uri) { MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.multipart(uri); builder.with(new RequestPostProcessor() {