de.zib.gndms.gndmc.dspace.Test.SliceClientTest.java Source code

Java tutorial

Introduction

Here is the source code for de.zib.gndms.gndmc.dspace.Test.SliceClientTest.java

Source

package de.zib.gndms.gndmc.dspace.Test;

/*
 * Copyright 2008-2011 Zuse Institute Berlin (ZIB)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import de.zib.gndms.common.dspace.SliceConfiguration;
import de.zib.gndms.common.dspace.service.SliceInformation;
import de.zib.gndms.common.model.FileStats;
import de.zib.gndms.common.model.gorfx.types.TaskStatus;
import de.zib.gndms.common.rest.Facets;
import de.zib.gndms.common.rest.Specifier;
import de.zib.gndms.common.rest.UriFactory;
import de.zib.gndms.gndmc.dspace.SliceClient;
import de.zib.gndms.gndmc.dspace.SliceKindClient;
import de.zib.gndms.gndmc.dspace.SubspaceClient;
import de.zib.gndms.gndmc.gorfx.AbstractTaskFlowExecClient;
import de.zib.gndms.gndmc.gorfx.TaskClient;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.io.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedList;
import java.util.List;

/**
 * Tests the SliceClient
 * 
 * @author bachmann@zib.de
 */

public class SliceClientTest {

    final ApplicationContext context;

    private SubspaceClient subspaceClient;
    private SliceKindClient sliceKindClient;
    private SliceClient sliceClient;
    private TaskClient taskClient;

    final private String serviceUrl;
    private RestTemplate restTemplate;

    final static String subspaceConfig = "size: 4096; path: /tmp/gndms/sub; gsiFtpPath: undefined";
    final static String subspaceId = "testsub";

    final static String sliceKindId = "testkind";
    final static String sliceKindConfig = "sliceKindMode:700; uniqueDirName:kind";

    final static String sliceConfig = "terminationTime:2011-12-16; sliceSize:1024";
    final static String sliceConfigTooBig = "terminationTime:2011-12-16; sliceSize:5000";
    final static String sliceFileName = "testfile";
    final static String sliceFile = "/tmp/test.file";
    final static String sliceFileContent = "Hallo Welt";

    String sliceId;

    final private String admindn;

    @Parameters({ "serviceUrl", "admindn" })
    public SliceClientTest(final String serviceUrl, @Optional("root") final String admindn) {
        this.serviceUrl = serviceUrl;
        this.admindn = admindn;

        this.context = new ClassPathXmlApplicationContext("classpath:META-INF/client-context.xml");
    }

    @BeforeClass(groups = { "sliceServiceTest" })
    public void init() {
        subspaceClient = (SubspaceClient) context.getAutowireCapableBeanFactory().createBean(SubspaceClient.class,
                AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
        subspaceClient.setServiceURL(serviceUrl);

        sliceKindClient = (SliceKindClient) context.getAutowireCapableBeanFactory()
                .createBean(SliceKindClient.class, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
        sliceKindClient.setServiceURL(serviceUrl);

        sliceClient = (SliceClient) context.getAutowireCapableBeanFactory().createBean(SliceClient.class,
                AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
        sliceClient.setServiceURL(serviceUrl);

        taskClient = (TaskClient) context.getAutowireCapableBeanFactory().createBean(TaskClient.class,
                AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true);
        taskClient.setServiceURL(serviceUrl);

        restTemplate = (RestTemplate) context.getAutowireCapableBeanFactory().getBean("restTemplate");
    }

    @Test(groups = { "sliceServiceTest" })
    public void testCreateSubspace() {
        final String mode = "CREATE";

        ResponseEntity<Facets> subspace = null;
        try {
            subspace = subspaceClient.createSubspace(subspaceId, subspaceConfig, admindn);

            Assert.assertNotNull(subspace);
            Assert.assertEquals(subspace.getStatusCode(), HttpStatus.CREATED);
        } catch (HttpClientErrorException e) {
            if (!e.getStatusCode().equals(HttpStatus.UNAUTHORIZED))
                throw e;
        }

        final ResponseEntity<Facets> res = subspaceClient.listAvailableFacets(subspaceId, admindn);
        Assert.assertNotNull(res);
        Assert.assertEquals(res.getStatusCode(), HttpStatus.OK);
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testCreateSubspace" })
    public void testCreateSliceKind() {
        try {
            final ResponseEntity<Specifier<Void>> sliceKind = subspaceClient.createSliceKind(subspaceId,
                    sliceKindId, sliceKindConfig, admindn);
            Assert.assertNotNull(sliceKind);
            Assert.assertEquals(sliceKind.getStatusCode(), HttpStatus.CREATED);
        } catch (HttpClientErrorException e) {
            if (!e.getStatusCode().equals(HttpStatus.PRECONDITION_FAILED)) // already exists from last test?
                throw e;
        }

        final ResponseEntity<List<Specifier<Void>>> listResponseEntity = subspaceClient.listSliceKinds(subspaceId,
                admindn);
        final List<Specifier<Void>> specifierList = listResponseEntity.getBody();

        for (Specifier<Void> s : specifierList) {
            if (!s.getUriMap().containsKey(UriFactory.SLICE_KIND))
                continue;
            if (s.getUriMap().get(UriFactory.SLICE_KIND).equals(sliceKindId))
                return;
        }

        throw new IllegalStateException(
                "The created SliceKind " + sliceKindId + " could not be found in SliceKindListing");
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testCreateSliceKind" })
    public void testCreateSlice() {
        final ResponseEntity<Specifier<Void>> slice = subspaceClient.createSlice(subspaceId, sliceKindId,
                sliceConfig, admindn);
        Assert.assertNotNull(slice);
        Assert.assertEquals(slice.getStatusCode(), HttpStatus.CREATED);

        sliceId = slice.getBody().getUriMap().get(UriFactory.SLICE);
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testCreateSlice" })
    public void testSliceQuota() {
        boolean works = false;
        try {
            final ResponseEntity<Specifier<Void>> slice = subspaceClient.createSlice(subspaceId, sliceKindId,
                    sliceConfigTooBig, admindn);
            Assert.assertNotNull(slice);
            Assert.assertEquals(slice.getStatusCode(), HttpStatus.BAD_REQUEST);
        } catch (Exception e) {
            works = true;
        }
        Assert.assertEquals(works, true);

        final SliceConfiguration sliceConfiguration = new SliceConfiguration();
        sliceConfiguration.setSize(5000L);

        try {
            works = false;
            sliceClient.setSliceConfiguration(subspaceId, sliceKindId, sliceId, sliceConfiguration, admindn);
        } catch (Exception e) {
            works = true;
        }

        Assert.assertEquals(works, true);
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testSliceQuota" })
    public void testConfigSlice() {
        DateTime month = new DateTime(DateTimeUtils.currentTimeMillis()).plusMonths(1);

        final SliceConfiguration sliceConfiguration = new SliceConfiguration(1234L, month);
        sliceClient.setSliceConfiguration(subspaceId, sliceKindId, sliceId, sliceConfiguration, admindn);
        final ResponseEntity<SliceInformation> responseEntity = sliceClient.getSliceInformation(subspaceId,
                sliceKindId, sliceId, admindn);

        SliceInformation sliceInformation = responseEntity.getBody();

        Assert.assertEquals(new Long(1234L), sliceInformation.getSize());
        Assert.assertEquals(month.getMillis(), sliceInformation.getTerminationTime().getMillis());
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testConfigSlice" })
    public void testFileTransfer() throws IOException, NoSuchAlgorithmException, KeyManagementException {
        // TODO: test for nonexistance of sliceFile as initial constraint
        // create tmp testfile
        {
            FileOutputStream testfile = new FileOutputStream(sliceFile);
            ByteArrayInputStream in = new ByteArrayInputStream(sliceFileContent.getBytes());
            FileCopyUtils.copy(in, testfile);
            testfile.flush();
            testfile.close();
        }

        // upload file
        {
            final ResponseEntity<Integer> responseEntity = sliceClient.setFileContent(subspaceId, sliceKindId,
                    sliceId, sliceFileName, new MultipartFile() {
                        @Override
                        public String getName() {
                            return sliceFileName;
                        }

                        @Override
                        public String getOriginalFilename() {
                            // This is where he gets the content from.
                            return sliceFile;
                        }

                        @Override
                        public String getContentType() {
                            return null;
                        }

                        @Override
                        public boolean isEmpty() {
                            return false;
                        }

                        @Override
                        public long getSize() {
                            return 0;
                        }

                        @Override
                        public byte[] getBytes() throws IOException {
                            // don't need this
                            return null;
                        }

                        @Override
                        public InputStream getInputStream() throws IOException {
                            // don't need this
                            return null;
                        }

                        @Override
                        public void transferTo(File dest) throws IOException, IllegalStateException {
                            // don't need this
                        }
                    }, admindn);

            Assert.assertNotNull(responseEntity);
            Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
        }

        // try to find uploaded file
        {
            if (!findFile())
                throw new IllegalStateException(
                        "Uploaded file " + sliceFileName + " could not be listed. Upload failed?");
        }

        // download file and compare with uploaded file
        {
            final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            final ResponseEntity<Integer> responseEntity = sliceClient.listFileContent(subspaceId, sliceKindId,
                    sliceId, sliceFileName, new LinkedList<String>(), admindn, byteArrayOutputStream);

            Assert.assertNotNull(responseEntity);
            Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);

            InputStream stream = new FileInputStream(sliceFile);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            FileCopyUtils.copy(stream, out);
            Assert.assertEquals(byteArrayOutputStream.toByteArray(), out.toByteArray());
        }

        // delete uploaded file
        {
            final ResponseEntity<Integer> responseEntity = sliceClient.deleteFile(subspaceId, sliceKindId, sliceId,
                    sliceFileName, admindn);

            Assert.assertNotNull(responseEntity);
            Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
        }

        // try to not! find deleted file
        {
            if (findFile())
                throw new IllegalStateException("Still found deleted file " + sliceFileName);
        }
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testFileTransfer" })
    public void testDeleteSlice() {
        {
            final ResponseEntity<Specifier<Facets>> responseEntity = sliceClient.deleteSlice(subspaceId,
                    sliceKindId, sliceId, admindn);

            Assert.assertNotNull(responseEntity);
            Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);

            // wait for task to finish
            AbstractTaskFlowExecClient.waitForFinishOrFail(responseEntity.getBody(), taskClient, 500, admindn,
                    "DELETESLICEWID");
        }

        // check for nonexistance of slice
        {
            try {
                final ResponseEntity<Facets> responseEntity = sliceClient.listSliceFacets(subspaceId, sliceKindId,
                        sliceId, admindn);

                Assert.assertNotNull(responseEntity);
                Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.NOT_FOUND);
            } catch (HttpClientErrorException e) {
                Assert.assertEquals(e.getStatusCode(), HttpStatus.NOT_FOUND);
            }
        }
    }

    @Test(groups = { "sliceServiceTest" }, dependsOnMethods = { "testDeleteSlice" })
    public void testDeleteSubspace() {
        final ResponseEntity<Specifier<Facets>> responseEntity = subspaceClient.deleteSubspace(subspaceId, admindn);
        Assert.assertNotNull(responseEntity);
        Assert.assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);

        final TaskClient client = new TaskClient(serviceUrl);
        client.setRestTemplate(restTemplate);

        // wait for task to finish
        TaskStatus taskStatus = AbstractTaskFlowExecClient.waitForFinishOrFail(responseEntity.getBody(), client,
                100, admindn, "DELETESUBSPACEWID");
        Assert.assertNotNull(taskStatus);
        Assert.assertEquals(taskStatus.getStatus(), TaskStatus.Status.FINISHED);
        Assert.assertEquals(taskStatus.getMaxProgress(), taskStatus.getProgress());
        Assert.assertEquals(taskStatus.getStatus(), TaskStatus.Status.FINISHED);
    }

    private boolean findFile() {
        final ResponseEntity<List<FileStats>> listResponseEntity = sliceClient.listFiles(subspaceId, sliceKindId,
                sliceId, admindn);

        Assert.assertNotNull(listResponseEntity);
        Assert.assertEquals(listResponseEntity.getStatusCode(), HttpStatus.OK);

        for (FileStats fileStats : listResponseEntity.getBody()) {
            if (fileStats.path.equals("/" + sliceFileName))
                return true;
        }

        return false;
    }
}