org.apache.archiva.repository.scanner.RepositoryContentConsumersTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.archiva.repository.scanner.RepositoryContentConsumersTest.java

Source

package org.apache.archiva.repository.scanner;

/*
 * 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 junit.framework.TestCase;
import org.apache.archiva.admin.model.beans.ManagedRepository;
import org.apache.archiva.admin.model.beans.RemoteRepository;
import org.apache.archiva.configuration.ArchivaConfiguration;
import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;
import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
import org.apache.commons.lang.SystemUtils;
import org.easymock.IMocksControl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.core.ResolvableType;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.test.context.ContextConfiguration;

import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import static org.easymock.EasyMock.*;

/**
 * RepositoryContentConsumersTest
 */
@RunWith(ArchivaSpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" })
public class RepositoryContentConsumersTest extends TestCase {

    @Inject
    ApplicationContext applicationContext;

    protected ManagedRepository createRepository(String id, String name, File location) {
        ManagedRepository repo = new ManagedRepository();
        repo.setId(id);
        repo.setName(name);
        repo.setLocation(location.getAbsolutePath());
        return repo;
    }

    protected RemoteRepository createRemoteRepository(String id, String name, String url) {
        RemoteRepository repo = new RemoteRepository();
        repo.setId(id);
        repo.setName(name);
        repo.setUrl(url);
        return repo;
    }

    private RepositoryContentConsumers lookupRepositoryConsumers() throws Exception {

        ArchivaConfiguration configuration = applicationContext.getBean("archivaConfiguration#test-conf",
                ArchivaConfiguration.class);

        ArchivaAdministrationStub administrationStub = new ArchivaAdministrationStub(configuration);

        RepositoryContentConsumers consumerUtilStub = new RepositoryContentConsumersStub(administrationStub);

        RepositoryContentConsumers consumerUtil = applicationContext.getBean("repositoryContentConsumers#test",
                RepositoryContentConsumers.class);
        ApplicationContext context = new MockApplicationContext(consumerUtil.getAvailableKnownConsumers(), //
                consumerUtil.getAvailableInvalidConsumers());

        consumerUtilStub.setApplicationContext(context);
        consumerUtilStub.setSelectedInvalidConsumers(consumerUtil.getSelectedInvalidConsumers());
        consumerUtilStub.setSelectedKnownConsumers(consumerUtil.getSelectedKnownConsumers());
        consumerUtilStub.setArchivaAdministration(administrationStub);

        assertNotNull("RepositoryContentConsumers should not be null.", consumerUtilStub);

        return consumerUtilStub;
    }

    @Test
    public void testGetSelectedKnownIds() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedKnownIds[] = new String[] { "create-missing-checksums", "validate-checksum",
                "validate-signature", "index-content", "auto-remove", "auto-rename", "create-archiva-metadata",
                "duplicate-artifacts" };
        //update-db-artifact, create-missing-checksums, update-db-repository-metadata,
        //validate-checksum, validate-signature, index-content, auto-remove, auto-rename,
        //metadata-updater
        List<String> knownConsumers = consumerutil.getSelectedKnownConsumerIds();
        assertNotNull("Known Consumer IDs should not be null", knownConsumers);
        assertEquals("Known Consumer IDs.size " + knownConsumers, expectedKnownIds.length, knownConsumers.size());

        for (String expectedId : expectedKnownIds) {
            assertTrue("Known id [" + expectedId + "] exists.", knownConsumers.contains(expectedId));
        }
    }

    @Test
    public void testGetSelectedInvalidIds() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedInvalidIds[] = new String[] { "update-db-bad-content" };

        List<String> invalidConsumers = consumerutil.getSelectedInvalidConsumerIds();
        assertNotNull("Invalid Consumer IDs should not be null", invalidConsumers);
        assertEquals("Invalid Consumer IDs.size", expectedInvalidIds.length, invalidConsumers.size());

        for (String expectedId : expectedInvalidIds) {
            assertTrue("Invalid id [" + expectedId + "] exists.", invalidConsumers.contains(expectedId));
        }
    }

    @Test
    public void testGetSelectedKnownConsumerMap() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedSelectedKnownIds[] = new String[] { "create-missing-checksums", "validate-checksum",
                "index-content", "auto-remove", "auto-rename" };

        Map<String, KnownRepositoryContentConsumer> knownConsumerMap = consumerutil.getSelectedKnownConsumersMap();
        assertNotNull("Known Consumer Map should not be null", knownConsumerMap);
        assertEquals("Known Consumer Map.size but " + knownConsumerMap, expectedSelectedKnownIds.length,
                knownConsumerMap.size());

        for (String expectedId : expectedSelectedKnownIds) {
            KnownRepositoryContentConsumer consumer = knownConsumerMap.get(expectedId);
            assertNotNull("Known[" + expectedId + "] should not be null.", consumer);
            assertEquals("Known[" + expectedId + "].id", expectedId, consumer.getId());
        }
    }

    @Test
    public void testGetSelectedInvalidConsumerMap() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedSelectedInvalidIds[] = new String[] { "update-db-bad-content" };

        Map<String, InvalidRepositoryContentConsumer> invalidConsumerMap = consumerutil
                .getSelectedInvalidConsumersMap();
        assertNotNull("Invalid Consumer Map should not be null", invalidConsumerMap);
        assertEquals("Invalid Consumer Map.size", expectedSelectedInvalidIds.length, invalidConsumerMap.size());

        for (String expectedId : expectedSelectedInvalidIds) {
            InvalidRepositoryContentConsumer consumer = invalidConsumerMap.get(expectedId);
            assertNotNull("Known[" + expectedId + "] should not be null.", consumer);
            assertEquals("Known[" + expectedId + "].id", expectedId, consumer.getId());
        }
    }

    @Test
    public void testGetAvailableKnownList() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedKnownIds[] = new String[] { "update-db-artifact", "create-missing-checksums",
                "update-db-repository-metadata", "validate-checksum", "index-content", "auto-remove", "auto-rename",
                "available-but-unselected" };

        List<KnownRepositoryContentConsumer> knownConsumers = consumerutil.getAvailableKnownConsumers();
        assertNotNull("known consumers should not be null.", knownConsumers);
        assertEquals("known consumers", expectedKnownIds.length, knownConsumers.size());

        List<String> expectedIds = Arrays.asList(expectedKnownIds);
        for (KnownRepositoryContentConsumer consumer : knownConsumers) {
            assertTrue(
                    "Consumer [" + consumer.getId() + "] returned by .getAvailableKnownConsumers() is unexpected.",
                    expectedIds.contains(consumer.getId()));
        }
    }

    @Test
    public void testGetAvailableInvalidList() throws Exception {
        RepositoryContentConsumers consumerutil = lookupRepositoryConsumers();

        String expectedInvalidIds[] = new String[] { "update-db-bad-content", "move-to-trash-then-notify" };

        List<InvalidRepositoryContentConsumer> invalidConsumers = consumerutil.getAvailableInvalidConsumers();
        assertNotNull("invalid consumers should not be null.", invalidConsumers);
        assertEquals("invalid consumers", expectedInvalidIds.length, invalidConsumers.size());

        List<String> expectedIds = Arrays.asList(expectedInvalidIds);
        for (InvalidRepositoryContentConsumer consumer : invalidConsumers) {
            assertTrue(
                    "Consumer [" + consumer.getId()
                            + "] returned by .getAvailableInvalidConsumers() is unexpected.",
                    expectedIds.contains(consumer.getId()));
        }
    }

    @Test
    public void testExecution() throws Exception {
        IMocksControl knownControl = createNiceControl();

        RepositoryContentConsumers consumers = lookupRepositoryConsumers();
        KnownRepositoryContentConsumer selectedKnownConsumer = knownControl
                .createMock(KnownRepositoryContentConsumer.class);

        KnownRepositoryContentConsumer unselectedKnownConsumer = createNiceControl()
                .createMock(KnownRepositoryContentConsumer.class);

        consumers.setApplicationContext(
                new MockApplicationContext(Arrays.asList(selectedKnownConsumer, unselectedKnownConsumer), null));

        consumers.setSelectedKnownConsumers(Collections.singletonList(selectedKnownConsumer));

        IMocksControl invalidControl = createControl();

        InvalidRepositoryContentConsumer selectedInvalidConsumer = invalidControl
                .createMock(InvalidRepositoryContentConsumer.class);

        InvalidRepositoryContentConsumer unselectedInvalidConsumer = createControl()
                .createMock(InvalidRepositoryContentConsumer.class);

        consumers.setApplicationContext(new MockApplicationContext(null,
                Arrays.asList(selectedInvalidConsumer, unselectedInvalidConsumer)));

        consumers.setSelectedInvalidConsumers(Collections.singletonList(selectedInvalidConsumer));

        ManagedRepository repo = createRepository("id", "name", new File("target/test-repo"));
        File testFile = new File("target/test-repo/path/to/test-file.txt");

        Date startTime = new Date(System.currentTimeMillis());
        startTime.setTime(12345678);

        selectedKnownConsumer.beginScan(repo, startTime, false);
        expect(selectedKnownConsumer.getIncludes()).andReturn(Collections.singletonList("**/*.txt"));
        selectedKnownConsumer.processFile(_OS("path/to/test-file.txt"), false);

        knownControl.replay();

        selectedInvalidConsumer.beginScan(repo, startTime, false);
        invalidControl.replay();

        consumers.executeConsumers(repo, testFile, true);

        knownControl.verify();
        invalidControl.verify();

        knownControl.reset();
        invalidControl.reset();

        File notIncludedTestFile = new File("target/test-repo/path/to/test-file.xml");

        selectedKnownConsumer.beginScan(repo, startTime, false);
        expect(selectedKnownConsumer.getExcludes()).andReturn(Collections.<String>emptyList());

        expect(selectedKnownConsumer.getIncludes()).andReturn(Collections.singletonList("**/*.txt"));

        knownControl.replay();

        selectedInvalidConsumer.beginScan(repo, startTime, false);
        selectedInvalidConsumer.processFile(_OS("path/to/test-file.xml"), false);
        expect(selectedInvalidConsumer.getId()).andReturn("invalid");
        invalidControl.replay();

        consumers.executeConsumers(repo, notIncludedTestFile, true);

        knownControl.verify();
        invalidControl.verify();

        knownControl.reset();
        invalidControl.reset();

        File excludedTestFile = new File("target/test-repo/path/to/test-file.txt");

        selectedKnownConsumer.beginScan(repo, startTime, false);
        expect(selectedKnownConsumer.getExcludes()).andReturn(Collections.singletonList("**/test-file.txt"));
        knownControl.replay();

        selectedInvalidConsumer.beginScan(repo, startTime, false);
        selectedInvalidConsumer.processFile(_OS("path/to/test-file.txt"), false);
        expect(selectedInvalidConsumer.getId()).andReturn("invalid");
        invalidControl.replay();

        consumers.executeConsumers(repo, excludedTestFile, true);

        knownControl.verify();
        invalidControl.verify();
    }

    /**
     * Create an OS specific version of the filepath.
     * Provide path in unix "/" format.
     */
    private String _OS(String path) {
        if (SystemUtils.IS_OS_WINDOWS) {
            return path.replace('/', '\\');
        }
        return path;
    }

    private static Map convertToMap(List objects) {
        HashMap map = new HashMap();
        for (Object o : objects) {
            map.put(o, o);
        }
        return map;
    }

    public class MockApplicationContext implements ApplicationContext {
        private List<KnownRepositoryContentConsumer> knownRepositoryContentConsumer;

        private List<InvalidRepositoryContentConsumer> invalidRepositoryContentConsumers;

        public MockApplicationContext(List<KnownRepositoryContentConsumer> knownRepositoryContentConsumer,
                List<InvalidRepositoryContentConsumer> invalidRepositoryContentConsumers) {
            this.knownRepositoryContentConsumer = knownRepositoryContentConsumer;
            this.invalidRepositoryContentConsumers = invalidRepositoryContentConsumers;
        }

        @Override
        public String getApplicationName() {
            return "foo";
        }

        @Override
        public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String getDisplayName() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String getId() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public ApplicationContext getParent() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public long getStartupDate() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean containsBeanDefinition(String beanName) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public int getBeanDefinitionCount() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String[] getBeanDefinitionNames() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String[] getBeanNamesForType(Class type) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public <T> T getBean(Class<T> aClass, Object... objects) throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Map getBeansOfType(Class type) throws BeansException {
            if (type == KnownRepositoryContentConsumer.class) {
                return convertToMap(knownRepositoryContentConsumer);
            }
            if (type == InvalidRepositoryContentConsumer.class) {
                return convertToMap(invalidRepositoryContentConsumers);
            }
            throw new UnsupportedOperationException("Should not have been called");
        }

        @Override
        public Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit)
                throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean containsBean(String name) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String[] getAliases(String name) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Object getBean(String name) throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Object getBean(String name, Class requiredType) throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Object getBean(String name, Object[] args) throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Class getType(String name) throws NoSuchBeanDefinitionException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public boolean containsLocalBean(String name) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public BeanFactory getParentBeanFactory() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void publishEvent(ApplicationEvent event) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Resource[] getResources(String locationPattern) throws IOException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public ClassLoader getClassLoader() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Resource getResource(String location) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public <T> T getBean(Class<T> tClass) throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> aClass)
                throws BeansException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public <A extends Annotation> A findAnnotationOnBean(String s, Class<A> aClass) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public Environment getEnvironment() {
            return null;
        }

        @Override
        public String[] getBeanNamesForAnnotation(Class<? extends Annotation> aClass) {
            return new String[0];
        }

        @Override
        public void publishEvent(Object o) {
            // no op
        }

        @Override
        public String[] getBeanNamesForType(ResolvableType resolvableType) {
            return new String[0];
        }

        @Override
        public boolean isTypeMatch(String s, ResolvableType resolvableType) throws NoSuchBeanDefinitionException {
            return false;
        }
    }
}