diff --git a/src/test/java/fr/progilone/pgcn/service/storage/BinaryManagerTest.java b/src/test/java/fr/progilone/pgcn/service/storage/BinaryManagerTest.java index 3aa1904e..47848a96 100644 --- a/src/test/java/fr/progilone/pgcn/service/storage/BinaryManagerTest.java +++ b/src/test/java/fr/progilone/pgcn/service/storage/BinaryManagerTest.java @@ -1,483 +1,484 @@ -package fr.progilone.pgcn.service.storage; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -import fr.progilone.pgcn.domain.administration.viewsformat.ViewsFormatConfiguration; -import fr.progilone.pgcn.domain.document.DigitalDocument; -import fr.progilone.pgcn.domain.document.DocPage; -import fr.progilone.pgcn.domain.document.DocUnit; -import fr.progilone.pgcn.domain.lot.Lot; -import fr.progilone.pgcn.domain.storage.StoredFile; -import fr.progilone.pgcn.domain.storage.StoredFile.StoredFileType; -import fr.progilone.pgcn.exception.PgcnTechnicalException; -import fr.progilone.pgcn.repository.storage.BinaryRepository; -import fr.progilone.pgcn.repository.user.UserRepository; -import fr.progilone.pgcn.service.administration.viewsformat.ViewsFormatConfigurationService; -import fr.progilone.pgcn.service.util.DefaultFileFormats; -import fr.progilone.pgcn.service.util.DeliveryProgressService; -import fr.progilone.pgcn.service.util.ImageUtils; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; -import javax.imageio.ImageIO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; - -@ExtendWith(MockitoExtension.class) -public class BinaryManagerTest { - - @InjectMocks - private BinaryStorageManager bm; - - @Mock - private BinaryRepository binaryRepository; - - @Mock - private ImageDispatcherService imageDispatcherService; - - @Mock - private ImageMagickService imageMagickService; - - @Mock - private DeliveryProgressService delivProgressService; - - @Mock - private ViewsFormatConfigurationService formatConfigurationService; - - @Mock - private UserRepository userRepository; - - @Autowired - DefaultFileFormats defaultFileFormats; - - private static final ExecutorService executorService = Executors.newCachedThreadPool(); - - private static final String masterTestFilePage1Path = "src/test/resources/storage/test.jpg"; - private static final String masterTestFilePage2Path = "src/test/resources/storage/test2.jpg"; - private static final String ID_DD = "5c8f60456aefba845c8875e46"; - private static final String ID_PAGE1 = "ba45c8f60456a672e003a875e469d0eb"; - private static final String ID_PAGE1_DELETE = "a3fcd4-3298e-784f12c-003a875e46-9d0eb"; - private static final String ID_PAGE1_DELETE2 = "48ecd4-3298e-784f12c-00c3675e46-a8cf4"; - private static final String ID_PAGE2 = "efba845c8f546045e003a846649d0eb"; - - private static final String FAKE_LIB_ID = "libId";; - - @BeforeEach - public void setUp() { - try { - bm.initialize("C://Temp/bmTestPGCN/", 3, "MD5", new String[] {FAKE_LIB_ID}); - } catch (final IOException e) { - fail(e.getMessage()); - } - } - - @Test - public void assertFilesLength() { - final File filePage1 = new File(masterTestFilePage1Path); - if (filePage1 == null || !filePage1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - final File filePage2 = new File(masterTestFilePage2Path); - if (filePage2 == null || !filePage2.exists()) { - fail("Unable to load " + masterTestFilePage2Path); - } - assertNotEquals(filePage2.length(), filePage1.length()); - } - - /** - * Test core process - */ - @Test - public void storeAndRetrieve() { - // create main digital doc - final DigitalDocument dd = new DigitalDocument(); - dd.setIdentifier(ID_DD); - - // for each page (1 min, n max) - final DocPage page1 = createDocPage(ID_PAGE1, dd); - final File filePage1 = new File(masterTestFilePage1Path); - if (filePage1 == null || !filePage1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - final DocPage page2 = createDocPage(ID_PAGE2, dd); - final File filePage2 = new File(masterTestFilePage2Path); - if (filePage2 == null || !filePage2.exists()) { - fail("Unable to load " + masterTestFilePage2Path); - } - dd.addPage(page1); - dd.addPage(page2); - - // Store - // Handle repository - final Map generated = new HashMap<>(); - when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { - final StoredFile response = (StoredFile) i.getArguments()[0]; - if (response.getIdentifier() != null) { - return generated.get(response.getIdentifier()); - } - response.setIdentifier(randomIdentifier()); - generated.put(response.getIdentifier(), response); - return response; - }); - when(binaryRepository.findById(any())).thenAnswer(i -> { - final String identifier = (String) i.getArguments()[0]; - return Optional.of(generated.get(identifier)); - }); - - try { - when(imageMagickService.getMetadatasOfFile(any(File.class), eq(false))).thenReturn(Optional.empty()); - } catch (final PgcnTechnicalException e) { - // nothing - } - when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); - - final StoredFile storedPage1 = bm.createFromFileForPage(page1, filePage1, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); - bm.createFromFileForPage(page2, filePage2, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); - - // Retrieve - // Check from storedFile - final File retrievedMaster1 = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); - assertNotNull(retrievedMaster1, "Stored file can't be find for master 1"); - assertEquals(retrievedMaster1.length(), filePage1.length()); - - // Check with control - final Binary binaryMaster1 = bm.getBinary(storedPage1, FAKE_LIB_ID); - assertEquals(binaryMaster1.getLength(), filePage1.length()); - - // Check From Digital Document - dd.getPages().stream().forEach(page -> { - page.getFiles().stream().forEach(file -> { - // Master check - if (StoredFileType.MASTER.equals(file.getType())) { - if (file.getFilename().contains("2")) { - final File retrievedMaster2Test2 = bm.getFileForStoredFile(file, FAKE_LIB_ID); - assertNotNull(retrievedMaster2Test2, "Stored file can't be find for master 2 in test 2"); - assertEquals(retrievedMaster2Test2.length(), filePage2.length()); - } else { - final File retrievedMaster1Test2 = bm.getFileForStoredFile(file, FAKE_LIB_ID); - assertNotNull(retrievedMaster1Test2, "Stored file can't be find for master 1 in test 2"); - assertEquals(retrievedMaster1Test2.length(), filePage1.length()); - } - } - }); - }); - } - - /** - * Check multiple derived handle (based on format) - */ - @Test - public void storeAndRetriveMultipleDerived() { - // create main digital doc - final DigitalDocument dd = new DigitalDocument(); - dd.setIdentifier(ID_DD); - - // format de fichiers - final ViewsFormatConfiguration.FileFormat format1 = ViewsFormatConfiguration.FileFormat.VIEW; - final ViewsFormatConfiguration.FileFormat format2 = ViewsFormatConfiguration.FileFormat.VIEW; - - final DocPage page1 = createDocPage(ID_PAGE1, dd); - final File fileDerived1 = new File(masterTestFilePage1Path); - if (fileDerived1 == null || !fileDerived1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - final File fileDerived2 = new File(masterTestFilePage2Path); - if (fileDerived2 == null || !fileDerived2.exists()) { - fail("Unable to load " + masterTestFilePage2Path); - } - - dd.addPage(page1); - - // Handle repository - final Map generated = new HashMap<>(); - when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { - final StoredFile response = (StoredFile) i.getArguments()[0]; - if (response.getIdentifier() != null) { - return generated.get(response.getIdentifier()); - } - response.setIdentifier(randomIdentifier()); - generated.put(response.getIdentifier(), response); - return response; - }); - when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { - final String identifier = (String) i.getArguments()[0]; - return Optional.of(generated.get(identifier)); - }); - when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); - final StoredFile storedPage1Derived1 = bm.createFromFileForPage(page1, fileDerived1, StoredFileType.DERIVED, format1, Optional.empty(), FAKE_LIB_ID); - final StoredFile storedPage1Derived2 = bm.createFromFileForPage(page1, fileDerived2, StoredFileType.DERIVED, format2, Optional.empty(), FAKE_LIB_ID); - - // Check from storedFile - final File retrievedDerived1 = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); - assertNotNull(retrievedDerived1, "Stored file can't be find for derived 1"); - assertEquals(retrievedDerived1.length(), fileDerived1.length()); - - final File retrievedDerived2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); - assertNotNull(retrievedDerived2, "Stored file can't be find for derived 2"); - assertEquals(retrievedDerived2.length(), fileDerived2.length()); - } - - @Test - public void generateDerivedThumbnailForMaster() throws IOException, InterruptedException, ExecutionException { - - // create main digital doc - final DigitalDocument dd = new DigitalDocument(); - dd.setIdentifier(ID_DD); - - final DocPage page1 = createDocPage(ID_PAGE1, dd); - final File filePage1 = new File(masterTestFilePage1Path); - if (filePage1 == null || !filePage1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - dd.addPage(page1); - - // Store - // Handle repository - final Map generated = new HashMap<>(); - when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { - final StoredFile response = (StoredFile) i.getArguments()[0]; - if (response.getIdentifier() != null) { - return generated.get(response.getIdentifier()); - } - response.setIdentifier(randomIdentifier()); - generated.put(response.getIdentifier(), response); - return response; - }); - when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { - final String identifier = (String) i.getArguments()[0]; - return Optional.of(generated.get(identifier)); - }); - when(imageDispatcherService.createThumbnailDerived(any(String.class), - any(File.class), - any(File.class), - any(ViewsFormatConfiguration.FileFormat.class), - any(ViewsFormatConfiguration.class), - any(Long[].class))).then(i -> { - ImageUtils.createThumbnail((File) i.getArguments()[1], - (File) i.getArguments()[2], - (int) ((ViewsFormatConfiguration) i.getArguments()[4]).getWidthByFormat((ViewsFormatConfiguration.FileFormat) i.getArguments()[3]), - (int) ((ViewsFormatConfiguration) i.getArguments()[4]).getHeightByFormat((ViewsFormatConfiguration.FileFormat) i.getArguments()[3])); - return true; - }); - when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); - try { - when(imageMagickService.getMetadatasOfFile(any(File.class), eq(false))).thenReturn(Optional.empty()); - } catch (final PgcnTechnicalException e) { - // nothing - } - final StoredFile master = bm.createFromFileForPage(page1, filePage1, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); - // Check from storedFile - final File retrievedMaster1 = bm.getFileForStoredFile(master, FAKE_LIB_ID); - assertNotNull(retrievedMaster1, "Stored file can't be find for master 1"); - assertEquals(retrievedMaster1.length(), filePage1.length()); - - // ajout de la config de format de fichier au master - master.setFormatConfiguration(getValidFormatConfiguration()); - - // Generate Derived files - final File derivedTmpFile = File.createTempFile("create_", ".tmp"); - derivedTmpFile.deleteOnExit(); - assertEquals(0L, derivedTmpFile.length()); - final File derivedTmpFile2 = File.createTempFile("create_", ".tmp"); - derivedTmpFile2.deleteOnExit(); - assertEquals(0L, derivedTmpFile2.length()); - - CompletableFuture runAsync = CompletableFuture.runAsync(() -> bm.generateDerivedThumbnailForMaster(master, - page1, - ViewsFormatConfiguration.FileFormat.THUMB, - Collections.emptyMap(), - 0, - null, - FAKE_LIB_ID), executorService); - runAsync.get(); - runAsync = CompletableFuture.runAsync(() -> bm.generateDerivedThumbnailForMaster(master, - page1, - ViewsFormatConfiguration.FileFormat.VIEW, - Collections.emptyMap(), - 0, - null, - FAKE_LIB_ID), executorService); - runAsync.get(); - - // Check results - assertTrue(generated.size() == 3); - final List deriveds = generated.values().stream().filter(file -> StoredFileType.DERIVED.equals(file.getType())).collect(Collectors.toList()); - assertTrue(deriveds != null && deriveds.size() == 2); - deriveds.forEach(derivedStoredFile -> { - final File retrievedFile = bm.getFileForStoredFile(derivedStoredFile, FAKE_LIB_ID); - assertNotNull(retrievedFile, "Stored file can't be find for derived"); - try { - final BufferedImage bi = ImageIO.read(retrievedFile); - - final Long heightSf = derivedStoredFile.getFormatConfiguration().getHeightByFormat(derivedStoredFile.getFileFormat()); - assertTrue(heightSf.intValue() >= bi.getHeight()); - final Long widthSf = derivedStoredFile.getFormatConfiguration().getWidthByFormat(derivedStoredFile.getFileFormat()); - assertTrue(widthSf.intValue() >= bi.getWidth()); - } catch (final IOException e) { - fail("Image check failed"); - } - }); - } - - /** - * Test delete file from storedFile - */ - @Test - public void deleteFileFromStoredFile() { - // create main digital doc - final DigitalDocument dd = new DigitalDocument(); - dd.setIdentifier(ID_DD); - - final DocPage page1 = createDocPage(ID_PAGE1_DELETE, dd); - final File fileDerived1 = new File(masterTestFilePage1Path); - if (fileDerived1 == null || !fileDerived1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - - dd.addPage(page1); - - // Handle repository - final Map generated = new HashMap<>(); - when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { - final StoredFile response = (StoredFile) i.getArguments()[0]; - if (response.getIdentifier() != null) { - return generated.get(response.getIdentifier()); - } - response.setIdentifier(randomIdentifier()); - generated.put(response.getIdentifier(), response); - return response; - }); - when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { - final String identifier = (String) i.getArguments()[0]; - return Optional.of(generated.get(identifier)); - }); - when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); - final StoredFile storedPage1 = bm.createFromFileForPage(page1, - fileDerived1, - StoredFileType.DERIVED, - ViewsFormatConfiguration.FileFormat.VIEW, - Optional.empty(), - FAKE_LIB_ID); - - // Check from storedFile - final File retrieved = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); - assertNotNull(retrieved, "Stored file can't be find for derived 1"); - assertEquals(retrieved.length(), fileDerived1.length()); - - // Delete and check - bm.deleteFileFromStoredFile(storedPage1, FAKE_LIB_ID); - final File retrievedMissing = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); - assertFalse(retrievedMissing.exists(), "Stored file should be deleted"); - } - - /** - * Check multiple derived handle (based on format) - * - * @throws IOException - */ - @Test - public void deleteAllFilesFromPage() throws IOException { - // create main digital doc - final DigitalDocument dd = new DigitalDocument(); - dd.setIdentifier(ID_DD); - - final DocPage page1 = createDocPage(ID_PAGE1_DELETE2, dd); - final File fileDerived1 = new File(masterTestFilePage1Path); - if (fileDerived1 == null || !fileDerived1.exists()) { - fail("Unable to load " + masterTestFilePage1Path); - } - final File fileDerived2 = new File(masterTestFilePage2Path); - if (fileDerived2 == null || !fileDerived2.exists()) { - fail("Unable to load " + masterTestFilePage2Path); - } - - dd.addPage(page1); - - // Handle repository - final Map generated = new HashMap<>(); - when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { - final StoredFile response = (StoredFile) i.getArguments()[0]; - if (response.getIdentifier() != null) { - return generated.get(response.getIdentifier()); - } - response.setIdentifier(randomIdentifier()); - generated.put(response.getIdentifier(), response); - return response; - }); - when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { - final String identifier = (String) i.getArguments()[0]; - return Optional.of(generated.get(identifier)); - }); - when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); - final StoredFile storedPage1Derived1 = bm.createFromFileForPage(page1, - fileDerived1, - StoredFileType.DERIVED, - ViewsFormatConfiguration.FileFormat.VIEW, - Optional.empty(), - FAKE_LIB_ID); - final StoredFile storedPage1Derived2 = bm.createFromFileForPage(page1, - fileDerived2, - StoredFileType.DERIVED, - ViewsFormatConfiguration.FileFormat.VIEW, - Optional.empty(), - FAKE_LIB_ID); - - // Check from storedFile - final File retrievedDerived1 = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); - assertNotNull(retrievedDerived1, "Stored file can't be find for derived 1"); - assertEquals(retrievedDerived1.length(), fileDerived1.length()); - - final File retrievedDerived2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); - assertNotNull(retrievedDerived2, "Stored file can't be find for derived 2"); - assertEquals(retrievedDerived2.length(), fileDerived2.length()); - - // Delete and check - bm.deleteAllFilesFromPage(page1, FAKE_LIB_ID); - final File retrievedMissing = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); - assertFalse(retrievedMissing.exists(), "Stored file should be deleted"); - final File retrievedMissing2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); - assertFalse(retrievedMissing2.exists(), "Stored file should be deleted"); - } - - private String randomIdentifier() { - return UUID.randomUUID().toString(); - } - - private ViewsFormatConfiguration getValidFormatConfiguration() { - final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); - conf.setDefaultFormats(defaultFileFormats); - conf.setThumbHeight(100L); - conf.setThumbWidth(100L); - conf.setViewHeight(1200L); - conf.setViewWidth(800L); - conf.setPrintHeight(2400L); - conf.setPrintWidth(1600L); - return conf; - } - - private DocPage createDocPage(final String identifier, final DigitalDocument dd) { - final DocPage page = new DocPage(); - page.setIdentifier(identifier); - final Lot lot = new Lot(); - lot.setIdentifier(randomIdentifier()); - final DocUnit du = new DocUnit(); - du.setLot(lot); - dd.setDocUnit(du); - page.setDigitalDocument(dd); - return page; - } -} +package fr.progilone.pgcn.service.storage; + +import java.nio.file.Files; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import fr.progilone.pgcn.domain.administration.viewsformat.ViewsFormatConfiguration; +import fr.progilone.pgcn.domain.document.DigitalDocument; +import fr.progilone.pgcn.domain.document.DocPage; +import fr.progilone.pgcn.domain.document.DocUnit; +import fr.progilone.pgcn.domain.lot.Lot; +import fr.progilone.pgcn.domain.storage.StoredFile; +import fr.progilone.pgcn.domain.storage.StoredFile.StoredFileType; +import fr.progilone.pgcn.exception.PgcnTechnicalException; +import fr.progilone.pgcn.repository.storage.BinaryRepository; +import fr.progilone.pgcn.repository.user.UserRepository; +import fr.progilone.pgcn.service.administration.viewsformat.ViewsFormatConfigurationService; +import fr.progilone.pgcn.service.util.DefaultFileFormats; +import fr.progilone.pgcn.service.util.DeliveryProgressService; +import fr.progilone.pgcn.service.util.ImageUtils; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; +import javax.imageio.ImageIO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; + +@ExtendWith(MockitoExtension.class) +public class BinaryManagerTest { + + @InjectMocks + private BinaryStorageManager bm; + + @Mock + private BinaryRepository binaryRepository; + + @Mock + private ImageDispatcherService imageDispatcherService; + + @Mock + private ImageMagickService imageMagickService; + + @Mock + private DeliveryProgressService delivProgressService; + + @Mock + private ViewsFormatConfigurationService formatConfigurationService; + + @Mock + private UserRepository userRepository; + + @Autowired + DefaultFileFormats defaultFileFormats; + + private static final ExecutorService executorService = Executors.newCachedThreadPool(); + + private static final String masterTestFilePage1Path = "src/test/resources/storage/test.jpg"; + private static final String masterTestFilePage2Path = "src/test/resources/storage/test2.jpg"; + private static final String ID_DD = "5c8f60456aefba845c8875e46"; + private static final String ID_PAGE1 = "ba45c8f60456a672e003a875e469d0eb"; + private static final String ID_PAGE1_DELETE = "a3fcd4-3298e-784f12c-003a875e46-9d0eb"; + private static final String ID_PAGE1_DELETE2 = "48ecd4-3298e-784f12c-00c3675e46-a8cf4"; + private static final String ID_PAGE2 = "efba845c8f546045e003a846649d0eb"; + + private static final String FAKE_LIB_ID = "libId";; + + @BeforeEach + public void setUp() { + try { + bm.initialize("C://Temp/bmTestPGCN/", 3, "MD5", new String[] {FAKE_LIB_ID}); + } catch (final IOException e) { + fail(e.getMessage()); + } + } + + @Test + public void assertFilesLength() { + final File filePage1 = new File(masterTestFilePage1Path); + if (filePage1 == null || !filePage1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + final File filePage2 = new File(masterTestFilePage2Path); + if (filePage2 == null || !filePage2.exists()) { + fail("Unable to load " + masterTestFilePage2Path); + } + assertNotEquals(filePage2.length(), filePage1.length()); + } + + /** + * Test core process + */ + @Test + public void storeAndRetrieve() { + // create main digital doc + final DigitalDocument dd = new DigitalDocument(); + dd.setIdentifier(ID_DD); + + // for each page (1 min, n max) + final DocPage page1 = createDocPage(ID_PAGE1, dd); + final File filePage1 = new File(masterTestFilePage1Path); + if (filePage1 == null || !filePage1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + final DocPage page2 = createDocPage(ID_PAGE2, dd); + final File filePage2 = new File(masterTestFilePage2Path); + if (filePage2 == null || !filePage2.exists()) { + fail("Unable to load " + masterTestFilePage2Path); + } + dd.addPage(page1); + dd.addPage(page2); + + // Store + // Handle repository + final Map generated = new HashMap<>(); + when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { + final StoredFile response = (StoredFile) i.getArguments()[0]; + if (response.getIdentifier() != null) { + return generated.get(response.getIdentifier()); + } + response.setIdentifier(randomIdentifier()); + generated.put(response.getIdentifier(), response); + return response; + }); + when(binaryRepository.findById(any())).thenAnswer(i -> { + final String identifier = (String) i.getArguments()[0]; + return Optional.of(generated.get(identifier)); + }); + + try { + when(imageMagickService.getMetadatasOfFile(any(File.class), eq(false))).thenReturn(Optional.empty()); + } catch (final PgcnTechnicalException e) { + // nothing + } + when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); + + final StoredFile storedPage1 = bm.createFromFileForPage(page1, filePage1, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); + bm.createFromFileForPage(page2, filePage2, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); + + // Retrieve + // Check from storedFile + final File retrievedMaster1 = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); + assertNotNull(retrievedMaster1, "Stored file can't be find for master 1"); + assertEquals(retrievedMaster1.length(), filePage1.length()); + + // Check with control + final Binary binaryMaster1 = bm.getBinary(storedPage1, FAKE_LIB_ID); + assertEquals(binaryMaster1.getLength(), filePage1.length()); + + // Check From Digital Document + dd.getPages().stream().forEach(page -> { + page.getFiles().stream().forEach(file -> { + // Master check + if (StoredFileType.MASTER.equals(file.getType())) { + if (file.getFilename().contains("2")) { + final File retrievedMaster2Test2 = bm.getFileForStoredFile(file, FAKE_LIB_ID); + assertNotNull(retrievedMaster2Test2, "Stored file can't be find for master 2 in test 2"); + assertEquals(retrievedMaster2Test2.length(), filePage2.length()); + } else { + final File retrievedMaster1Test2 = bm.getFileForStoredFile(file, FAKE_LIB_ID); + assertNotNull(retrievedMaster1Test2, "Stored file can't be find for master 1 in test 2"); + assertEquals(retrievedMaster1Test2.length(), filePage1.length()); + } + } + }); + }); + } + + /** + * Check multiple derived handle (based on format) + */ + @Test + public void storeAndRetriveMultipleDerived() { + // create main digital doc + final DigitalDocument dd = new DigitalDocument(); + dd.setIdentifier(ID_DD); + + // format de fichiers + final ViewsFormatConfiguration.FileFormat format1 = ViewsFormatConfiguration.FileFormat.VIEW; + final ViewsFormatConfiguration.FileFormat format2 = ViewsFormatConfiguration.FileFormat.VIEW; + + final DocPage page1 = createDocPage(ID_PAGE1, dd); + final File fileDerived1 = new File(masterTestFilePage1Path); + if (fileDerived1 == null || !fileDerived1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + final File fileDerived2 = new File(masterTestFilePage2Path); + if (fileDerived2 == null || !fileDerived2.exists()) { + fail("Unable to load " + masterTestFilePage2Path); + } + + dd.addPage(page1); + + // Handle repository + final Map generated = new HashMap<>(); + when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { + final StoredFile response = (StoredFile) i.getArguments()[0]; + if (response.getIdentifier() != null) { + return generated.get(response.getIdentifier()); + } + response.setIdentifier(randomIdentifier()); + generated.put(response.getIdentifier(), response); + return response; + }); + when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { + final String identifier = (String) i.getArguments()[0]; + return Optional.of(generated.get(identifier)); + }); + when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); + final StoredFile storedPage1Derived1 = bm.createFromFileForPage(page1, fileDerived1, StoredFileType.DERIVED, format1, Optional.empty(), FAKE_LIB_ID); + final StoredFile storedPage1Derived2 = bm.createFromFileForPage(page1, fileDerived2, StoredFileType.DERIVED, format2, Optional.empty(), FAKE_LIB_ID); + + // Check from storedFile + final File retrievedDerived1 = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); + assertNotNull(retrievedDerived1, "Stored file can't be find for derived 1"); + assertEquals(retrievedDerived1.length(), fileDerived1.length()); + + final File retrievedDerived2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); + assertNotNull(retrievedDerived2, "Stored file can't be find for derived 2"); + assertEquals(retrievedDerived2.length(), fileDerived2.length()); + } + + @Test + public void generateDerivedThumbnailForMaster() throws IOException, InterruptedException, ExecutionException { + + // create main digital doc + final DigitalDocument dd = new DigitalDocument(); + dd.setIdentifier(ID_DD); + + final DocPage page1 = createDocPage(ID_PAGE1, dd); + final File filePage1 = new File(masterTestFilePage1Path); + if (filePage1 == null || !filePage1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + dd.addPage(page1); + + // Store + // Handle repository + final Map generated = new HashMap<>(); + when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { + final StoredFile response = (StoredFile) i.getArguments()[0]; + if (response.getIdentifier() != null) { + return generated.get(response.getIdentifier()); + } + response.setIdentifier(randomIdentifier()); + generated.put(response.getIdentifier(), response); + return response; + }); + when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { + final String identifier = (String) i.getArguments()[0]; + return Optional.of(generated.get(identifier)); + }); + when(imageDispatcherService.createThumbnailDerived(any(String.class), + any(File.class), + any(File.class), + any(ViewsFormatConfiguration.FileFormat.class), + any(ViewsFormatConfiguration.class), + any(Long[].class))).then(i -> { + ImageUtils.createThumbnail((File) i.getArguments()[1], + (File) i.getArguments()[2], + (int) ((ViewsFormatConfiguration) i.getArguments()[4]).getWidthByFormat((ViewsFormatConfiguration.FileFormat) i.getArguments()[3]), + (int) ((ViewsFormatConfiguration) i.getArguments()[4]).getHeightByFormat((ViewsFormatConfiguration.FileFormat) i.getArguments()[3])); + return true; + }); + when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); + try { + when(imageMagickService.getMetadatasOfFile(any(File.class), eq(false))).thenReturn(Optional.empty()); + } catch (final PgcnTechnicalException e) { + // nothing + } + final StoredFile master = bm.createFromFileForPage(page1, filePage1, StoredFileType.MASTER, ViewsFormatConfiguration.FileFormat.MASTER, Optional.empty(), FAKE_LIB_ID); + // Check from storedFile + final File retrievedMaster1 = bm.getFileForStoredFile(master, FAKE_LIB_ID); + assertNotNull(retrievedMaster1, "Stored file can't be find for master 1"); + assertEquals(retrievedMaster1.length(), filePage1.length()); + + // ajout de la config de format de fichier au master + master.setFormatConfiguration(getValidFormatConfiguration()); + + // Generate Derived files + final File derivedTmpFile = Files.createTempFile("create_", ".tmp").toFile(); + derivedTmpFile.deleteOnExit(); + assertEquals(0L, derivedTmpFile.length()); + final File derivedTmpFile2 = Files.createTempFile("create_", ".tmp").toFile(); + derivedTmpFile2.deleteOnExit(); + assertEquals(0L, derivedTmpFile2.length()); + + CompletableFuture runAsync = CompletableFuture.runAsync(() -> bm.generateDerivedThumbnailForMaster(master, + page1, + ViewsFormatConfiguration.FileFormat.THUMB, + Collections.emptyMap(), + 0, + null, + FAKE_LIB_ID), executorService); + runAsync.get(); + runAsync = CompletableFuture.runAsync(() -> bm.generateDerivedThumbnailForMaster(master, + page1, + ViewsFormatConfiguration.FileFormat.VIEW, + Collections.emptyMap(), + 0, + null, + FAKE_LIB_ID), executorService); + runAsync.get(); + + // Check results + assertTrue(generated.size() == 3); + final List deriveds = generated.values().stream().filter(file -> StoredFileType.DERIVED.equals(file.getType())).collect(Collectors.toList()); + assertTrue(deriveds != null && deriveds.size() == 2); + deriveds.forEach(derivedStoredFile -> { + final File retrievedFile = bm.getFileForStoredFile(derivedStoredFile, FAKE_LIB_ID); + assertNotNull(retrievedFile, "Stored file can't be find for derived"); + try { + final BufferedImage bi = ImageIO.read(retrievedFile); + + final Long heightSf = derivedStoredFile.getFormatConfiguration().getHeightByFormat(derivedStoredFile.getFileFormat()); + assertTrue(heightSf.intValue() >= bi.getHeight()); + final Long widthSf = derivedStoredFile.getFormatConfiguration().getWidthByFormat(derivedStoredFile.getFileFormat()); + assertTrue(widthSf.intValue() >= bi.getWidth()); + } catch (final IOException e) { + fail("Image check failed"); + } + }); + } + + /** + * Test delete file from storedFile + */ + @Test + public void deleteFileFromStoredFile() { + // create main digital doc + final DigitalDocument dd = new DigitalDocument(); + dd.setIdentifier(ID_DD); + + final DocPage page1 = createDocPage(ID_PAGE1_DELETE, dd); + final File fileDerived1 = new File(masterTestFilePage1Path); + if (fileDerived1 == null || !fileDerived1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + + dd.addPage(page1); + + // Handle repository + final Map generated = new HashMap<>(); + when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { + final StoredFile response = (StoredFile) i.getArguments()[0]; + if (response.getIdentifier() != null) { + return generated.get(response.getIdentifier()); + } + response.setIdentifier(randomIdentifier()); + generated.put(response.getIdentifier(), response); + return response; + }); + when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { + final String identifier = (String) i.getArguments()[0]; + return Optional.of(generated.get(identifier)); + }); + when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); + final StoredFile storedPage1 = bm.createFromFileForPage(page1, + fileDerived1, + StoredFileType.DERIVED, + ViewsFormatConfiguration.FileFormat.VIEW, + Optional.empty(), + FAKE_LIB_ID); + + // Check from storedFile + final File retrieved = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); + assertNotNull(retrieved, "Stored file can't be find for derived 1"); + assertEquals(retrieved.length(), fileDerived1.length()); + + // Delete and check + bm.deleteFileFromStoredFile(storedPage1, FAKE_LIB_ID); + final File retrievedMissing = bm.getFileForStoredFile(storedPage1, FAKE_LIB_ID); + assertFalse(retrievedMissing.exists(), "Stored file should be deleted"); + } + + /** + * Check multiple derived handle (based on format) + * + * @throws IOException + */ + @Test + public void deleteAllFilesFromPage() throws IOException { + // create main digital doc + final DigitalDocument dd = new DigitalDocument(); + dd.setIdentifier(ID_DD); + + final DocPage page1 = createDocPage(ID_PAGE1_DELETE2, dd); + final File fileDerived1 = new File(masterTestFilePage1Path); + if (fileDerived1 == null || !fileDerived1.exists()) { + fail("Unable to load " + masterTestFilePage1Path); + } + final File fileDerived2 = new File(masterTestFilePage2Path); + if (fileDerived2 == null || !fileDerived2.exists()) { + fail("Unable to load " + masterTestFilePage2Path); + } + + dd.addPage(page1); + + // Handle repository + final Map generated = new HashMap<>(); + when(binaryRepository.save(any(StoredFile.class))).thenAnswer(i -> { + final StoredFile response = (StoredFile) i.getArguments()[0]; + if (response.getIdentifier() != null) { + return generated.get(response.getIdentifier()); + } + response.setIdentifier(randomIdentifier()); + generated.put(response.getIdentifier(), response); + return response; + }); + when(binaryRepository.findById(any(String.class))).thenAnswer(i -> { + final String identifier = (String) i.getArguments()[0]; + return Optional.of(generated.get(identifier)); + }); + when(formatConfigurationService.getOneByLot(any(String.class))).thenReturn(getValidFormatConfiguration()); + final StoredFile storedPage1Derived1 = bm.createFromFileForPage(page1, + fileDerived1, + StoredFileType.DERIVED, + ViewsFormatConfiguration.FileFormat.VIEW, + Optional.empty(), + FAKE_LIB_ID); + final StoredFile storedPage1Derived2 = bm.createFromFileForPage(page1, + fileDerived2, + StoredFileType.DERIVED, + ViewsFormatConfiguration.FileFormat.VIEW, + Optional.empty(), + FAKE_LIB_ID); + + // Check from storedFile + final File retrievedDerived1 = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); + assertNotNull(retrievedDerived1, "Stored file can't be find for derived 1"); + assertEquals(retrievedDerived1.length(), fileDerived1.length()); + + final File retrievedDerived2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); + assertNotNull(retrievedDerived2, "Stored file can't be find for derived 2"); + assertEquals(retrievedDerived2.length(), fileDerived2.length()); + + // Delete and check + bm.deleteAllFilesFromPage(page1, FAKE_LIB_ID); + final File retrievedMissing = bm.getFileForStoredFile(storedPage1Derived1, FAKE_LIB_ID); + assertFalse(retrievedMissing.exists(), "Stored file should be deleted"); + final File retrievedMissing2 = bm.getFileForStoredFile(storedPage1Derived2, FAKE_LIB_ID); + assertFalse(retrievedMissing2.exists(), "Stored file should be deleted"); + } + + private String randomIdentifier() { + return UUID.randomUUID().toString(); + } + + private ViewsFormatConfiguration getValidFormatConfiguration() { + final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); + conf.setDefaultFormats(defaultFileFormats); + conf.setThumbHeight(100L); + conf.setThumbWidth(100L); + conf.setViewHeight(1200L); + conf.setViewWidth(800L); + conf.setPrintHeight(2400L); + conf.setPrintWidth(1600L); + return conf; + } + + private DocPage createDocPage(final String identifier, final DigitalDocument dd) { + final DocPage page = new DocPage(); + page.setIdentifier(identifier); + final Lot lot = new Lot(); + lot.setIdentifier(randomIdentifier()); + final DocUnit du = new DocUnit(); + du.setLot(lot); + dd.setDocUnit(du); + page.setDigitalDocument(dd); + return page; + } +} diff --git a/src/test/java/fr/progilone/pgcn/service/storage/ImageMagickServiceTest.java b/src/test/java/fr/progilone/pgcn/service/storage/ImageMagickServiceTest.java index 3a7210c8..4d243ed9 100644 --- a/src/test/java/fr/progilone/pgcn/service/storage/ImageMagickServiceTest.java +++ b/src/test/java/fr/progilone/pgcn/service/storage/ImageMagickServiceTest.java @@ -1,264 +1,265 @@ -package fr.progilone.pgcn.service.storage; - -import static fr.progilone.pgcn.service.storage.BinaryStorageManager.Metadatas; -import static org.junit.jupiter.api.Assertions.*; - -import com.lowagie.text.pdf.PdfReader; -import fr.progilone.pgcn.domain.administration.viewsformat.ViewsFormatConfiguration; -import fr.progilone.pgcn.exception.PgcnTechnicalException; -import fr.progilone.pgcn.service.util.ImageUtils; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.junit.jupiter.MockitoExtension; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.test.util.ReflectionTestUtils; - -@ExtendWith(MockitoExtension.class) -public class ImageMagickServiceTest { - - private static final Logger LOG = LoggerFactory.getLogger(ImageMagickServiceTest.class); - - private static final String SRC_FILE = "src/test/resources/storage/test.jpg"; - private static final String PATH_TO_IM_CONVERT = "C://Program Files/ImageMagick/convert.exe"; - private static final String PATH_TO_IM_IDENTIFY = "C://Program Files/ImageMagick/identify.exe"; - - @InjectMocks - private ImageMagickService service; - - @BeforeEach - public void setUp() { - service.initialize(PATH_TO_IM_CONVERT, PATH_TO_IM_IDENTIFY); - ReflectionTestUtils.setField(service, "quoteDelim", "\""); - } - - /** - * Test thumbnail generation - * - * @throws IOException - * @throws PgcnTechnicalException - */ - @Disabled - @Test - public void generateThumbnail() throws IOException, PgcnTechnicalException { - - // final StoredFileFormat f = new StoredFileFormat(); - // f.setWidth(2835L); - // f.setHeight(1964L); - // when(storedFileFormatRepository - // .getOneByLabel(StoredFileFormat.LABEL_PRINT)) - // .thenReturn(f); - - if (service.isConfigured()) { - - final File sourceFile = new File(SRC_FILE); - if (sourceFile == null || !sourceFile.exists()) { - fail("Unable to load " + SRC_FILE); - } - final File destTmpFile = File.createTempFile("create_", ".tmp"); - destTmpFile.deleteOnExit(); - assertTrue(destTmpFile.length() == 0L); - - // Define format - final ViewsFormatConfiguration.FileFormat formatThumb = ViewsFormatConfiguration.FileFormat.THUMB; - final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); - conf.setThumbHeight(100L); - conf.setThumbWidth(100L); - service.generateThumbnail(sourceFile, - destTmpFile, - formatThumb, - conf, - new Long[] {192L, - 192L}); - assertTrue(destTmpFile.length() > 0L); - } else { - fail("Image Magick not configured"); - } - } - - @Disabled - @Test - public void getImagesFromPdf() { - - if (service.isConfigured()) { - - final String PDF_FILE = "C://Temp/manu/test.pdf"; - final File sourceFile = new File(PDF_FILE); - if (sourceFile == null || !sourceFile.exists()) { - fail("Unable to load " + PDF_FILE); - } - - final List extracted = service.extractImgFromPdf(sourceFile, "C://Temp/manu/*.pdf"); - assertTrue(!extracted.isEmpty()); - } - } - - @Disabled - @Test - public void countPdfNumberPages() { - - final String PDF_FILE = "C://Temp/manu/test.pdf"; - final File pdfFile = new File(PDF_FILE); - if (pdfFile == null || !pdfFile.exists()) { - fail("Unable to load " + PDF_FILE); - } - try { - - final PdfReader reader = new PdfReader("C://Temp/manu/test.pdf"); - assertTrue(reader.getNumberOfPages() > 0); - } catch (final Exception e) { - // pffffff... - } - - } - - /** - * Test IM getting metadatas - * - * @throws IOException - * @throws PgcnTechnicalException - */ - @Disabled - @Test - public void getMetadatas() throws IOException, PgcnTechnicalException { - if (service.isConfigured()) { - final File sourceFile = new File(SRC_FILE); - if (!sourceFile.exists()) { - fail("Unable to load " + SRC_FILE); - } - final Optional metas = service.getMetadatasOfFile(sourceFile, false); - assertTrue(metas.isPresent()); - assertTrue(StringUtils.equals(metas.get().getColorSpace(), "sRGB")); - assertEquals("777835B", metas.get().getFilesize()); - } else { - fail("Image Magick not configured"); - } - } - - @Disabled - @Test - public void compareIMtoImgScalr() throws IOException { - if (service.isConfigured()) { - final File sourceFile = new File(SRC_FILE); - if (sourceFile == null || !sourceFile.exists()) { - fail("Unable to load " + SRC_FILE); - } - final List destIMFiles = new ArrayList<>(); - final List destImScalrFiles = new ArrayList<>(); - for (int i = 0; i < 500; i++) { - final File destTmpFileIM = File.createTempFile("create_", ".tmp"); - destIMFiles.add(destTmpFileIM); - destTmpFileIM.deleteOnExit(); - final File destTmpFileImgScalr = File.createTempFile("create_", ".tmp"); - destImScalrFiles.add(destTmpFileImgScalr); - destTmpFileImgScalr.deleteOnExit(); - } - // Define format - final ViewsFormatConfiguration.FileFormat formatView = ViewsFormatConfiguration.FileFormat.VIEW; - final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); - conf.setViewHeight(100L); - conf.setViewWidth(100L); - - // bench - final long startIM = System.nanoTime(); - destIMFiles.stream().forEach(file -> { - try { - service.generateThumbnail(sourceFile, - file, - formatView, - conf, - new Long[] {100L, - 100L}); - } catch (final PgcnTechnicalException e) { - fail(); - } - }); - final long endIM = System.nanoTime(); - LOG.info("Time elapsed : {} s", TimeUnit.NANOSECONDS.toSeconds(endIM - startIM)); - - final long startScalr = System.nanoTime(); - destIMFiles.stream().forEach(file -> ImageUtils.createThumbnail(sourceFile, file, (int) conf.getWidthByFormat(formatView), (int) conf.getHeightByFormat(formatView))); - final long endScalr = System.nanoTime(); - LOG.info("Time elapsed : {} s", TimeUnit.NANOSECONDS.toSeconds(endScalr - startScalr)); - assertTrue(endIM - startIM > 0L); - } else { - fail("Image Magick not configured"); - } - } - - @Test - public void testAlphanumericSort() { - final List files = new ArrayList<>(); - - final File file1 = new File("src/files/GB_000040_001_0200.jpg"); - files.add(file1); - final File file2 = new File("src/files/GB_000040_001_1000.jpg"); - files.add(file2); - final File file3 = new File("src/files/GB_000040_001_0020.jpg"); - files.add(file3); - final File file4 = new File("src/files/GB_000040_001_1034.jpg"); - files.add(file4); - final File file5 = new File("src/files/GB_000040_001_0001.jpg"); - files.add(file5); - final File file6 = new File("src/files/GB_000040_001_0999.jpg"); - files.add(file6); - final File file7 = new File("src/files/GB_000040_001_0010.jpg"); - files.add(file7); - final File file8 = new File("src/files/GB_000040_001_0100.jpg"); - files.add(file8); - - final Pattern p = Pattern.compile("\\d+"); - files.sort((f1, f2) -> { - final String name1 = f1.getName(); - final String name2 = f2.getName(); - Matcher m = p.matcher(name1); - Integer number1 = null; - if (!m.find()) { - return name1.compareTo(name2); - } else { - Integer number2 = null; - while (m.find()) { - number1 = Integer.parseInt(m.group()); - } - m = p.matcher(name2); - if (!m.find()) { - return name1.compareTo(name2); - } else { - while (m.find()) { - number2 = Integer.parseInt(m.group()); - } - int comparison = 0; - if (number2 != null) { - comparison = number1.compareTo(number2); - } - if (comparison != 0) { - return comparison; - } else { - return name1.compareTo(name2); - } - } - } - }); - - assertEquals(files.get(0), file5); - assertEquals(files.get(1), file7); - assertEquals(files.get(2), file3); - assertEquals(files.get(3), file8); - assertEquals(files.get(4), file1); - assertEquals(files.get(5), file6); - assertEquals(files.get(6), file2); - assertEquals(files.get(7), file4); - } -} +package fr.progilone.pgcn.service.storage; + +import static fr.progilone.pgcn.service.storage.BinaryStorageManager.Metadatas; +import java.nio.file.Files; +import static org.junit.jupiter.api.Assertions.*; + +import com.lowagie.text.pdf.PdfReader; +import fr.progilone.pgcn.domain.administration.viewsformat.ViewsFormatConfiguration; +import fr.progilone.pgcn.exception.PgcnTechnicalException; +import fr.progilone.pgcn.service.util.ImageUtils; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.test.util.ReflectionTestUtils; + +@ExtendWith(MockitoExtension.class) +public class ImageMagickServiceTest { + + private static final Logger LOG = LoggerFactory.getLogger(ImageMagickServiceTest.class); + + private static final String SRC_FILE = "src/test/resources/storage/test.jpg"; + private static final String PATH_TO_IM_CONVERT = "C://Program Files/ImageMagick/convert.exe"; + private static final String PATH_TO_IM_IDENTIFY = "C://Program Files/ImageMagick/identify.exe"; + + @InjectMocks + private ImageMagickService service; + + @BeforeEach + public void setUp() { + service.initialize(PATH_TO_IM_CONVERT, PATH_TO_IM_IDENTIFY); + ReflectionTestUtils.setField(service, "quoteDelim", "\""); + } + + /** + * Test thumbnail generation + * + * @throws IOException + * @throws PgcnTechnicalException + */ + @Disabled + @Test + public void generateThumbnail() throws IOException, PgcnTechnicalException { + + // final StoredFileFormat f = new StoredFileFormat(); + // f.setWidth(2835L); + // f.setHeight(1964L); + // when(storedFileFormatRepository + // .getOneByLabel(StoredFileFormat.LABEL_PRINT)) + // .thenReturn(f); + + if (service.isConfigured()) { + + final File sourceFile = new File(SRC_FILE); + if (sourceFile == null || !sourceFile.exists()) { + fail("Unable to load " + SRC_FILE); + } + final File destTmpFile = Files.createTempFile("create_", ".tmp").toFile(); + destTmpFile.deleteOnExit(); + assertTrue(destTmpFile.length() == 0L); + + // Define format + final ViewsFormatConfiguration.FileFormat formatThumb = ViewsFormatConfiguration.FileFormat.THUMB; + final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); + conf.setThumbHeight(100L); + conf.setThumbWidth(100L); + service.generateThumbnail(sourceFile, + destTmpFile, + formatThumb, + conf, + new Long[] {192L, + 192L}); + assertTrue(destTmpFile.length() > 0L); + } else { + fail("Image Magick not configured"); + } + } + + @Disabled + @Test + public void getImagesFromPdf() { + + if (service.isConfigured()) { + + final String PDF_FILE = "C://Temp/manu/test.pdf"; + final File sourceFile = new File(PDF_FILE); + if (sourceFile == null || !sourceFile.exists()) { + fail("Unable to load " + PDF_FILE); + } + + final List extracted = service.extractImgFromPdf(sourceFile, "C://Temp/manu/*.pdf"); + assertTrue(!extracted.isEmpty()); + } + } + + @Disabled + @Test + public void countPdfNumberPages() { + + final String PDF_FILE = "C://Temp/manu/test.pdf"; + final File pdfFile = new File(PDF_FILE); + if (pdfFile == null || !pdfFile.exists()) { + fail("Unable to load " + PDF_FILE); + } + try { + + final PdfReader reader = new PdfReader("C://Temp/manu/test.pdf"); + assertTrue(reader.getNumberOfPages() > 0); + } catch (final Exception e) { + // pffffff... + } + + } + + /** + * Test IM getting metadatas + * + * @throws IOException + * @throws PgcnTechnicalException + */ + @Disabled + @Test + public void getMetadatas() throws IOException, PgcnTechnicalException { + if (service.isConfigured()) { + final File sourceFile = new File(SRC_FILE); + if (!sourceFile.exists()) { + fail("Unable to load " + SRC_FILE); + } + final Optional metas = service.getMetadatasOfFile(sourceFile, false); + assertTrue(metas.isPresent()); + assertTrue(StringUtils.equals(metas.get().getColorSpace(), "sRGB")); + assertEquals("777835B", metas.get().getFilesize()); + } else { + fail("Image Magick not configured"); + } + } + + @Disabled + @Test + public void compareIMtoImgScalr() throws IOException { + if (service.isConfigured()) { + final File sourceFile = new File(SRC_FILE); + if (sourceFile == null || !sourceFile.exists()) { + fail("Unable to load " + SRC_FILE); + } + final List destIMFiles = new ArrayList<>(); + final List destImScalrFiles = new ArrayList<>(); + for (int i = 0; i < 500; i++) { + final File destTmpFileIM = Files.createTempFile("create_", ".tmp").toFile(); + destIMFiles.add(destTmpFileIM); + destTmpFileIM.deleteOnExit(); + final File destTmpFileImgScalr = Files.createTempFile("create_", ".tmp").toFile(); + destImScalrFiles.add(destTmpFileImgScalr); + destTmpFileImgScalr.deleteOnExit(); + } + // Define format + final ViewsFormatConfiguration.FileFormat formatView = ViewsFormatConfiguration.FileFormat.VIEW; + final ViewsFormatConfiguration conf = new ViewsFormatConfiguration(); + conf.setViewHeight(100L); + conf.setViewWidth(100L); + + // bench + final long startIM = System.nanoTime(); + destIMFiles.stream().forEach(file -> { + try { + service.generateThumbnail(sourceFile, + file, + formatView, + conf, + new Long[] {100L, + 100L}); + } catch (final PgcnTechnicalException e) { + fail(); + } + }); + final long endIM = System.nanoTime(); + LOG.info("Time elapsed : {} s", TimeUnit.NANOSECONDS.toSeconds(endIM - startIM)); + + final long startScalr = System.nanoTime(); + destIMFiles.stream().forEach(file -> ImageUtils.createThumbnail(sourceFile, file, (int) conf.getWidthByFormat(formatView), (int) conf.getHeightByFormat(formatView))); + final long endScalr = System.nanoTime(); + LOG.info("Time elapsed : {} s", TimeUnit.NANOSECONDS.toSeconds(endScalr - startScalr)); + assertTrue(endIM - startIM > 0L); + } else { + fail("Image Magick not configured"); + } + } + + @Test + public void testAlphanumericSort() { + final List files = new ArrayList<>(); + + final File file1 = new File("src/files/GB_000040_001_0200.jpg"); + files.add(file1); + final File file2 = new File("src/files/GB_000040_001_1000.jpg"); + files.add(file2); + final File file3 = new File("src/files/GB_000040_001_0020.jpg"); + files.add(file3); + final File file4 = new File("src/files/GB_000040_001_1034.jpg"); + files.add(file4); + final File file5 = new File("src/files/GB_000040_001_0001.jpg"); + files.add(file5); + final File file6 = new File("src/files/GB_000040_001_0999.jpg"); + files.add(file6); + final File file7 = new File("src/files/GB_000040_001_0010.jpg"); + files.add(file7); + final File file8 = new File("src/files/GB_000040_001_0100.jpg"); + files.add(file8); + + final Pattern p = Pattern.compile("\\d+"); + files.sort((f1, f2) -> { + final String name1 = f1.getName(); + final String name2 = f2.getName(); + Matcher m = p.matcher(name1); + Integer number1 = null; + if (!m.find()) { + return name1.compareTo(name2); + } else { + Integer number2 = null; + while (m.find()) { + number1 = Integer.parseInt(m.group()); + } + m = p.matcher(name2); + if (!m.find()) { + return name1.compareTo(name2); + } else { + while (m.find()) { + number2 = Integer.parseInt(m.group()); + } + int comparison = 0; + if (number2 != null) { + comparison = number1.compareTo(number2); + } + if (comparison != 0) { + return comparison; + } else { + return name1.compareTo(name2); + } + } + } + }); + + assertEquals(files.get(0), file5); + assertEquals(files.get(1), file7); + assertEquals(files.get(2), file3); + assertEquals(files.get(3), file8); + assertEquals(files.get(4), file1); + assertEquals(files.get(5), file6); + assertEquals(files.get(6), file2); + assertEquals(files.get(7), file4); + } +}