View Javadoc

1   // Copyright (C) 2005 - 2012 Philip Aston
2   // All rights reserved.
3   //
4   // This file is part of The Grinder software distribution. Refer to
5   // the file LICENSE which is part of The Grinder distribution for
6   // licensing details. The Grinder distribution is available on the
7   // Internet at http://grinder.sourceforge.net/
8   //
9   // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
12  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
13  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
14  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15  // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
16  // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
17  // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
19  // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
20  // OF THE POSSIBILITY OF SUCH DAMAGE.
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   * Unit test for {@link AgentCacheStateImplementation}.
46   *
47   * @author Philip Aston
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 }