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
135 }
136
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 }