1
2
3
4
5 package mockit;
6
7 import static org.junit.jupiter.api.Assertions.assertEquals;
8 import static org.junit.jupiter.api.Assertions.assertFalse;
9 import static org.junit.jupiter.api.Assertions.assertNotNull;
10 import static org.junit.jupiter.api.Assertions.assertNull;
11 import static org.junit.jupiter.api.Assertions.assertThrows;
12 import static org.junit.jupiter.api.Assertions.assertTrue;
13
14 import java.util.Collections;
15 import java.util.Map;
16
17 import javax.security.auth.Subject;
18 import javax.security.auth.callback.CallbackHandler;
19 import javax.security.auth.login.AppConfigurationEntry;
20 import javax.security.auth.login.Configuration;
21 import javax.security.auth.login.LoginContext;
22 import javax.security.auth.login.LoginException;
23 import javax.security.auth.spi.LoginModule;
24
25 import org.junit.jupiter.api.Test;
26
27 public final class MockLoginContextTest {
28
29 @Test
30 public void mockJREMethodAndConstructorUsingAnnotatedMockClass() throws Exception {
31 new MockLoginContext();
32
33 new LoginContext("test", (CallbackHandler) null).login();
34 }
35
36 public static class MockLoginContext extends MockUp<LoginContext> {
37 @Mock
38 public void $init(String name, CallbackHandler callbackHandler) {
39 assertEquals("test", name);
40 assertNull(callbackHandler);
41 }
42
43 @Mock
44 public void login() {
45 }
46
47 @Mock
48 public Subject getSubject() {
49 return null;
50 }
51 }
52
53 @Test
54 public void mockJREMethodAndConstructorWithMockUpClass() throws Exception {
55 new MockUp<LoginContext>() {
56 @Mock
57 void $init(String name) {
58 assertEquals("test", name);
59 }
60
61 @Mock
62 void login() throws LoginException {
63 throw new LoginException();
64 }
65 };
66
67 assertThrows(LoginException.class, () -> {
68 new LoginContext("test").login();
69 });
70 }
71
72 @Test
73 public void mockJREClassWithStubs() throws Exception {
74 new MockLoginContextWithStubs();
75
76 LoginContext context = new LoginContext("");
77 context.login();
78 context.logout();
79 }
80
81 final class MockLoginContextWithStubs extends MockUp<LoginContext> {
82 @Mock
83 void $init(String s) {
84 }
85
86 @Mock
87 void logout() {
88 }
89
90 @Mock
91 void login() {
92 }
93 }
94
95 @Test
96 public void proceedIntoRealImplementationsOfMockedMethods() throws Exception {
97
98 Configuration configuration = new Configuration() {
99 @Override
100 public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
101 Map<String, ?> options = Collections.emptyMap();
102 return new AppConfigurationEntry[] { new AppConfigurationEntry(TestLoginModule.class.getName(),
103 AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT, options) };
104 }
105 };
106 LoginContext loginContext = new LoginContext("test", null, null, configuration);
107
108
109 ProceedingMockLoginContext mockInstance = new ProceedingMockLoginContext();
110
111
112 assertNull(loginContext.getSubject());
113 loginContext.login();
114 assertNotNull(loginContext.getSubject());
115 assertTrue(mockInstance.loggedIn);
116
117 mockInstance.ignoreLogout = true;
118 loginContext.logout();
119 assertTrue(mockInstance.loggedIn);
120
121 mockInstance.ignoreLogout = false;
122 loginContext.logout();
123 assertFalse(mockInstance.loggedIn);
124 }
125
126 static final class ProceedingMockLoginContext extends MockUp<LoginContext> {
127 boolean ignoreLogout;
128 boolean loggedIn;
129
130 @Mock
131 void login(Invocation inv) throws LoginException {
132 LoginContext it = inv.getInvokedInstance();
133
134 try {
135 inv.proceed();
136 loggedIn = true;
137 } finally {
138 it.getSubject();
139 }
140 }
141
142 @Mock
143 void logout(Invocation inv) throws LoginException {
144 if (!ignoreLogout) {
145 inv.proceed();
146 loggedIn = false;
147 }
148 }
149 }
150
151 public static class TestLoginModule implements LoginModule {
152 @Override
153 public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
154 Map<String, ?> options) {
155 }
156
157 @Override
158 public boolean login() {
159 return true;
160 }
161
162 @Override
163 public boolean commit() {
164 return true;
165 }
166
167 @Override
168 public boolean abort() {
169 return false;
170 }
171
172 @Override
173 public boolean logout() {
174 return true;
175 }
176 }
177 }