1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.rice.kew.preferences;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.List;
22
23 import org.junit.Test;
24 import org.kuali.rice.kew.preferences.service.PreferencesService;
25 import org.kuali.rice.kew.service.KEWServiceLocator;
26 import org.kuali.rice.kew.test.KEWTestCase;
27 import org.kuali.rice.kew.useroptions.UserOptions;
28 import org.kuali.rice.kew.useroptions.UserOptionsService;
29 import org.kuali.rice.kim.bo.entity.KimPrincipal;
30 import org.springframework.transaction.TransactionStatus;
31 import org.springframework.transaction.support.TransactionCallback;
32 import org.springframework.transaction.support.TransactionTemplate;
33
34
35 public class PreferencesServiceTest extends KEWTestCase {
36
37
38
39
40
41
42 @Test public void testPreferencesDefaultSave() throws Exception {
43
44
45 final UserOptionsService userOptionsService = KEWServiceLocator.getUserOptionsService();
46 KimPrincipal principal = KEWServiceLocator.getIdentityHelperService().getPrincipalByPrincipalName("rkirkend");
47 Collection userOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
48 assertTrue("UserOptions should be empty", userOptions.isEmpty());
49
50 PreferencesService preferencesService = KEWServiceLocator.getPreferencesService();
51 Preferences preferences = preferencesService.getPreferences(principal.getPrincipalId());
52 assertTrue("Preferences should require a save.", preferences.isRequiresSave());
53
54 userOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
55 assertTrue("UserOptions should not empty", userOptions.isEmpty());
56
57 preferencesService.savePreferences(principal.getPrincipalId(), preferences);
58 userOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
59 assertTrue("UserOptions should not be empty", !userOptions.isEmpty());
60
61 preferences = preferencesService.getPreferences(principal.getPrincipalId());
62 assertFalse("Preferences should NOT require a save.", preferences.isRequiresSave());
63
64
65 final UserOptions refreshRateOption = userOptionsService.findByOptionId("REFRESH_RATE", principal.getPrincipalId());
66 assertNotNull("REFRESH_RATE option should exist.", refreshRateOption);
67 TransactionTemplate template = new TransactionTemplate(KEWServiceLocator.getPlatformTransactionManager());
68 template.execute(new TransactionCallback() {
69 public Object doInTransaction(TransactionStatus status) {
70 userOptionsService.deleteUserOptions(refreshRateOption);
71 return null;
72 }
73 });
74 assertNull("REFRESH_RATE option should no longer exist.", userOptionsService.findByOptionId("REFRESH_RATE", principal.getPrincipalId()));
75
76 preferences = preferencesService.getPreferences(principal.getPrincipalId());
77 assertTrue("Preferences should now require a save again.", preferences.isRequiresSave());
78
79
80 template.execute(new TransactionCallback() {
81 public Object doInTransaction(TransactionStatus status) {
82 userOptionsService.save(refreshRateOption);
83 return null;
84 }
85 });
86 preferences = preferencesService.getPreferences(principal.getPrincipalId());
87 assertFalse("Preferences should no longer require a save.", preferences.isRequiresSave());
88 }
89
90
91
92
93
94
95 @Test public void testPreferencesConcurrentDefaultSave() throws Throwable {
96
97 final UserOptionsService userOptionsService = KEWServiceLocator.getUserOptionsService();
98 final KimPrincipal principal = KEWServiceLocator.getIdentityHelperService().getPrincipalByPrincipalName("rkirkend");
99 Collection userOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
100 assertTrue("UserOptions should be empty", userOptions.isEmpty());
101
102 final PreferencesService preferencesService = KEWServiceLocator.getPreferencesService();
103 Runnable getPrefRunnable = new Runnable() {
104 public void run() {
105 Preferences preferences = preferencesService.getPreferences(principal.getPrincipalId());
106 assertTrue("Preferences should require a save.", preferences.isRequiresSave());
107 Collection updatedOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
108 assertTrue("UserOptions should be empty", updatedOptions.isEmpty());
109 }
110 };
111 final List<Throwable> errors = new ArrayList<Throwable>();
112 Thread.UncaughtExceptionHandler ueh = new Thread.UncaughtExceptionHandler() {
113 public void uncaughtException(Thread thread, Throwable error) {
114 errors.add(error);
115 }
116 };
117
118
119 Thread t1 = new Thread(getPrefRunnable);
120 Thread t2 = new Thread(getPrefRunnable);
121 Thread t3 = new Thread(getPrefRunnable);
122 t1.setUncaughtExceptionHandler(ueh);
123 t2.setUncaughtExceptionHandler(ueh);
124 t3.setUncaughtExceptionHandler(ueh);
125 t1.start();
126 t2.start();
127 t3.start();
128 t1.join();
129 t2.join();
130 t3.join();
131
132 if (errors.size() > 0) {
133 throw errors.iterator().next();
134 }
135
136 Preferences preferences = preferencesService.getPreferences(principal.getPrincipalId());
137 assertTrue("Preferences should require a save.", preferences.isRequiresSave());
138 Collection updatedOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
139 assertTrue("UserOptions should be empty", updatedOptions.isEmpty());
140 preferencesService.savePreferences(principal.getPrincipalId(), preferences);
141 updatedOptions = userOptionsService.findByWorkflowUser(principal.getPrincipalId());
142 assertTrue("UserOptions should not be empty", !updatedOptions.isEmpty());
143
144 }
145 }