Project

General

Profile

Download (14.4 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.Test;
22

    
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.api.service.UpdateResult;
27
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
28
import eu.etaxonomy.cdm.common.monitor.RemotingProgressMonitor;
29
import eu.etaxonomy.taxeditor.httpinvoker.RemotingSessionAwareTest;
30
import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator;
31
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
32
import eu.etaxonomy.taxeditor.store.CdmStore;
33

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

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

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

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

    
47

    
48

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

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

    
70
    @Test
71
    public void testMonitLongRunningMethodByChangingUser() throws InterruptedException {
72

    
73
        IllegalStateException ise = new IllegalStateException("IllegalStateException");
74

    
75
        UUID uuid = testService.monitLongRunningMethod(ise, null, 0);
76
        authenticateExtraUser();
77
        IRemotingProgressMonitor monitor = progressMonitorService.getRemotingMonitor(uuid);
78
        Assert.assertNull(monitor);
79

    
80
    }
81

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

    
107
        }
108
    }
109

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

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

    
140
                } catch (IllegalStateException e) {
141

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

    
148
        progressMonitorService.interrupt(uuid);
149

    
150
        while(progressMonitorService.isMonitorThreadRunning(uuid)) {}
151

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

    
155
    }
156

    
157
    @Test
158
    public void testMonitLongRunningMethodWithCancellation() throws InterruptedException {
159

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

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

    
180
                }
181
            }
182

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

    
191
    }
192

    
193
    @Test
194
    public void testMonitLongRunningMethodWithWaitForFeedback() throws InterruptedException {
195

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

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

    
217
    }
218

    
219
    @Test
220
    public void testMonitLongRunningMethodWithInconsistentWaitForFeedback() throws InterruptedException {
221

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

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

    
236
        feebackGenerators.remove(1);
237

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

    
256
        }
257
    }
258

    
259
    @Test
260
    public void testMonitLongRunningMethodWithWaitForFeedbackTimeout() throws InterruptedException {
261

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

    
269
        }
270
        expectedMonitor.setCanceled(true);
271
        expectedMonitor.setIsFailed(true);
272
        expectedMonitor.done();
273

    
274
        expectedMonitor.done();
275

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

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

    
296
        }
297
    }
298

    
299

    
300
    class MockPostMoniteredOperationEnabled implements IPostMoniteredOperationEnabled {
301

    
302
        private RemotingProgressMonitor expectedMonitor;
303
        private UUID monitorUuid;
304

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

    
330
    class MockFeedbackGenerator implements IFeedbackGenerator {
331

    
332
        private String feedback;
333
        private long waitTime;
334

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

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

    
355
    }
356
}
(3-3/4)