Removing jackson to mitigate cve-2017-4995
[vfc/nfvo/driver/vnfm/svnfm.git] / nokiav2 / driver / src / test / java / org / onap / vfc / nfvo / driver / vnfm / svnfm / nokia / vnfm / TestCbamTokenProvider.java
1 /*
2  * Copyright 2016-2017, Nokia Corporation
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm;
18
19 import java.io.IOException;
20 import java.net.URI;
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;
31
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;
37
38 public class TestCbamTokenProvider extends TestBase {
39
40     private static String GOOD_RESPONSE = "{ \"access_token\" : \"myToken\", \"expires_in\" : 1000 }";
41     @InjectMocks
42     private CbamTokenProvider cbamTokenProvider;
43     private VnfmInfo vnfmInfo = new VnfmInfo();
44     private HttpTestServer testServer;
45
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 ", "");
54     }
55
56     @Before
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();
68         testServer.start();
69         URI uri = testServer._server.getURI();
70         setField(cbamTokenProvider, "cbamKeyCloakBaseUrl", uri.toString());
71     }
72
73     private void addGoodTokenResponse() {
74         testServer.respones.add(GOOD_RESPONSE);
75         testServer.codes.add(HttpStatus.OK.value());
76     }
77
78     @After
79     public void testServer() throws Exception {
80         testServer.stop();
81     }
82
83     /**
84      * a new token is requested no token has been requested before
85      */
86     @Test
87     public void testBasicTokenRequest() throws Exception {
88         //given
89         addGoodTokenResponse();
90         //when
91         String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
92         //verify
93         assertEquals(1, testServer.requests.size());
94         assertTokenRequest(testServer.requests.get(0));
95         assertEquals("myToken", token);
96
97     }
98
99     /**
100      * a new token is requested if the previous token has expired
101      */
102     @Test
103     public void testTokenIsRequestedIfPreviousExpired() throws Exception {
104         //given
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);
110         //when
111         String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
112         //verify
113         assertEquals(2, testServer.requests.size());
114         assertTokenRequest(testServer.requests.get(0));
115         assertTokenRequest(testServer.requests.get(1));
116         assertEquals("myToken2", token);
117     }
118
119     /**
120      * a new token is not requested if the previous token has not expired
121      */
122     @Test
123     public void testTokenIsNotRequestedIfPreviousHasNotExpired() throws Exception {
124         //given
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);
130         //when
131         String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
132         //verify
133         assertEquals(1, testServer.requests.size());
134         assertTokenRequest(testServer.requests.get(0));
135         assertEquals("myToken", token);
136     }
137
138     /**
139      * failed token requests are retried for a fixed number amount of times
140      */
141     @Test
142     public void testRetry() throws Exception {
143         //given
144         addFailedResponse();
145         addFailedResponse();
146         addFailedResponse();
147         addFailedResponse();
148         addGoodTokenResponse();
149         //cbamTokenProvider.failOnRequestNumber = 5;
150         //when
151         String token = extractToken(cbamTokenProvider.getToken(VNFM_ID));
152         //verify
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);
164     }
165
166     /**
167      * failed token requests are retried for a fixed number amount of times (reacing maximal number or retries)
168      */
169     @Test
170     public void testNoMoreRetry() throws Exception {
171         //given
172         addFailedResponse();
173         addFailedResponse();
174         addFailedResponse();
175         addFailedResponse();
176         addFailedResponse();
177         //when
178         try {
179             cbamTokenProvider.getToken(VNFM_ID);
180             fail();
181         } catch (RuntimeException e) {
182             assertNotNull(e.getCause());
183         }
184         //verify
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());
196     }
197
198     private void addFailedResponse() {
199         testServer.codes.add(HttpStatus.UNAUTHORIZED.value());
200         testServer.respones.add(new String());
201     }
202
203
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");
210     }
211
212     private void assertContains(String content, String key, String value) {
213         assertTrue(content.contains(key + "=" + value));
214     }
215 }