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
        authenticateExtraUser();
79
        IRemotingProgressMonitor monitor = progressMonitorService.getRemotingMonitor(uuid);
80
        Assert.assertNull(monitor);
81

    
82
    }
83

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

    
109
        }
110
    }
111

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

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

    
142
                } catch (IllegalStateException e) {
143

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

    
150
        progressMonitorService.interrupt(uuid);
151

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

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

    
157
    }
158

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

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

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

    
182
                }
183
            }
184

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

    
193
    }
194

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

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

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

    
219
    }
220

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

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

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

    
238
        feebackGenerators.remove(1);
239

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

    
258
        }
259
    }
260

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

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

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

    
276
        expectedMonitor.done();
277

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

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

    
298
        }
299
    }
300

    
301

    
302
    class MockPostMoniteredOperationEnabled implements IPostMoniteredOperationEnabled {
303

    
304
        private RemotingProgressMonitor expectedMonitor;
305
        private UUID monitorUuid;
306

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

    
332
    class MockFeedbackGenerator implements IFeedbackGenerator {
333

    
334
        private String feedback;
335
        private long waitTime;
336

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

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

    
357
    }
358
}
(3-3/4)