Skip to content
ArchiveServiceTest.java 3.65 KiB
Newer Older
/*
 * This file is part of vospace-file-service
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
package it.inaf.ia2.transfer.service;

import it.inaf.ia2.transfer.auth.TokenPrincipal;
import it.inaf.ia2.transfer.persistence.FileDAO;
import it.inaf.ia2.transfer.persistence.model.FileInfo;
import java.io.File;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.AfterAll;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static org.mockito.ArgumentMatchers.any;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.FileSystemUtils;

@ExtendWith(MockitoExtension.class)
public class ArchiveServiceTest {

    @Mock
    private FileDAO fileDAO;

    @Mock
    private AuthorizationService authorizationService;

    private ArchiveService archiveService;

    private static File tmpDir;

    @BeforeAll
    public static void setUpClass() throws Exception {
        tmpDir = Files.createTempDirectory("generated").toFile();
    }

    @AfterAll
    public static void tearDownClass() throws Exception {
        FileSystemUtils.deleteRecursively(tmpDir);
    }

    @BeforeEach
    public void setUp() {
        archiveService = new ArchiveService(tmpDir.getAbsolutePath());
        ReflectionTestUtils.setField(archiveService, "fileDAO", fileDAO);
        ReflectionTestUtils.setField(archiveService, "authorizationService", authorizationService);
    }

    @Test
    public void testTarGeneration() throws Exception {

        File tmpParent = tmpDir.toPath().resolve("test1").toFile();
        File file1 = createFile(tmpParent, "dir1/a/b/file1");
        File file2 = createFile(tmpParent, "dir1/a/b/file2");
        File file3 = createFile(tmpParent, "dir2/c/file3");
        File file4 = createFile(tmpParent, "dir2/c/file4");
        File file5 = createFile(tmpParent, "dir2/c/d/file5");
        File file6 = createFile(tmpParent, "file6");

        ArchiveJob job = new ArchiveJob();
        job.setPrincipal(new TokenPrincipal("user123", "token123"));
        job.setJobId("abcdef");
        job.setType(ArchiveJob.Type.TAR);
        job.setVosPaths(Arrays.asList("/path/to/file6"));//"/path/to/dir1", "/path/to/dir2",

        when(authorizationService.isDownloadable(any(), any())).thenReturn(true);

        List<FileInfo> fileInfos = new ArrayList<>();
        FileInfo fileInfo = new FileInfo();
        fileInfo.setOsPath(file6.getAbsolutePath());
        fileInfos.add(fileInfo);

        when(fileDAO.getArchiveFileInfos(any())).thenReturn(fileInfos);

        archiveService.createArchive(job);

        File result = tmpDir.toPath().resolve("user123").resolve("abcdef.tar").toFile();
        assertTrue(result.exists());
    }

    private File createFile(File parent, String path) throws Exception {
        parent.mkdir();
        String[] files = path.split("/");
        for (int i = 0; i < files.length; i++) {
            File file = parent.toPath().resolve(files[i]).toFile();
            if (i == files.length - 1) {
                file.createNewFile();
                Files.write(file.toPath(), "some data".getBytes());
                return file;
            } else {
                file.mkdir();
                parent = file;
            }
        }
        throw new IllegalStateException("Files have to be created");
    }
}