001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.camel.fixity;
007
008import org.apache.camel.CamelContext;
009import org.apache.camel.EndpointInject;
010import org.apache.camel.Produce;
011import org.apache.camel.ProducerTemplate;
012import org.apache.camel.builder.AdviceWith;
013import org.apache.camel.component.mock.MockEndpoint;
014import org.apache.camel.model.ModelCamelContext;
015import org.apache.camel.spring.javaconfig.CamelConfiguration;
016import org.apache.commons.io.IOUtils;
017import org.junit.BeforeClass;
018import org.junit.Test;
019import org.junit.runner.RunWith;
020import org.springframework.beans.factory.annotation.Autowired;
021import org.springframework.context.annotation.ComponentScan;
022import org.springframework.context.annotation.Configuration;
023import org.springframework.test.context.ContextConfiguration;
024import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
025import org.springframework.test.context.support.AnnotationConfigContextLoader;
026
027import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
028import static org.apache.camel.util.ObjectHelper.loadResourceAsStream;
029import static org.fcrepo.camel.FcrepoHeaders.FCREPO_URI;
030
031/**
032 * Test the route workflow.
033 *
034 * @author Aaron Coburn
035 * @since 2015-06-18
036 */
037@RunWith(SpringJUnit4ClassRunner.class)
038@ContextConfiguration(classes = {RouteTest.ContextConfig.class}, loader = AnnotationConfigContextLoader.class)
039public class RouteTest {
040
041    private static final long ASSERT_PERIOD_MS = 5000;
042    @EndpointInject("mock:result")
043    protected MockEndpoint resultEndpoint;
044
045    @Produce("direct:start")
046    protected ProducerTemplate template;
047
048    private static final String baseURL = "http://localhost/rest";
049    private static final String identifier = "/file1";
050
051    @Autowired
052    private CamelContext camelContext;
053
054    @Autowired
055    private FcrepoFixityConfig config;
056
057    @BeforeClass
058    public static void beforeClass() {
059        System.setProperty("fixity.failure", "mock:failure");
060        System.setProperty("fixity.success", "mock:success");
061        System.setProperty("fixity.input.stream", "seda:foo");
062        System.setProperty("fixity.enabled", "true");
063
064    }
065
066    @Test
067    public void testBinaryFixitySuccess() throws Exception {
068
069        final var context = camelContext.adapt(ModelCamelContext.class);
070        AdviceWith.adviceWith(context, "FcrepoFixity", a -> {
071            a.replaceFromWith("direct:start");
072            a.mockEndpointsAndSkip("fcrepo:*");
073        });
074
075        final var failureEndpoint = MockEndpoint.resolve(camelContext, config.getFixityFailure());
076        failureEndpoint.expectedMessageCount(0);
077        failureEndpoint.setAssertPeriod(ASSERT_PERIOD_MS);
078        final var successEndpoint = MockEndpoint.resolve(camelContext, config.getFixitySuccess());
079        successEndpoint.expectedMessageCount(1);
080
081        final String body = IOUtils.toString(loadResourceAsStream("fixity.rdf"), "UTF-8");
082        template.sendBodyAndHeader(body, FCREPO_URI, baseURL + identifier);
083
084        assertIsSatisfied(failureEndpoint, successEndpoint);
085    }
086
087    @Test
088    public void testBinaryFixityFailure() throws Exception {
089        final var context = camelContext.adapt(ModelCamelContext.class);
090        AdviceWith.adviceWith(context, "FcrepoFixity", a -> {
091            a.replaceFromWith("direct:start");
092            a.mockEndpointsAndSkip("fcrepo:*");
093        });
094
095        final var failureEndpoint = MockEndpoint.resolve(camelContext, "mock:failure");
096        failureEndpoint.expectedMessageCount(1);
097        final var successEndpoint = MockEndpoint.resolve(camelContext, "mock:success");
098        successEndpoint.expectedMessageCount(0);
099        successEndpoint.setAssertPeriod(ASSERT_PERIOD_MS);
100
101        final String body = IOUtils.toString(loadResourceAsStream("fixityFailure.rdf"), "UTF-8");
102        template.sendBodyAndHeader(body, FCREPO_URI, baseURL + identifier);
103
104        assertIsSatisfied(failureEndpoint, successEndpoint);
105    }
106
107    @Test
108    public void testNonBinary() throws Exception {
109        final var context = camelContext.adapt(ModelCamelContext.class);
110        AdviceWith.adviceWith(context, "FcrepoFixity", a -> {
111            a.replaceFromWith("direct:start");
112            a.mockEndpointsAndSkip("fcrepo:*");
113        });
114
115        final var failureEndpoint = MockEndpoint.resolve(camelContext, "mock:failure");
116        failureEndpoint.expectedMessageCount(0);
117        failureEndpoint.setAssertPeriod(ASSERT_PERIOD_MS);
118        final var successEndpoint = MockEndpoint.resolve(camelContext, "mock:success");
119        successEndpoint.expectedMessageCount(0);
120        successEndpoint.setAssertPeriod(ASSERT_PERIOD_MS);
121
122        final String body = IOUtils.toString(loadResourceAsStream("container.rdf"), "UTF-8");
123        template.sendBodyAndHeader(body, FCREPO_URI, baseURL + identifier);
124        assertIsSatisfied(failureEndpoint, successEndpoint);
125    }
126
127    @Configuration
128    @ComponentScan(resourcePattern = "**/Fcrepo*.class")
129    static class ContextConfig extends CamelConfiguration {
130    }
131}