View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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          // Create objects to be exercised by the code under test:
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         // Set up mocks:
109         ProceedingMockLoginContext mockInstance = new ProceedingMockLoginContext();
110 
111         // Exercise the code under test:
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 }