Project

General

Profile

Download (14.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2015 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
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.
8
 */
9
package eu.etaxonomy.taxeditor.service;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.List;
14
import java.util.UUID;
15

    
16
import org.apache.log4j.Logger;
17
import org.eclipse.core.runtime.NullProgressMonitor;
18
import org.eclipse.core.runtime.SubMonitor;
19
import org.junit.After;
20
import org.junit.Assert;
21
import org.junit.Ignore;
22
import org.junit.Test;
23

    
24
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
25
import eu.etaxonomy.cdm.api.service.IProgressMonitorService;
26
import eu.etaxonomy.cdm.api.service.ITestService;
27
import eu.etaxonomy.cdm.api.service.UpdateResult;
28
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
29
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitor;
30
import eu.etaxonomy.taxeditor.httpinvoker.RemotingSessionAwareTest;
31
import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
32
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
33
import eu.etaxonomy.taxeditor.store.CdmStore;
34

    
35
/**
36
 * @author cmathew
37
 * @date 22 Oct 2015
38
 *
39
 */
40
public class ProgressMonitorServiceTest extends RemotingSessionAwareTest {
41

    
42
    private static final Logger logger = Logger.getLogger(ProgressMonitorServiceTest.class);
43

    
44
    ITestService testService =  getRemoteApplicationController().getTestService();
45

    
46
    IProgressMonitorService progressMonitorService = getRemoteApplicationController().getProgressMonitorService();
47

    
48

    
49

    
50
    @After
51
    public void revertAuthentication() {
52
        authenticateDefaultUser();
53
    }
54

    
55
    @Test
56
    public void testMonitLongRunningMethod() throws InterruptedException {
57
        UUID uuid = testService.monitLongRunningMethod(null, null, 0);
58
        int pollInterval = 1000;
59
        RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
60
        expectedMonitor.setResult("Success");
61
        expectedMonitor.addReport("Report");
62
        expectedMonitor.done();
63
        CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
64
                uuid,
65
                pollInterval,
66
                new MockPostMoniteredOperationEnabled(expectedMonitor, uuid),
67
                (IFeedbackGenerator)null,
68
                SubMonitor.convert(new NullProgressMonitor()));
69
    }
70

    
71
    @Test
72
    @Ignore
73
    public void testMonitLongRunningMethodByChangingUser() throws InterruptedException {
74

    
75
        IllegalStateException ise = new IllegalStateException("IllegalStateException");
76

    
77
        UUID uuid = testService.monitLongRunningMethod(ise, null, 0);
78

    
79
        authenticateExtraUser();
80
        IRemotingProgressMonitor monitor = progressMonitorService.getRemotingMonitor(uuid);
81
        Assert.assertNull(monitor);
82

    
83
    }
84

    
85
    @Test
86
    public void testMonitLongRunningMethodWithException() throws InterruptedException {
87
        IllegalStateException ise = new IllegalStateException("IllegalStateException");
88
        UUID uuid = testService.monitLongRunningMethod(ise, null, 0);
89
        int pollInterval = 1000;
90
        RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
91
        expectedMonitor.setResult(ise);
92
        expectedMonitor.setIsFailed(true);
93
        expectedMonitor.done();
94
        try {
95
            CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
96
                    uuid,
97
                    pollInterval,
98
                    new MockPostMoniteredOperationEnabled(expectedMonitor, uuid),
99
                    (IFeedbackGenerator)null,
100
                    SubMonitor.convert(new NullProgressMonitor()));
101
            if (expectedMonitor.getResult() instanceof UpdateResult){
102
                UpdateResult result = (UpdateResult)expectedMonitor.getResult();
103
                if (!result.getExceptions().contains(ise)){
104
                    Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
105
                }
106
            }
107
//            Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
108
        } catch(IllegalStateException e) {
109

    
110
        }
111
    }
112

    
113
    @Test
114
    public void testMonitLongRunningMethodWithInterrupt() {
115
        IllegalStateException ise = new IllegalStateException("Interrupted Exception");
116
        final UUID uuid = testService.monitLongRunningMethod(ise, null, 0);
117
        final int pollInterval = 1000;
118
        final RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
119
        expectedMonitor.setResult(ise);
120
        expectedMonitor.setCanceled(true);
121
        expectedMonitor.setIsFailed(true);
122
        expectedMonitor.done();
123

    
124
        Thread thread = new Thread() {
125
            @Override
126
            public void run() {
127
                try {
128
                    CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
129
                            uuid,
130
                            pollInterval,
131
                            null,
132
                            (IFeedbackGenerator)null,
133
                            SubMonitor.convert(new NullProgressMonitor()));
134
                    if (expectedMonitor.getResult() instanceof UpdateResult){
135
                        UpdateResult result = (UpdateResult)expectedMonitor.getResult();
136
                        if (!result.getExceptions().contains(ise)){
137
                            Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
138
                        }
139
                    }
140
//                    Assert.fail("InterruptedException wrapped in an IllegalStateException should be thrown");
141
                } catch (InterruptedException e) {
142

    
143
                } catch (IllegalStateException e) {
144

    
145
                }
146
            }
147
        };
148
        thread.start();
149
        while(!progressMonitorService.isMonitorThreadRunning(uuid)) {}
150

    
151
        progressMonitorService.interrupt(uuid);
152

    
153
        while(progressMonitorService.isMonitorThreadRunning(uuid)) {}
154

    
155
        IRemotingProgressMonitor remotingMonitor = progressMonitorService.getRemotingMonitor(uuid);
156
        new MockPostMoniteredOperationEnabled(expectedMonitor, uuid).postOperation(remotingMonitor);
157

    
158
    }
159

    
160
    @Test
161
    public void testMonitLongRunningMethodWithCancellation() throws InterruptedException {
162

    
163
        final UUID uuid = testService.monitLongRunningMethod(null, null, 0);
164
        final int pollInterval = 1000;
165
        final RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
166
        expectedMonitor.setResult("Cancelled");
167
        expectedMonitor.setCanceled(true);
168
        expectedMonitor.done();
169
        SubMonitor subMonitor = SubMonitor.convert(new NullProgressMonitor());
170

    
171
        Thread thread = new Thread() {
172
            @Override
173
            public void run() {
174
                try {
175
                    CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
176
                            uuid,
177
                            pollInterval,
178
                            null,
179
                            (IFeedbackGenerator)null,
180
                            subMonitor);
181
                } catch (InterruptedException e) {
182

    
183
                }
184
            }
185

    
186
        };
187
        thread.start();
188
        while(!progressMonitorService.isMonitorThreadRunning(uuid)) {}
189
        progressMonitorService.cancel(uuid);
190
        while(progressMonitorService.isMonitorThreadRunning(uuid)) {}
191
        IRemotingProgressMonitor remotingMonitor = progressMonitorService.getRemotingMonitor(uuid);
192
        new MockPostMoniteredOperationEnabled(expectedMonitor, uuid).postOperation(remotingMonitor);
193

    
194
    }
195

    
196
    @Test
197
    public void testMonitLongRunningMethodWithWaitForFeedback() throws InterruptedException {
198

    
199
        List<String> feedbacks = Arrays.asList("feedback1", "feedback2");
200
        List<IFeedbackGenerator> feebackGenerators = new ArrayList<IFeedbackGenerator>();
201
        final RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
202
        expectedMonitor.setResult("Success");
203
        for(String feedback : feedbacks) {
204
            feebackGenerators.add(new MockFeedbackGenerator(feedback, 0));
205
            expectedMonitor.addReport(feedback);
206
        }
207
        expectedMonitor.addReport("Report");
208
        expectedMonitor.done();
209

    
210
        final UUID uuid = testService.monitLongRunningMethod(null, feedbacks, 0);
211
        final int pollInterval = 1000;
212
        SubMonitor subMonitor = SubMonitor.convert(new NullProgressMonitor());
213
        CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
214
                uuid,
215
                pollInterval,
216
                new MockPostMoniteredOperationEnabled(expectedMonitor, uuid),
217
                feebackGenerators,
218
                subMonitor);
219

    
220
    }
221

    
222
    @Test
223
    public void testMonitLongRunningMethodWithInconsistentWaitForFeedback() throws InterruptedException {
224

    
225
        List<String> feedbacks = Arrays.asList("feedback1", "feedback2");
226
        List<IFeedbackGenerator> feebackGenerators = new ArrayList<IFeedbackGenerator>();
227
        final RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
228
        expectedMonitor.setResult("Success");
229
        for(String feedback : feedbacks) {
230
            feebackGenerators.add(new MockFeedbackGenerator(feedback, 0));
231
            expectedMonitor.addReport(feedback);
232
        }
233
        expectedMonitor.addReport("Report");
234
        expectedMonitor.done();
235

    
236
        final UUID uuid = testService.monitLongRunningMethod(null, feedbacks, 0);
237
        final int pollInterval = 1000;
238

    
239
        feebackGenerators.remove(1);
240

    
241
        final UUID newUuid = testService.monitLongRunningMethod(null, feedbacks, 0);
242
        SubMonitor subMonitor = SubMonitor.convert(new NullProgressMonitor());
243
        try {
244
            CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
245
                    newUuid,
246
                    pollInterval,
247
                    new MockPostMoniteredOperationEnabled(expectedMonitor, newUuid),
248
                    feebackGenerators,
249
                    subMonitor);
250
            if (expectedMonitor.getResult() instanceof UpdateResult){
251
                UpdateResult result = (UpdateResult)expectedMonitor.getResult();
252
                if (result.getExceptions().isEmpty()){
253
                    Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
254
                }
255
            }
256
//            Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
257
        } catch(IllegalStateException ise) {
258

    
259
        }
260
    }
261

    
262
    @Test
263
    public void testMonitLongRunningMethodWithWaitForFeedbackTimeout() throws InterruptedException {
264

    
265
        List<String> feedbacks = Arrays.asList("feedback1");
266
        List<IFeedbackGenerator> feebackGenerators = new ArrayList<IFeedbackGenerator>();
267
        final RemotingProgressMonitor expectedMonitor = new RemotingProgressMonitor();
268
        expectedMonitor.setResult(new IllegalStateException(new InterruptedException()));
269
        for(String feedback : feedbacks) {
270
            feebackGenerators.add(new MockFeedbackGenerator(feedback, 1000 * 15));
271

    
272
        }
273
        expectedMonitor.setCanceled(true);
274
        expectedMonitor.setIsFailed(true);
275
        expectedMonitor.done();
276

    
277
        expectedMonitor.done();
278

    
279
        final UUID uuid = testService.monitLongRunningMethod(null, feedbacks, 1000 * 5);
280
        final int pollInterval = 1000;
281

    
282
        SubMonitor subMonitor = SubMonitor.convert(new NullProgressMonitor());
283
        try {
284
            CdmStore.getProgressMonitorClientManager().pollMonitor("Testing Progress Monitor",
285
                    uuid,
286
                    pollInterval,
287
                    new MockPostMoniteredOperationEnabled(expectedMonitor, uuid),
288
                    feebackGenerators,
289
                    subMonitor);
290
            if (expectedMonitor.getResult() instanceof UpdateResult){
291
                UpdateResult result = (UpdateResult)expectedMonitor.getResult();
292
                if (result.getExceptions().isEmpty()){
293
                    Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
294
                }
295
            }
296
//            Assert.fail("Exception due to inconsistent number of feedback generators not thrown");
297
        } catch(IllegalStateException ise) {
298

    
299
        }
300
    }
301

    
302

    
303
    class MockPostMoniteredOperationEnabled implements IPostMoniteredOperationEnabled {
304

    
305
        private RemotingProgressMonitor expectedMonitor;
306
        private UUID monitorUuid;
307

    
308
        public MockPostMoniteredOperationEnabled(RemotingProgressMonitor expectedMonitor, UUID monitorUuid) {
309
            this.expectedMonitor = expectedMonitor;
310
            this.monitorUuid = monitorUuid;
311
        }
312
        /**
313
         * {@inheritDoc}
314
         */
315
        @Override
316
        public void postOperation(IRemotingProgressMonitor monitor) {
317
            if(expectedMonitor.getResult() instanceof Exception) {
318
                Exception expectedException = (Exception) expectedMonitor.getResult();
319
                Exception exception = (Exception) monitor.getResult();
320
                Assert.assertEquals(expectedException.getClass(), expectedException.getClass());
321
                Assert.assertEquals(expectedException.getMessage(), expectedException.getMessage());
322
            } else {
323
                Assert.assertEquals(expectedMonitor.getResult(), monitor.getResult());
324
            }
325
            Assert.assertEquals(expectedMonitor.getReports(), monitor.getReports());
326
            Assert.assertEquals(expectedMonitor.isCanceled(), monitor.isCanceled());
327
            Assert.assertEquals(expectedMonitor.isFailed(), monitor.isFailed());
328
            Assert.assertEquals(expectedMonitor.isDone(), monitor.isDone());
329
            Assert.assertTrue(!progressMonitorService.isMonitorThreadRunning(monitorUuid));
330
        }
331
    }
332

    
333
    class MockFeedbackGenerator implements IFeedbackGenerator {
334

    
335
        private String feedback;
336
        private long waitTime;
337

    
338
        public MockFeedbackGenerator(String feedback, long waitTime) {
339
            this.feedback = feedback;
340
            this.waitTime = waitTime;
341
        }
342

    
343
        /**
344
         * {@inheritDoc}
345
         */
346
        @Override
347
        public void setFeedbackForMonitor(UUID uuid) {
348
            if(waitTime > 0) {
349
                try {
350
                    Thread.sleep(waitTime);
351
                } catch (InterruptedException e) {
352
                    e.printStackTrace();
353
                }
354
            }
355
            CdmApplicationState.getCurrentAppConfig().getProgressMonitorService().setFeedback(uuid, feedback);
356
        }
357

    
358
    }
359
}
(3-3/4)