org.apache.archiva.webdav.RepositoryServletRepositoryGroupTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.archiva.webdav.RepositoryServletRepositoryGroupTest.java

Source

package org.apache.archiva.webdav;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponse;
import org.apache.archiva.configuration.Configuration;
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
import org.apache.archiva.maven2.metadata.MavenMetadataReader;
import org.apache.archiva.model.ArchivaRepositoryMetadata;
import org.apache.commons.io.FileUtils;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * RepositoryServletRepositoryGroupTest
 * <p/>
 * Test Case 1.  Accessing a valid repository group root url (e.g. http://machine.com/repository/repository-group/) returns a Bad Request (HTTP 400)
 * Test Case 2.  Accessing an invalid repository group root url is forwarded to managed repository checking (this is not covered here)
 * Test Case 3.  Accessing an artifact in a valid repository group will iterate over the managed repositories in the repository group
 * Test Case 3.a.  If an invalid managed repository is encountered (managed repository doesn't exist),
 * a Not Found (HTTP 404) is returned and the iteration is broken
 * Test Case 3.b.  If an artifact is not found in a valid managed repository (after proxying, etc.),
 * a Not Found (HTTP 404) is set but not returned yet, the iteration continues to the next managed repository.
 * The Not Found (HTTP 404) is returned after exhausting all valid managed repositories
 * Test Case 3.c.  If an artifact is found in a valid managed repository,
 * the artifact is returned, the iteration is broken and any Not Found (HTTP 404) is disregarded
 * Test Case 4.  Accessing a valid repository group with any http write method returns a Bad Request (HTTP 400)
 */
public class RepositoryServletRepositoryGroupTest extends AbstractRepositoryServletTestCase {
    protected File repoRootFirst;

    protected File repoRootLast;

    protected File repoRootInvalid;

    protected static final String MANAGED_REPO_FIRST = "first";

    protected static final String MANAGED_REPO_LAST = "last";

    protected static final String MANAGED_REPO_INVALID = "invalid";

    protected static final String REPO_GROUP_WITH_VALID_REPOS = "group-with-valid-repos";

    protected static final String REPO_GROUP_WITH_INVALID_REPOS = "group-with-invalid-repos";

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();

        String appserverBase = System.getProperty("appserver.base");

        Configuration configuration = archivaConfiguration.getConfiguration();

        repoRootFirst = new File(appserverBase, "data/repositories/" + MANAGED_REPO_FIRST);
        repoRootLast = new File(appserverBase, "data/repositories/" + MANAGED_REPO_LAST);

        configuration.addManagedRepository(
                createManagedRepository(MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true));
        configuration.addManagedRepository(
                createManagedRepository(MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true));

        List<String> managedRepoIds = new ArrayList<>();
        managedRepoIds.add(MANAGED_REPO_FIRST);
        managedRepoIds.add(MANAGED_REPO_LAST);

        configuration.addRepositoryGroup(createRepositoryGroup(REPO_GROUP_WITH_VALID_REPOS, managedRepoIds));

        // Create the repository group with an invalid managed repository
        repoRootInvalid = new File(appserverBase, "data/repositories/" + MANAGED_REPO_INVALID);
        ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepository(
                MANAGED_REPO_INVALID, "Invalid Test Repo", repoRootInvalid, true);

        configuration.addManagedRepository(
                createManagedRepository(MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true));
        configuration.addManagedRepository(managedRepositoryConfiguration);
        configuration.addManagedRepository(
                createManagedRepository(MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true));

        List<String> invalidManagedRepoIds = new ArrayList<>();
        invalidManagedRepoIds.add(MANAGED_REPO_FIRST);
        invalidManagedRepoIds.add(MANAGED_REPO_INVALID);
        invalidManagedRepoIds.add(MANAGED_REPO_LAST);

        configuration
                .addRepositoryGroup(createRepositoryGroup(REPO_GROUP_WITH_INVALID_REPOS, invalidManagedRepoIds));

        configuration.removeManagedRepository(managedRepositoryConfiguration);
        FileUtils.deleteDirectory(repoRootInvalid);

        saveConfiguration(archivaConfiguration);

        startRepository();
    }

    @Override
    @After
    public void tearDown() throws Exception {
        setupCleanRepo(repoRootFirst);
        setupCleanRepo(repoRootLast);

        super.tearDown();
    }

    /*
    * Test Case 3.c
    */
    @Test
    public void testGetFromFirstManagedRepositoryReturnOk() throws Exception {
        String resourceName = "dummy/dummy-first-resource/1.0/dummy-first-resource-1.0.txt";

        File dummyInternalResourceFile = new File(repoRootFirst, resourceName);
        dummyInternalResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyInternalResourceFile, "first", Charset.defaultCharset());

        WebRequest request = new GetMethodWebRequest(
                "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName);
        WebResponse response = getServletUnitClient().getResponse(request);

        assertResponseOK(response);
        assertThat(response.getContentAsString()).isEqualTo("first");
    }

    /*
    * Test Case 3.c
    */
    @Test
    public void testGetFromLastManagedRepositoryReturnOk() throws Exception {
        String resourceName = "dummy/dummy-last-resource/1.0/dummy-last-resource-1.0.txt";

        File dummyReleasesResourceFile = new File(repoRootLast, resourceName);
        dummyReleasesResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyReleasesResourceFile, "last", Charset.defaultCharset());

        WebRequest request = new GetMethodWebRequest(
                "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName);
        WebResponse response = getServletUnitClient().getResponse(request);

        assertResponseOK(response);

        assertThat(response.getContentAsString()).isEqualTo("last");
    }

    /*
    * Test Case 3.b
    */
    @Test
    public void testGetFromValidRepositoryGroupReturnNotFound() throws Exception {
        String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";

        WebRequest request = new GetMethodWebRequest(
                "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName);
        WebResponse response = getServletUnitClient().getResponse(request);

        assertResponseNotFound(response);
    }

    /*
    * Test Case 3.a
    */
    @Test
    public void testGetInvalidManagedRepositoryInGroupReturnNotFound() throws Exception {
        String resourceName = "dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";

        WebRequest request = new GetMethodWebRequest(
                "http://machine.com/repository/" + REPO_GROUP_WITH_INVALID_REPOS + "/" + resourceName);
        WebResponse response = getServletUnitClient().getResponse(request);

        assertResponseInternalServerError(response);
    }

    /*
    * Test Case 4
    */
    @Test
    public void testPutValidRepositoryGroupReturnBadRequest() throws Exception {
        String resourceName = "dummy/dummy-put-resource/1.0/dummy-put-resource-1.0.txt";
        String putUrl = "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/" + resourceName;
        InputStream is = getClass().getResourceAsStream("/artifact.jar");

        WebRequest request = new PutMethodWebRequest(putUrl, is, "text/plain");
        WebResponse response = getServletUnitClient().getResponse(request);

        assertResponseMethodNotAllowed(response);
    }

    // MRM-872
    @Test
    public void testGetMergedMetadata() throws Exception {
        // first metadata file        
        String resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";

        File dummyInternalResourceFile = new File(repoRootFirst, resourceName);
        dummyInternalResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                + "<metadata>\n<groupId>dummy</groupId>\n<artifactId>dummy-merged-metadata-resource</artifactId>\n"
                + "<versioning>\n<latest>1.0</latest>\n<release>1.0</release>\n<versions>\n<version>1.0</version>\n"
                + "<version>2.5</version>\n</versions>\n<lastUpdated>20080708095554</lastUpdated>\n</versioning>\n</metadata>",
                Charset.defaultCharset());

        //second metadata file
        resourceName = "dummy/dummy-merged-metadata-resource/maven-metadata.xml";
        dummyInternalResourceFile = new File(repoRootLast, resourceName);
        dummyInternalResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyInternalResourceFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<metadata><groupId>dummy</groupId><artifactId>dummy-merged-metadata-resource</artifactId>"
                + "<versioning><latest>2.0</latest><release>2.0</release><versions><version>1.0</version>"
                + "<version>1.5</version><version>2.0</version></versions><lastUpdated>20080709095554</lastUpdated>"
                + "</versioning></metadata>", Charset.defaultCharset());

        WebRequest request = new GetMethodWebRequest("http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS
                + "/dummy/" + "dummy-merged-metadata-resource/maven-metadata.xml");
        WebResponse response = getServletUnitClient().getResource(request);

        File returnedMetadata = new File("target/test-classes/retrievedMetadataFile.xml");
        FileUtils.writeStringToFile(returnedMetadata, response.getContentAsString());
        ArchivaRepositoryMetadata metadata = MavenMetadataReader.read(returnedMetadata);

        assertResponseOK(response);

        assertThat(metadata.getAvailableVersions()).isNotNull().hasSize(4).contains("1.0", "1.5", "2.0", "2.5");

        //check if the checksum files were generated
        File checksumFileSha1 = new File(repoRootFirst, resourceName + ".sha1");
        checksumFileSha1.getParentFile().mkdirs();
        FileUtils.writeStringToFile(checksumFileSha1, "3290853214d3687134", Charset.defaultCharset());

        File checksumFileMd5 = new File(repoRootFirst, resourceName + ".md5");
        checksumFileMd5.getParentFile().mkdirs();
        FileUtils.writeStringToFile(checksumFileMd5, "98745897234eda12836423", Charset.defaultCharset());

        // request the sha1 checksum of the metadata
        request = new GetMethodWebRequest("http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
                + "dummy-merged-metadata-resource/maven-metadata.xml.sha1");
        response = getServletUnitClient().getResource(request);

        assertResponseOK(response);

        assertThat(response.getContentAsString())
                .isEqualTo("add113b0d7f8c6adb92a5015a7a3701081edf998  maven-metadata-group-with-valid-repos.xml");

        // request the md5 checksum of the metadata
        request = new GetMethodWebRequest("http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
                + "dummy-merged-metadata-resource/maven-metadata.xml.md5");
        response = getServletUnitClient().getResource(request);

        assertResponseOK(response);

        assertThat(response.getContentAsString())
                .isEqualTo("5b85ea4aa5f52bb76760041a52f98de8  maven-metadata-group-with-valid-repos.xml");
    }

    // MRM-901
    @Test
    public void testBrowseWithTwoArtifactsWithSameGroupIdInRepos() throws Exception {
        String resourceName = "dummy/dummy-artifact/1.0/dummy-artifact-1.0.txt";

        File dummyInternalResourceFile = new File(repoRootFirst, resourceName);
        dummyInternalResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyInternalResourceFile, "first", Charset.defaultCharset());

        resourceName = "dummy/dummy-artifact/2.0/dummy-artifact-2.0.txt";

        File dummyReleasesResourceFile = new File(repoRootLast, resourceName);
        dummyReleasesResourceFile.getParentFile().mkdirs();
        FileUtils.writeStringToFile(dummyReleasesResourceFile, "last", Charset.defaultCharset());

        WebRequest request = new GetMethodWebRequest(
                "http://machine.com/repository/" + REPO_GROUP_WITH_VALID_REPOS + "/dummy/dummy-artifact/");
        WebResponse response = getServletUnitClient().getResource(request);

        assertResponseOK(response);

        assertThat(response.getContentAsString()).contains("Collection").contains("dummy/dummy-artifact")
                .contains("1.0").contains("2.0");

    }

    protected void assertResponseMethodNotAllowed(WebResponse response) {

        assertThat(response).isNotNull();

        assertThat(response.getStatusCode()).isEqualTo(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
    }

    protected RepositoryGroupConfiguration createRepositoryGroup(String id, List<String> repositories) {
        RepositoryGroupConfiguration repoGroupConfiguration = new RepositoryGroupConfiguration();
        repoGroupConfiguration.setId(id);
        repoGroupConfiguration.setRepositories(repositories);
        return repoGroupConfiguration;
    }
}