3 * Copyright (C) 2015 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.service
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
19 import org
.junit
.After
;
20 import org
.junit
.Assert
;
21 import org
.junit
.Test
;
23 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
24 import eu
.etaxonomy
.cdm
.api
.service
.IProgressMonitorService
;
25 import eu
.etaxonomy
.cdm
.api
.service
.ITestService
;
26 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
27 import eu
.etaxonomy
.cdm
.common
.monitor
.RemotingProgressMonitor
;
28 import eu
.etaxonomy
.taxeditor
.httpinvoker
.RemotingSessionAwareTest
;
29 import eu
.etaxonomy
.taxeditor
.operation
.IFeedbackGenerator
;
30 import eu
.etaxonomy
.taxeditor
.operation
.IPostMoniteredOperationEnabled
;
31 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
38 public class ProgressMonitorServiceTest
extends RemotingSessionAwareTest
{
40 private static final Logger logger
= Logger
.getLogger(ProgressMonitorServiceTest
.class);
42 ITestService testService
= getRemoteApplicationController().getTestService();
44 IProgressMonitorService progressMonitorService
= getRemoteApplicationController().getProgressMonitorService();
49 public void revertAuthentication() {
50 authenticateDefaultUser();
54 public void testMonitLongRunningMethod() throws InterruptedException
{
55 UUID uuid
= testService
.monitLongRunningMethod(null, null, 0);
56 int pollInterval
= 1000;
57 RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
58 expectedMonitor
.setResult("Success");
59 expectedMonitor
.addReport("Report");
60 expectedMonitor
.done();
61 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
64 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
65 (IFeedbackGenerator
)null,
66 new NullProgressMonitor());
70 public void testMonitLongRunningMethodByChangingUser() throws InterruptedException
{
72 IllegalStateException ise
= new IllegalStateException("IllegalStateException");
73 UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
74 authenticateExtraUser();
75 IRemotingProgressMonitor monitor
= progressMonitorService
.getRemotingMonitor(uuid
);
76 Assert
.assertNull(monitor
);
81 public void testMonitLongRunningMethodWithException() throws InterruptedException
{
82 IllegalStateException ise
= new IllegalStateException("IllegalStateException");
83 UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
84 int pollInterval
= 1000;
85 RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
86 expectedMonitor
.setResult(ise
);
87 expectedMonitor
.setIsFailed(true);
88 expectedMonitor
.done();
90 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
93 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
94 (IFeedbackGenerator
)null,
95 new NullProgressMonitor());
96 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
97 } catch(IllegalStateException e
) {
103 public void testMonitLongRunningMethodWithInterrupt() {
104 IllegalStateException ise
= new IllegalStateException("Interrupted Exception");
105 final UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
106 final int pollInterval
= 1000;
107 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
108 expectedMonitor
.setResult(ise
);
109 expectedMonitor
.setCanceled(true);
110 expectedMonitor
.setIsFailed(true);
111 expectedMonitor
.done();
113 Thread thread
= new Thread() {
117 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
121 (IFeedbackGenerator
)null,
122 new NullProgressMonitor());
123 Assert
.fail("InterruptedException wrapped in an IllegalStateException should be thrown");
124 } catch (InterruptedException e
) {
126 } catch (IllegalStateException e
) {
132 while(!progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
134 progressMonitorService
.interrupt(uuid
);
136 while(progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
138 IRemotingProgressMonitor remotingMonitor
= progressMonitorService
.getRemotingMonitor(uuid
);
139 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
).postOperation(remotingMonitor
);
144 public void testMonitLongRunningMethodWithCancellation() throws InterruptedException
{
146 final UUID uuid
= testService
.monitLongRunningMethod(null, null, 0);
147 final int pollInterval
= 1000;
148 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
149 expectedMonitor
.setResult("Cancelled");
150 expectedMonitor
.setCanceled(true);
151 expectedMonitor
.done();
153 Thread thread
= new Thread() {
157 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
161 (IFeedbackGenerator
)null,
162 new NullProgressMonitor());
163 } catch (InterruptedException e
) {
170 while(!progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
171 progressMonitorService
.cancel(uuid
);
172 while(progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
173 IRemotingProgressMonitor remotingMonitor
= progressMonitorService
.getRemotingMonitor(uuid
);
174 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
).postOperation(remotingMonitor
);
179 public void testMonitLongRunningMethodWithWaitForFeedback() throws InterruptedException
{
181 List
<String
> feedbacks
= Arrays
.asList("feedback1", "feedback2");
182 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
183 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
184 expectedMonitor
.setResult("Success");
185 for(String feedback
: feedbacks
) {
186 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 0));
187 expectedMonitor
.addReport(feedback
);
189 expectedMonitor
.addReport("Report");
190 expectedMonitor
.done();
192 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
193 final int pollInterval
= 1000;
195 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
198 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
200 new NullProgressMonitor());
205 public void testMonitLongRunningMethodWithInconsistentWaitForFeedback() throws InterruptedException
{
207 List
<String
> feedbacks
= Arrays
.asList("feedback1", "feedback2");
208 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
209 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
210 expectedMonitor
.setResult("Success");
211 for(String feedback
: feedbacks
) {
212 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 0));
213 expectedMonitor
.addReport(feedback
);
215 expectedMonitor
.addReport("Report");
216 expectedMonitor
.done();
218 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
219 final int pollInterval
= 1000;
221 feebackGenerators
.remove(1);
223 final UUID newUuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
226 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
229 new MockPostMoniteredOperationEnabled(expectedMonitor
, newUuid
),
231 new NullProgressMonitor());
232 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
233 } catch(IllegalStateException ise
) {
239 public void testMonitLongRunningMethodWithWaitForFeedbackTimeout() throws InterruptedException
{
241 List
<String
> feedbacks
= Arrays
.asList("feedback1");
242 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
243 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
244 expectedMonitor
.setResult(new IllegalStateException(new InterruptedException()));
245 for(String feedback
: feedbacks
) {
246 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 1000 * 15));
249 expectedMonitor
.setCanceled(true);
250 expectedMonitor
.setIsFailed(true);
251 expectedMonitor
.done();
253 expectedMonitor
.done();
255 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 1000 * 5);
256 final int pollInterval
= 1000;
260 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
263 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
265 new NullProgressMonitor());
266 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
267 } catch(IllegalStateException ise
) {
273 class MockPostMoniteredOperationEnabled
implements IPostMoniteredOperationEnabled
{
275 private RemotingProgressMonitor expectedMonitor
;
276 private UUID monitorUuid
;
278 public MockPostMoniteredOperationEnabled(RemotingProgressMonitor expectedMonitor
, UUID monitorUuid
) {
279 this.expectedMonitor
= expectedMonitor
;
280 this.monitorUuid
= monitorUuid
;
286 public void postOperation(IRemotingProgressMonitor monitor
) {
287 if(expectedMonitor
.getResult() instanceof Exception
) {
288 Exception expectedException
= (Exception
) expectedMonitor
.getResult();
289 Exception exception
= (Exception
) monitor
.getResult();
290 Assert
.assertEquals(expectedException
.getClass(), expectedException
.getClass());
291 Assert
.assertEquals(expectedException
.getMessage(), expectedException
.getMessage());
293 Assert
.assertEquals(expectedMonitor
.getResult(), monitor
.getResult());
295 Assert
.assertEquals(expectedMonitor
.getReports(), monitor
.getReports());
296 Assert
.assertEquals(expectedMonitor
.isCanceled(), monitor
.isCanceled());
297 Assert
.assertEquals(expectedMonitor
.isFailed(), monitor
.isFailed());
298 Assert
.assertEquals(expectedMonitor
.isDone(), monitor
.isDone());
299 Assert
.assertTrue(!progressMonitorService
.isMonitorThreadRunning(monitorUuid
));
303 class MockFeedbackGenerator
implements IFeedbackGenerator
{
305 private String feedback
;
306 private long waitTime
;
308 public MockFeedbackGenerator(String feedback
, long waitTime
) {
309 this.feedback
= feedback
;
310 this.waitTime
= waitTime
;
317 public void setFeedbackForMonitor(UUID uuid
) {
320 Thread
.sleep(waitTime
);
321 } catch (InterruptedException e
) {
325 CdmApplicationState
.getCurrentAppConfig().getProgressMonitorService().setFeedback(uuid
, feedback
);