1   package net.sf.fleet.test;
2   
3   import java.net.URI;
4   import java.net.URISyntaxException;
5   
6   import net.sf.fleet.exceptions.FleetConfigurationException;
7   import net.sf.fleet.interceptor.Interceptor;
8   import net.sf.fleet.interceptor.InterceptorController;
9   import net.sf.fleet.interceptor.InterceptorPipeline;
10  import net.sf.fleet.interceptor.impl.InterceptorPipelineImpl;
11  
12  import org.testng.annotations.Test;
13  import static org.easymock.EasyMock.*;
14  import static org.testng.Assert.*;
15  
16  public class InterceptorPipelineTest {
17  
18  	@Test
19  	public void testEmptyPipeline() {
20  		InterceptorPipeline<Object> lPipe = new InterceptorPipelineImpl<Object>();
21  		
22  		Object lReturn = new Object();
23  		Object lContext = new Object();
24  		Object[] lParams = new Object[0];
25  		
26  		InterceptorController<Object> lController = createMockTerminalController(lReturn, lContext, lParams);
27  		
28  		assertSame(lPipe.intercept(lController, lContext, lParams),lReturn);
29  		
30  		verify(lController);
31  	}
32  	
33  	@Test
34  	public void testSimplePipeline() throws URISyntaxException {
35  		InterceptorPipeline<Object> lPipe = new InterceptorPipelineImpl<Object>();
36  		
37  		Object lReturn = new Object();
38  		Object lContext = new Object();
39  		Object[] lParams = new Object[0];
40  		
41  		InterceptorController<Object> lController = createMockTerminalController(lReturn, lContext, lParams);
42  		final Runnable lExecutionVerifier= createMock(Runnable.class);
43  		lExecutionVerifier.run();
44  		replay(lExecutionVerifier);
45  		
46  		lPipe.addInterceptor(new Interceptor<Object>() {
47  			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
48  				lExecutionVerifier.run();
49  				return pNext.intercept(pContext, pParameters);
50  			}
51  		}, new URI("dummy:interceptor"));
52  		
53  		assertSame(lPipe.intercept(lController, lContext, lParams),lReturn);
54  		
55  		verify(lController);
56  		verify(lExecutionVerifier);
57  	}
58  	
59  	@Test
60  	public void testOrderedPipeline() throws URISyntaxException {
61  		InterceptorPipeline<Object> lPipe = new InterceptorPipelineImpl<Object>();
62  		
63  		Object lReturn = new Object();
64  		Object lContext = new Object();
65  		Object[] lParams = new Object[0];
66  		
67  		InterceptorController<Object> lController = createMockTerminalController(lReturn, lContext, lParams);
68  		final TripleExecutionVerifier lVerifier = createStrictMock(TripleExecutionVerifier.class);
69  		lVerifier.one();
70  		lVerifier.two();
71  		lVerifier.three();
72  		replay(lVerifier);
73  		
74  		lPipe.addInterceptor(new Interceptor<Object>() {
75  			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
76  				lVerifier.two();
77  				return pNext.intercept(pContext, pParameters);
78  			}
79  		}, new URI("dummy:interceptor2"));
80  		
81  		lPipe.addInterceptor(new Interceptor<Object>() {
82  			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
83  				lVerifier.three();
84  				return pNext.intercept(pContext, pParameters);
85  			}
86  		}, new URI("dummy:interceptor3")).placeAfter(new URI("dummy:interceptor2"),new URI("dummy:DNE1"));
87  		
88  		lPipe.addInterceptor(new Interceptor<Object>() {
89  			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
90  				lVerifier.one();
91  				return pNext.intercept(pContext, pParameters);
92  			}
93  		}, new URI("dummy:interceptor1")).placeBefore(new URI("dummy:interceptor2"),new URI("dummy:DNE2"));
94  		
95  		assertSame(lPipe.intercept(lController, lContext, lParams),lReturn);
96  		
97  		verify(lController);
98  		verify(lVerifier);
99  	}
100 	
101 	@SuppressWarnings("unchecked")
102 	@Test
103 	public void testCyclicPipelineThrowsException() throws URISyntaxException {
104 		InterceptorPipeline<Object> lPipe = new InterceptorPipelineImpl<Object>();
105 		
106 		Object lContext = new Object();
107 		Object[] lParams = new Object[0];
108 		
109 		InterceptorController<Object> lController = createMock(InterceptorController.class);
110 		replay(lController);
111 		
112 		lPipe.addInterceptor(new Interceptor<Object>() {
113 			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
114 				return pNext.intercept(pContext, pParameters);
115 			}
116 		}, new URI("dummy:interceptor2"));
117 		
118 		lPipe.addInterceptor(new Interceptor<Object>() {
119 			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
120 				return pNext.intercept(pContext, pParameters);
121 			}
122 		}, new URI("dummy:interceptor3")).placeAfter(new URI("dummy:interceptor2")).placeBefore(new URI("dummy:interceptor1"));
123 		
124 		lPipe.addInterceptor(new Interceptor<Object>() {
125 			public Object intercept(InterceptorController<Object> pNext, Object pContext, Object[] pParameters) {
126 				return pNext.intercept(pContext, pParameters);
127 			}
128 		}, new URI("dummy:interceptor1")).placeBefore(new URI("dummy:interceptor2"));
129 		
130 		try {
131 			lPipe.intercept(lController, lContext, lParams);
132 			fail("Expected FleetConfigurationException to be thrown, as a result of an attempt to set up cyclic interceptors.");
133 		} catch (FleetConfigurationException e) {
134 			// expected.
135 		}
136 		// check that the pipeline didn't even attempt to call the target service.
137 		verify(lController);
138 	}
139 	
140 	private interface TripleExecutionVerifier {
141 		void one();
142 		void two();
143 		void three();
144 	}
145 
146 	@SuppressWarnings("unchecked")
147 	private InterceptorController<Object> createMockTerminalController(Object lReturn, Object lContext, Object[] lParams) {
148 		InterceptorController<Object> lController = createMock(InterceptorController.class);
149 		expect(lController.intercept(lContext, lParams)).andReturn(lReturn);
150 		
151 		replay(lController);
152 		return lController;
153 	}
154 	
155 }