1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kcb.service.impl;
17
18 import org.apache.commons.lang.RandomStringUtils;
19 import org.junit.Assert;
20 import org.junit.Test;
21 import org.kuali.rice.kcb.bo.MessageDelivery;
22 import org.kuali.rice.kcb.bo.MessageDeliveryStatus;
23 import org.kuali.rice.kcb.api.message.MessageDTO;
24 import org.kuali.rice.kcb.quartz.MessageProcessingJob;
25 import org.kuali.rice.kcb.test.KCBTestCase;
26 import org.kuali.rice.ksb.service.KSBServiceLocator;
27 import org.kuali.rice.test.BaselineTestCase.BaselineMode;
28 import org.kuali.rice.test.BaselineTestCase.Mode;
29 import org.quartz.JobExecutionContext;
30 import org.quartz.JobExecutionException;
31 import org.quartz.SchedulerException;
32 import org.quartz.listeners.JobListenerSupport;
33 import org.springframework.transaction.support.TransactionSynchronizationManager;
34
35 import java.util.Collection;
36 import java.util.concurrent.CountDownLatch;
37 import java.util.concurrent.TimeUnit;
38
39 import static org.junit.Assert.*;
40
41
42
43
44
45
46
47
48
49
50
51
52 @BaselineMode(Mode.CLEAR_DB)
53 public class MessagingServiceTest extends KCBTestCase {
54 private CountDownLatch signal = new CountDownLatch(1);
55
56 @Override
57 public void setUp() throws Exception {
58 super.setUp();
59
60 services.getRecipientPreferenceService().saveRecipientDelivererConfig("testuser5", "mock", new String[] { "Test Channel #1" });
61 services.getRecipientPreferenceService().saveRecipientDelivererConfig("testuser5", "sms", new String[] { "Test Channel #1" });
62 services.getRecipientPreferenceService().saveRecipientDelivererConfig("testuser5", "broken", new String[] { "Test Channel #1" });
63 services.getRecipientPreferenceService().saveRecipientDelivererConfig("testuser5", "bogus", new String[] { "Test Channel #1" });
64
65 assertEquals(4, services.getRecipientPreferenceService().getDeliverersForRecipientAndChannel("testuser5", "Test Channel #1").size());
66 }
67
68 protected long deliver() throws Exception {
69 MessageDTO message = new MessageDTO();
70 message.setContent("test content 1");
71 message.setChannel("Test Channel #1");
72 message.setContentType("test content type 1");
73 message.setDeliveryType("test delivery type 1");
74 message.setRecipient("testuser5");
75 message.setTitle("test title 1");
76 message.setOriginId("origin id");
77
78 registerJobListener();
79
80 long id = services.getMessagingService().deliver(message);
81
82 waitForNextJobCompletion();
83
84 Collection<MessageDelivery> deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
85 assertNotNull(deliveries);
86 int delivCount = services.getRecipientPreferenceService().getDeliverersForRecipientAndChannel("testuser5", "Test Channel #1").size();
87 assertEquals(delivCount, deliveries.size());
88 assertTrue(deliveries.size() > 0);
89 int failed = 0;
90 for (MessageDelivery delivery: deliveries) {
91 if ("broken".equals(delivery.getDelivererTypeName()) || "bogus".equals(delivery.getDelivererTypeName())) {
92 assertEquals(MessageDeliveryStatus.UNDELIVERED.name(), delivery.getDeliveryStatus());
93 assertEquals(1, delivery.getProcessCount().intValue());
94 failed++;
95 } else {
96 assertEquals(MessageDeliveryStatus.DELIVERED.name(), delivery.getDeliveryStatus());
97 }
98 }
99
100 assertEquals(2, failed);
101
102
103
104 waitForNextJobCompletion();
105
106 failed = 0;
107 deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
108 for (MessageDelivery delivery: deliveries) {
109 if ("broken".equals(delivery.getDelivererTypeName()) || "bogus".equals(delivery.getDelivererTypeName())) {
110 assertEquals(MessageDeliveryStatus.UNDELIVERED.name(), delivery.getDeliveryStatus());
111 assertEquals(2, delivery.getProcessCount().intValue());
112 failed++;
113 } else {
114 assertEquals(MessageDeliveryStatus.DELIVERED.name(), delivery.getDeliveryStatus());
115 }
116 }
117
118 assertEquals(2, failed);
119
120 waitForNextJobCompletion();
121
122 failed = 0;
123 deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
124 for (MessageDelivery delivery: deliveries) {
125 if ("broken".equals(delivery.getDelivererTypeName()) || "bogus".equals(delivery.getDelivererTypeName())) {
126 assertEquals(MessageDeliveryStatus.UNDELIVERED.name(), delivery.getDeliveryStatus());
127 assertEquals(3, delivery.getProcessCount().intValue());
128 failed++;
129 } else {
130 assertEquals(MessageDeliveryStatus.DELIVERED.name(), delivery.getDeliveryStatus());
131 }
132 }
133
134 assertEquals(2, failed);
135
136
137
138 waitForNextJobCompletion();
139
140 failed = 0;
141 deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
142 for (MessageDelivery delivery: deliveries) {
143 if ("broken".equals(delivery.getDelivererTypeName()) || "bogus".equals(delivery.getDelivererTypeName())) {
144 assertEquals(MessageDeliveryStatus.UNDELIVERED.name(), delivery.getDeliveryStatus());
145 assertEquals(3, delivery.getProcessCount().intValue());
146 failed++;
147 } else {
148 assertEquals(MessageDeliveryStatus.DELIVERED.name(), delivery.getDeliveryStatus());
149 }
150 }
151
152 assertEquals(2, failed);
153
154 return id;
155 }
156
157 @Test
158 public void testDeliver() throws Exception {
159 Assert.assertFalse(TransactionSynchronizationManager.isActualTransactionActive());
160
161 deliver();
162 }
163
164 @Test
165 public void testDismiss() throws Exception {
166 Assert.assertFalse(TransactionSynchronizationManager.isActualTransactionActive());
167
168 long id = deliver();
169
170 registerJobListener();
171
172 services.getMessagingService().remove(id, "a user", "a cause");
173
174 waitForNextJobCompletion();
175
176 Collection<MessageDelivery> deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
177 assertNotNull(deliveries);
178
179 assertEquals(2, deliveries.size());
180 for (MessageDelivery d: deliveries) {
181 assertTrue("broken".equals(d.getDelivererTypeName()) || "bogus".equals(d.getDelivererTypeName()));
182 }
183 }
184
185 @Test
186 public void testDismissByOriginId() throws Exception {
187 Assert.assertFalse(TransactionSynchronizationManager.isActualTransactionActive());
188
189 long id = deliver();
190
191 registerJobListener();
192
193 services.getMessagingService().removeByOriginId("origin id", "a user", "a cause");
194
195 waitForNextJobCompletion();
196
197 Collection<MessageDelivery> deliveries = services.getMessageDeliveryService().getAllMessageDeliveries();
198 assertNotNull(deliveries);
199
200 assertEquals(2, deliveries.size());
201
202
203 assertEquals(2, deliveries.size());
204 for (MessageDelivery d: deliveries) {
205 assertTrue("broken".equals(d.getDelivererTypeName()) || "bogus".equals(d.getDelivererTypeName()));
206 }
207 }
208
209 protected void registerJobListener() throws SchedulerException {
210 KSBServiceLocator.getScheduler().addGlobalJobListener(new JobListenerSupport() {
211 @Override
212 public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
213 log.info("Job was executed: " + context);
214 if (MessageProcessingJob.NAME.equals(context.getJobDetail().getName())) {
215 signal.countDown();
216 }
217 }
218 public String getName() {
219 return System.currentTimeMillis() + RandomStringUtils.randomAlphanumeric(10);
220 }
221 });
222 }
223
224 protected void waitForNextJobCompletion() throws InterruptedException {
225 log.info("Waiting for job to complete...");
226 signal.await(100, TimeUnit.SECONDS);
227 signal = new CountDownLatch(1);
228 log.info("Job completed...");
229 }
230 }