2 * Copyright 2016-2017, Nokia Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm;
19 import java.io.IOException;
21 import okhttp3.Interceptor;
22 import okhttp3.Request;
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.ArgumentCaptor;
27 import org.mockito.InjectMocks;
28 import org.mockito.Mockito;
29 import org.onap.vnfmdriver.model.VnfmInfo;
30 import org.springframework.http.HttpStatus;
32 import static junit.framework.TestCase.*;
33 import static org.mockito.Matchers.eq;
34 import static org.mockito.Mockito.verify;
35 import static org.mockito.Mockito.when;
36 import static org.springframework.test.util.ReflectionTestUtils.setField;
38 public class TestCbamTokenProvider extends TestBase {
40 private static String GOOD_RESPONSE = "{ \"access_token\" : \"myToken\", \"expires_in\" : 1000 }";
42 private CbamTokenProvider cbamTokenProvider;
43 private VnfmInfo vnfmInfo = new VnfmInfo();
44 private HttpTestServer testServer;
46 public static String extractToken(Interceptor token) throws IOException {
47 Interceptor.Chain chain = Mockito.mock(Interceptor.Chain.class);
48 Request request = new Request.Builder().url("http://127.0.0.0/").build();
49 when(chain.request()).thenReturn(request);
50 ArgumentCaptor<Request> re = ArgumentCaptor.forClass(Request.class);
51 when(chain.proceed(re.capture())).thenReturn(null);
52 token.intercept(chain);
53 return re.getValue().header("Authorization").replaceFirst("Bearer ", "");
57 public void initMocks() throws Exception {
58 setField(CbamTokenProvider.class, "logger", logger);
59 setField(cbamTokenProvider, "username", "myUserName");
60 setField(cbamTokenProvider, "password", "myPassword");
61 setField(cbamTokenProvider, "skipCertificateVerification", true);
62 setField(cbamTokenProvider, "skipHostnameVerification", true);
63 when(vnfmInfoProvider.getVnfmInfo(VNFM_ID)).thenReturn(vnfmInfo);
64 vnfmInfo.setPassword("vnfmPassword");
65 vnfmInfo.setUserName("vnfmUserName");
66 vnfmInfo.setUrl("http://127.0.0.3:12345");
67 testServer = new HttpTestServer();
69 URI uri = testServer._server.getURI();
70 setField(cbamTokenProvider, "cbamKeyCloakBaseUrl", uri.toString());
73 private void addGoodTokenResponse() {
74 testServer.respones.add(GOOD_RESPONSE);
75 testServer.codes.add(HttpStatus.OK.value());
79 public void testServer() throws Exception {
84 * a new token is requested no token has been requested before
87 public void testBasicTokenRequest() throws Exception {
89 addGoodTokenResponse();
91 String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
93 assertEquals(1, testServer.requests.size());
94 assertTokenRequest(testServer.requests.get(0));
95 assertEquals("myToken", token);
100 * a new token is requested if the previous token has expired
103 public void testTokenIsRequestedIfPreviousExpired() throws Exception {
105 addGoodTokenResponse();
106 String firstToken = extractToken(cbamTokenProvider.getToken(VNFM_ID));
107 testServer.respones.add("{ \"access_token\" : \"myToken2\", \"expires_in\" : 2000 }");
108 testServer.codes.add(HttpStatus.OK.value());
109 when(systemFunctions.currentTimeMillis()).thenReturn(500L * 1000 + 1L);
111 String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
113 assertEquals(2, testServer.requests.size());
114 assertTokenRequest(testServer.requests.get(0));
115 assertTokenRequest(testServer.requests.get(1));
116 assertEquals("myToken2", token);
120 * a new token is not requested if the previous token has not expired
123 public void testTokenIsNotRequestedIfPreviousHasNotExpired() throws Exception {
125 addGoodTokenResponse();
126 String firstToken = extractToken(cbamTokenProvider.getToken(VNFM_ID));
127 testServer.respones.add("{ \"access_token\" : \"myToken2\", \"expires_in\" : 2000 }");
128 testServer.codes.add(HttpStatus.OK.value());
129 when(systemFunctions.currentTimeMillis()).thenReturn(500L * 1000);
131 String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
133 assertEquals(1, testServer.requests.size());
134 assertTokenRequest(testServer.requests.get(0));
135 assertEquals("myToken", token);
139 * failed token requests are retried for a fixed number amount of times
142 public void testRetry() throws Exception {
148 addGoodTokenResponse();
149 //cbamTokenProvider.failOnRequestNumber = 5;
151 String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
153 assertEquals(5, testServer.requests.size());
154 assertTokenRequest(testServer.requests.get(0));
155 assertTokenRequest(testServer.requests.get(1));
156 assertTokenRequest(testServer.requests.get(2));
157 assertTokenRequest(testServer.requests.get(3));
158 assertTokenRequest(testServer.requests.get(4));
159 verify(logger).warn(eq("Unable to get token to access CBAM API (1/5)"), Mockito.<RuntimeException>any());
160 verify(logger).warn(eq("Unable to get token to access CBAM API (2/5)"), Mockito.<RuntimeException>any());
161 verify(logger).warn(eq("Unable to get token to access CBAM API (3/5)"), Mockito.<RuntimeException>any());
162 verify(logger).warn(eq("Unable to get token to access CBAM API (4/5)"), Mockito.<RuntimeException>any());
163 assertEquals("myToken", token);
167 * failed token requests are retried for a fixed number amount of times (reacing maximal number or retries)
170 public void testNoMoreRetry() throws Exception {
179 cbamTokenProvider.getToken(VNFM_ID);
181 } catch (RuntimeException e) {
182 assertNotNull(e.getCause());
185 assertEquals(5, testServer.requests.size());
186 assertTokenRequest(testServer.requests.get(0));
187 assertTokenRequest(testServer.requests.get(1));
188 assertTokenRequest(testServer.requests.get(2));
189 assertTokenRequest(testServer.requests.get(3));
190 assertTokenRequest(testServer.requests.get(4));
191 verify(logger).warn(eq("Unable to get token to access CBAM API (1/5)"), Mockito.<RuntimeException>any());
192 verify(logger).warn(eq("Unable to get token to access CBAM API (2/5)"), Mockito.<RuntimeException>any());
193 verify(logger).warn(eq("Unable to get token to access CBAM API (3/5)"), Mockito.<RuntimeException>any());
194 verify(logger).warn(eq("Unable to get token to access CBAM API (4/5)"), Mockito.<RuntimeException>any());
195 verify(logger).error(eq("Unable to get token to access CBAM API (giving up retries)"), Mockito.<RuntimeException>any());
198 private void addFailedResponse() {
199 testServer.codes.add(HttpStatus.UNAUTHORIZED.value());
200 testServer.respones.add(new String());
204 private void assertTokenRequest(String body) {
205 assertContains(body, "grant_type", "password");
206 assertContains(body, "client_id", "vnfmUserName");
207 assertContains(body, "client_secret", "vnfmPassword");
208 assertContains(body, "username", "myUserName");
209 assertContains(body, "password", "myPassword");
212 private void assertContains(String content, String key, String value) {
213 assertTrue(content.contains(key + "=" + value));