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}