2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.taxeditor
.service
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Arrays
;
13 import java
.util
.List
;
14 import java
.util
.UUID
;
16 import org
.apache
.log4j
.Logger
;
17 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
18 import org
.junit
.After
;
19 import org
.junit
.Assert
;
20 import org
.junit
.Test
;
22 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IProgressMonitorService
;
24 import eu
.etaxonomy
.cdm
.api
.service
.ITestService
;
25 import eu
.etaxonomy
.cdm
.common
.monitor
.IRemotingProgressMonitor
;
26 import eu
.etaxonomy
.cdm
.common
.monitor
.RemotingProgressMonitor
;
27 import eu
.etaxonomy
.taxeditor
.httpinvoker
.RemotingSessionAwareTest
;
28 import eu
.etaxonomy
.taxeditor
.operation
.IFeedbackGenerator
;
29 import eu
.etaxonomy
.taxeditor
.operation
.IPostMoniteredOperationEnabled
;
30 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
37 public class ProgressMonitorServiceTest
extends RemotingSessionAwareTest
{
39 private static final Logger logger
= Logger
.getLogger(ProgressMonitorServiceTest
.class);
41 ITestService testService
= getRemoteApplicationController().getTestService();
43 IProgressMonitorService progressMonitorService
= getRemoteApplicationController().getProgressMonitorService();
48 public void revertAuthentication() {
49 authenticateDefaultUser();
53 public void testMonitLongRunningMethod() throws InterruptedException
{
54 UUID uuid
= testService
.monitLongRunningMethod(null, null, 0);
55 int pollInterval
= 1000;
56 RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
57 expectedMonitor
.setResult("Success");
58 expectedMonitor
.addReport("Report");
59 expectedMonitor
.done();
60 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
63 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
64 (IFeedbackGenerator
)null,
65 new NullProgressMonitor());
69 public void testMonitLongRunningMethodByChangingUser() throws InterruptedException
{
71 IllegalStateException ise
= new IllegalStateException("IllegalStateException");
72 UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
73 authenticateExtraUser();
74 IRemotingProgressMonitor monitor
= progressMonitorService
.getRemotingMonitor(uuid
);
75 Assert
.assertNull(monitor
);
80 public void testMonitLongRunningMethodWithException() throws InterruptedException
{
81 IllegalStateException ise
= new IllegalStateException("IllegalStateException");
82 UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
83 int pollInterval
= 1000;
84 RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
85 expectedMonitor
.setResult(ise
);
86 expectedMonitor
.setIsFailed(true);
87 expectedMonitor
.done();
89 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
92 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
93 (IFeedbackGenerator
)null,
94 new NullProgressMonitor());
95 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
96 } catch(IllegalStateException e
) {
102 public void testMonitLongRunningMethodWithInterrupt() {
103 IllegalStateException ise
= new IllegalStateException("Interrupted Exception");
104 final UUID uuid
= testService
.monitLongRunningMethod(ise
, null, 0);
105 final int pollInterval
= 1000;
106 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
107 expectedMonitor
.setResult(ise
);
108 expectedMonitor
.setCanceled(true);
109 expectedMonitor
.setIsFailed(true);
110 expectedMonitor
.done();
112 Thread thread
= new Thread() {
116 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
120 (IFeedbackGenerator
)null,
121 new NullProgressMonitor());
122 Assert
.fail("InterruptedException wrapped in an IllegalStateException should be thrown");
123 } catch (InterruptedException e
) {
125 } catch (IllegalStateException e
) {
131 while(!progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
133 progressMonitorService
.interrupt(uuid
);
135 while(progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
137 IRemotingProgressMonitor remotingMonitor
= progressMonitorService
.getRemotingMonitor(uuid
);
138 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
).postOperation(remotingMonitor
);
143 public void testMonitLongRunningMethodWithCancellation() throws InterruptedException
{
145 final UUID uuid
= testService
.monitLongRunningMethod(null, null, 0);
146 final int pollInterval
= 1000;
147 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
148 expectedMonitor
.setResult("Cancelled");
149 expectedMonitor
.setCanceled(true);
150 expectedMonitor
.done();
152 Thread thread
= new Thread() {
156 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
160 (IFeedbackGenerator
)null,
161 new NullProgressMonitor());
162 } catch (InterruptedException e
) {
169 while(!progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
170 progressMonitorService
.cancel(uuid
);
171 while(progressMonitorService
.isMonitorThreadRunning(uuid
)) {}
172 IRemotingProgressMonitor remotingMonitor
= progressMonitorService
.getRemotingMonitor(uuid
);
173 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
).postOperation(remotingMonitor
);
178 public void testMonitLongRunningMethodWithWaitForFeedback() throws InterruptedException
{
180 List
<String
> feedbacks
= Arrays
.asList("feedback1", "feedback2");
181 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
182 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
183 expectedMonitor
.setResult("Success");
184 for(String feedback
: feedbacks
) {
185 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 0));
186 expectedMonitor
.addReport(feedback
);
188 expectedMonitor
.addReport("Report");
189 expectedMonitor
.done();
191 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
192 final int pollInterval
= 1000;
194 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
197 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
199 new NullProgressMonitor());
204 public void testMonitLongRunningMethodWithInconsistentWaitForFeedback() throws InterruptedException
{
206 List
<String
> feedbacks
= Arrays
.asList("feedback1", "feedback2");
207 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
208 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
209 expectedMonitor
.setResult("Success");
210 for(String feedback
: feedbacks
) {
211 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 0));
212 expectedMonitor
.addReport(feedback
);
214 expectedMonitor
.addReport("Report");
215 expectedMonitor
.done();
217 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
218 final int pollInterval
= 1000;
220 feebackGenerators
.remove(1);
222 final UUID newUuid
= testService
.monitLongRunningMethod(null, feedbacks
, 0);
225 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
228 new MockPostMoniteredOperationEnabled(expectedMonitor
, newUuid
),
230 new NullProgressMonitor());
231 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
232 } catch(IllegalStateException ise
) {
238 public void testMonitLongRunningMethodWithWaitForFeedbackTimeout() throws InterruptedException
{
240 List
<String
> feedbacks
= Arrays
.asList("feedback1");
241 List
<IFeedbackGenerator
> feebackGenerators
= new ArrayList
<IFeedbackGenerator
>();
242 final RemotingProgressMonitor expectedMonitor
= new RemotingProgressMonitor();
243 expectedMonitor
.setResult(new IllegalStateException(new InterruptedException()));
244 for(String feedback
: feedbacks
) {
245 feebackGenerators
.add(new MockFeedbackGenerator(feedback
, 1000 * 15));
248 expectedMonitor
.setCanceled(true);
249 expectedMonitor
.setIsFailed(true);
250 expectedMonitor
.done();
252 expectedMonitor
.done();
254 final UUID uuid
= testService
.monitLongRunningMethod(null, feedbacks
, 1000 * 5);
255 final int pollInterval
= 1000;
259 CdmStore
.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
262 new MockPostMoniteredOperationEnabled(expectedMonitor
, uuid
),
264 new NullProgressMonitor());
265 Assert
.fail("Exception due to inconsistent number of feedback generators not thrown");
266 } catch(IllegalStateException ise
) {
272 class MockPostMoniteredOperationEnabled
implements IPostMoniteredOperationEnabled
{
274 private RemotingProgressMonitor expectedMonitor
;
275 private UUID monitorUuid
;
277 public MockPostMoniteredOperationEnabled(RemotingProgressMonitor expectedMonitor
, UUID monitorUuid
) {
278 this.expectedMonitor
= expectedMonitor
;
279 this.monitorUuid
= monitorUuid
;
285 public void postOperation(IRemotingProgressMonitor monitor
) {
286 if(expectedMonitor
.getResult() instanceof Exception
) {
287 Exception expectedException
= (Exception
) expectedMonitor
.getResult();
288 Exception exception
= (Exception
) monitor
.getResult();
289 Assert
.assertEquals(expectedException
.getClass(), expectedException
.getClass());
290 Assert
.assertEquals(expectedException
.getMessage(), expectedException
.getMessage());
292 Assert
.assertEquals(expectedMonitor
.getResult(), monitor
.getResult());
294 Assert
.assertEquals(expectedMonitor
.getReports(), monitor
.getReports());
295 Assert
.assertEquals(expectedMonitor
.isCanceled(), monitor
.isCanceled());
296 Assert
.assertEquals(expectedMonitor
.isFailed(), monitor
.isFailed());
297 Assert
.assertEquals(expectedMonitor
.isDone(), monitor
.isDone());
298 Assert
.assertTrue(!progressMonitorService
.isMonitorThreadRunning(monitorUuid
));
302 class MockFeedbackGenerator
implements IFeedbackGenerator
{
304 private String feedback
;
305 private long waitTime
;
307 public MockFeedbackGenerator(String feedback
, long waitTime
) {
308 this.feedback
= feedback
;
309 this.waitTime
= waitTime
;
316 public void setFeedbackForMonitor(UUID uuid
) {
319 Thread
.sleep(waitTime
);
320 } catch (InterruptedException e
) {
324 CdmApplicationState
.getCurrentAppConfig().getProgressMonitorService().setFeedback(uuid
, feedback
);