1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package net.grinder.console.distribution;
23
24 import java.beans.PropertyChangeEvent;
25 import java.beans.PropertyChangeListener;
26 import java.io.File;
27 import java.util.regex.Pattern;
28
29 import net.grinder.common.processidentity.ProcessReport;
30 import net.grinder.console.common.processidentity.StubAgentProcessReport;
31 import net.grinder.console.communication.ProcessControl;
32 import net.grinder.console.communication.StubProcessReports;
33 import net.grinder.console.communication.ProcessControl.Listener;
34 import net.grinder.console.communication.ProcessControl.ProcessReports;
35 import net.grinder.console.distribution.AgentSet.OutOfDateException;
36 import net.grinder.engine.agent.StubAgentIdentity;
37 import net.grinder.messages.agent.CacheHighWaterMark;
38 import net.grinder.messages.console.AgentAddress;
39 import net.grinder.testutility.AbstractFileTestCase;
40 import net.grinder.testutility.RandomStubFactory;
41 import net.grinder.util.Directory;
42
43
44
45
46
47
48
49 public class TestAgentCacheStateImplementation extends AbstractFileTestCase {
50
51 private final RandomStubFactory<ProcessControl> m_processControlStubFactory =
52 RandomStubFactory.create(ProcessControl.class);
53 private final ProcessControl m_processControl =
54 m_processControlStubFactory.getStub();
55
56 private Directory m_directory;
57 private Pattern m_pattern;
58
59 protected void setUp() throws Exception {
60 m_directory = new Directory(new File(""));
61 m_pattern = Pattern.compile(".*");
62 }
63
64 public void testAgentCacheStateImplementation() throws Exception {
65
66 final UpdateableAgentCacheState cacheState =
67 new AgentCacheStateImplementation(
68 m_processControl, m_directory, m_pattern);
69
70 final CacheParameters cacheParameters = cacheState.getCacheParameters();
71 assertEquals(m_directory, cacheParameters.getDirectory());
72 assertEquals(m_pattern.pattern(),
73 cacheParameters.getFileFilterPattern().pattern());
74
75 cacheState.setDirectory(m_directory);
76 cacheState.setFileFilterPattern(m_pattern);
77
78 assertEquals(cacheParameters, cacheState.getCacheParameters());
79 }
80
81 public void testProcessUpdates() throws Exception {
82
83 final UpdateableAgentCacheState cacheState =
84 new AgentCacheStateImplementation(
85 m_processControl, m_directory, m_pattern);
86
87 final Listener processListener =
88 (Listener) m_processControlStubFactory.assertSuccess(
89 "addProcessStatusListener", Listener.class).getParameters()[0];
90 m_processControlStubFactory.assertNoMoreCalls();
91
92 final RandomStubFactory<PropertyChangeListener> listenerStubFactory =
93 RandomStubFactory.create(PropertyChangeListener.class);
94
95 cacheState.addListener(listenerStubFactory.getStub());
96
97 assertFalse(cacheState.getOutOfDate());
98
99 processListener.update(new ProcessReports[0]);
100 assertFalse(cacheState.getOutOfDate());
101 listenerStubFactory.assertNoMoreCalls();
102
103 processListener.update(new ProcessReports[0]);
104
105 assertFalse(cacheState.getOutOfDate());
106 listenerStubFactory.assertNoMoreCalls();
107
108 final StubAgentIdentity agentIdentity1 = new StubAgentIdentity("agent1");
109 final StubAgentProcessReport agentReport1 =
110 new StubAgentProcessReport(agentIdentity1, ProcessReport.State.RUNNING);
111
112 processListener.update(new ProcessReports[] {
113 new StubProcessReports(agentReport1, null),
114 });
115
116 assertTrue(cacheState.getOutOfDate());
117
118 final PropertyChangeEvent propertyChangeEvent2 =
119 (PropertyChangeEvent)
120 listenerStubFactory.assertSuccess(
121 "propertyChange", PropertyChangeEvent.class).getParameters()[0];
122 listenerStubFactory.assertNoMoreCalls();
123
124 assertEquals("outOfDate", propertyChangeEvent2.getPropertyName());
125 assertEquals(Boolean.FALSE, propertyChangeEvent2.getOldValue());
126 assertEquals(Boolean.TRUE, propertyChangeEvent2.getNewValue());
127
128 final CacheHighWaterMark highWaterMark =
129 cacheState.getCacheParameters().createHighWaterMark(1000);
130
131 agentReport1.setCacheHighWaterMark(highWaterMark);
132
133 processListener.update(new ProcessReports[] {
134 new StubProcessReports(agentReport1, null),
135 });
136
137 assertFalse(cacheState.getOutOfDate());
138 listenerStubFactory.assertSuccess(
139 "propertyChange", PropertyChangeEvent.class);
140 listenerStubFactory.assertNoMoreCalls();
141
142 cacheState.setNewFileTime(1000);
143
144 processListener.update(new ProcessReports[] {
145 new StubProcessReports(agentReport1, null),
146 });
147
148 assertFalse(cacheState.getOutOfDate());
149 listenerStubFactory.assertNoMoreCalls();
150
151 cacheState.setNewFileTime(1500);
152
153 processListener.update(new ProcessReports[] {
154 new StubProcessReports(agentReport1, null),
155 });
156
157 assertTrue(cacheState.getOutOfDate());
158 listenerStubFactory.assertSuccess(
159 "propertyChange", PropertyChangeEvent.class);
160 listenerStubFactory.assertNoMoreCalls();
161 }
162
163 public void testAgentSetValidity() throws Exception {
164 final UpdateableAgentCacheState cacheState =
165 new AgentCacheStateImplementation(
166 m_processControl, m_directory, m_pattern);
167
168 final AgentSet agentSet = cacheState.getAgentSet();
169
170 assertNotNull(agentSet.getAddressOfAllAgents());
171 assertNotNull(agentSet.getAddressOfOutOfDateAgents(123));
172 assertEquals(-1, agentSet.getEarliestAgentTime());
173
174 cacheState.setDirectory(new Directory(new File("abc")));
175
176 try {
177 agentSet.getAddressOfAllAgents();
178 fail("Expected OutOfDateException");
179 }
180 catch (OutOfDateException e) {
181 }
182
183 try {
184 agentSet.getAddressOfOutOfDateAgents(123);
185 fail("Expected OutOfDateException");
186 }
187 catch (OutOfDateException e) {
188 }
189
190 final AgentSet agentSet2 = cacheState.getAgentSet();
191
192 assertNotNull(agentSet2.getAddressOfAllAgents());
193 assertNotNull(agentSet2.getAddressOfOutOfDateAgents(123));
194
195 cacheState.setFileFilterPattern(Pattern.compile(".?"));
196
197 try {
198 agentSet.getAddressOfAllAgents();
199 fail("Expected OutOfDateException");
200 }
201 catch (OutOfDateException e) {
202 }
203
204 try {
205 agentSet.getAddressOfOutOfDateAgents(123);
206 fail("Expected OutOfDateException");
207 }
208 catch (OutOfDateException e) {
209 }
210
211 assertEquals(-1, agentSet2.getEarliestAgentTime());
212 }
213
214 public void testAgentSetGetAddressOfAllAgents() throws Exception {
215 final UpdateableAgentCacheState cacheState =
216 new AgentCacheStateImplementation(
217 m_processControl, m_directory, m_pattern);
218
219 final Listener processListener =
220 (Listener) m_processControlStubFactory.assertSuccess(
221 "addProcessStatusListener", Listener.class).getParameters()[0];
222 m_processControlStubFactory.assertNoMoreCalls();
223
224 final StubAgentIdentity agentIdentity1 = new StubAgentIdentity("agent1");
225 final StubAgentProcessReport agentReport1 =
226 new StubAgentProcessReport(agentIdentity1, ProcessReport.State.RUNNING);
227
228 assertFalse(cacheState.getAgentSet().getAddressOfAllAgents().includes(
229 new AgentAddress(agentIdentity1)));
230
231 processListener.update(new ProcessReports[] {
232 new StubProcessReports(agentReport1, null),
233 });
234
235 assertTrue(cacheState.getAgentSet().getAddressOfAllAgents().includes(
236 new AgentAddress(agentIdentity1)));
237 }
238
239 public void testAgentSetGetAddressOfOutOfDateAgents() throws Exception {
240 final UpdateableAgentCacheState cacheState =
241 new AgentCacheStateImplementation(
242 m_processControl, m_directory, m_pattern);
243
244 final Listener processListener =
245 (Listener) m_processControlStubFactory.assertSuccess(
246 "addProcessStatusListener", Listener.class).getParameters()[0];
247 m_processControlStubFactory.assertNoMoreCalls();
248
249 final StubAgentIdentity agentIdentity1 = new StubAgentIdentity("agent1");
250 final StubAgentProcessReport agentReport1 =
251 new StubAgentProcessReport(agentIdentity1, ProcessReport.State.RUNNING);
252
253 assertFalse(
254 cacheState.getAgentSet().getAddressOfOutOfDateAgents(100).includes(
255 new AgentAddress(agentIdentity1)));
256
257 processListener.update(new ProcessReports[] {
258 new StubProcessReports(agentReport1, null),
259 });
260
261 assertTrue(
262 cacheState.getAgentSet().getAddressOfOutOfDateAgents(100).includes(
263 new AgentAddress(agentIdentity1)));
264
265 final CacheHighWaterMark highWaterMark =
266 cacheState.getCacheParameters().createHighWaterMark(1000);
267
268 agentReport1.setCacheHighWaterMark(highWaterMark);
269
270 processListener.update(new ProcessReports[] {
271 new StubProcessReports(agentReport1, null),
272 });
273
274 assertTrue(
275 cacheState.getAgentSet().getAddressOfOutOfDateAgents(1001).includes(
276 new AgentAddress(agentIdentity1)));
277
278 assertFalse(
279 cacheState.getAgentSet().getAddressOfOutOfDateAgents(1000).includes(
280 new AgentAddress(agentIdentity1)));
281 }
282 }