bd5e42f1e1867f20fcc108f2e229bdd179e3be49
[vfc/nfvo/driver/vnfm/svnfm.git] / nokiav2 / driver / src / test / java / org / onap / vfc / nfvo / driver / vnfm / svnfm / nokia / onap / direct / TestAAIRestApiProvider.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 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct;
17
18 import javax.net.ssl.HostnameVerifier;
19 import javax.net.ssl.SSLSocketFactory;
20 import okhttp3.Interceptor;
21 import okhttp3.Protocol;
22 import okhttp3.Request;
23 import okhttp3.Response;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.ArgumentCaptor;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.mockito.invocation.InvocationOnMock;
30 import org.mockito.stubbing.Answer;
31 import org.onap.aai.api.CloudInfrastructureApi;
32 import org.onap.aai.api.ExternalSystemApi;
33 import org.onap.aai.api.NetworkApi;
34 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.core.SelfRegistrationManager;
35 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
36
37 import static junit.framework.TestCase.assertEquals;
38 import static org.mockito.Mockito.*;
39
40 class ResultCaptor<T> implements Answer {
41     private T result = null;
42
43     public T getResult() {
44         return result;
45     }
46
47     @Override
48     public T answer(InvocationOnMock invocationOnMock) throws Throwable {
49         result = (T) invocationOnMock.callRealMethod();
50         return result;
51     }
52 }
53
54 public class TestAAIRestApiProvider extends TestBase {
55     private AAIRestApiProvider aaiRestApiProvider;
56     @Mock
57     private HostnameVerifier hostnameVerifier;
58     private AaiSecurityProvider aaiSecurityProviderReal = new AaiSecurityProvider();
59     private AaiSecurityProvider aaiSecurityProvider = spy(aaiSecurityProviderReal);
60
61     @Before
62     public void init() {
63         aaiRestApiProvider = new AAIRestApiProvider(msbApiProvider, aaiSecurityProvider);
64     }
65
66     /**
67      * test building a client to access AAI API
68      */
69     @Test
70     public void testApiClientBuilder() throws Exception {
71         when(aaiSecurityProvider.skipCertificateVerification()).thenReturn(true);
72         when(aaiSecurityProvider.skipHostnameVerification()).thenReturn(true);
73         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiUsername}", "username");
74         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiPassword}", "aaiPassword");
75         ResultCaptor<SSLSocketFactory> sslSocketFactoryResultCaptor = new ResultCaptor<>();
76         doAnswer(sslSocketFactoryResultCaptor).when(aaiSecurityProvider).buildSSLSocketFactory();
77         when(msbApiProvider.getMicroServiceUrl(AAIRestApiProvider.AAIService.NETWORK.getServiceName(), "v11")).thenReturn("http://1.2.3.4/a/");
78         when(aaiSecurityProvider.buildHostnameVerifier()).thenReturn(hostnameVerifier);
79         //when
80         org.onap.aai.ApiClient apiClient = aaiRestApiProvider.buildApiClient(AAIRestApiProvider.AAIService.NETWORK);
81         //verify
82         assertEquals("http://1.2.3.4/a/", apiClient.getAdapterBuilder().build().baseUrl().toString());
83         assertEquals(sslSocketFactoryResultCaptor.getResult(), apiClient.getOkBuilder().build().sslSocketFactory());
84         assertEquals(hostnameVerifier, apiClient.getOkBuilder().build().hostnameVerifier());
85
86         //given
87         Response resp = new Response.Builder().message("a").code(200).protocol(Protocol.HTTP_1_0).request(new Request.Builder().url("http://1.2.3.4/d").build()).build();
88         //when
89         Request authenticate = apiClient.getOkBuilder().build().authenticator().authenticate(null, resp);
90         //verify
91         assertEquals("Basic dXNlcm5hbWU6YWFpUGFzc3dvcmQ=", authenticate.headers().get("Authorization"));
92
93         //given
94         Interceptor.Chain chain = Mockito.mock(Interceptor.Chain.class);
95         when(chain.request()).thenReturn(new Request.Builder().url("http://1.2.3.4/d").build());
96         ArgumentCaptor<Request> modifedRequest = ArgumentCaptor.forClass(Request.class);
97         when(chain.proceed(modifedRequest.capture())).thenReturn(resp);
98         //when
99         apiClient.getOkBuilder().interceptors().get(0).intercept(chain);
100         //verify
101         assertEquals(SelfRegistrationManager.SERVICE_NAME, modifedRequest.getValue().header("X-FromAppId"));
102
103     }
104
105     /**
106      * is slash is missing from micro service URL it is added
107      */
108     @Test
109     public void testApiClientBuilderMissingSlash() throws Exception {
110         when(aaiSecurityProvider.skipCertificateVerification()).thenReturn(true);
111         when(aaiSecurityProvider.skipHostnameVerification()).thenReturn(true);
112         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiUsername}", "username");
113         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiPassword}", "aaiPassword");
114         ResultCaptor<SSLSocketFactory> sslSocketFactoryResultCaptor = new ResultCaptor<>();
115         doAnswer(sslSocketFactoryResultCaptor).when(aaiSecurityProvider).buildSSLSocketFactory();
116         when(msbApiProvider.getMicroServiceUrl(AAIRestApiProvider.AAIService.NETWORK.getServiceName(), "v11")).thenReturn("http://1.2.3.4/a");
117         when(aaiSecurityProvider.buildHostnameVerifier()).thenReturn(hostnameVerifier);
118         //when
119         org.onap.aai.ApiClient apiClient = aaiRestApiProvider.buildApiClient(AAIRestApiProvider.AAIService.NETWORK);
120         //verify
121         assertEquals("http://1.2.3.4/a/", apiClient.getAdapterBuilder().build().baseUrl().toString());
122         assertEquals(sslSocketFactoryResultCaptor.getResult(), apiClient.getOkBuilder().build().sslSocketFactory());
123         assertEquals(hostnameVerifier, apiClient.getOkBuilder().build().hostnameVerifier());
124         Response resp = new Response.Builder().message("a").code(200).protocol(Protocol.HTTP_1_0).request(new Request.Builder().url("http://1.2.3.4/d").build()).build();
125         Request authenticate = apiClient.getOkBuilder().build().authenticator().authenticate(null, resp);
126         assertEquals("Basic dXNlcm5hbWU6YWFpUGFzc3dvcmQ=", authenticate.headers().get("Authorization"));
127     }
128
129     /**
130      * test building a client to access AAI API
131      */
132     @Test
133     public void testApiClientBuilderForCloud() throws Exception {
134         when(aaiSecurityProvider.skipCertificateVerification()).thenReturn(true);
135         when(aaiSecurityProvider.skipHostnameVerification()).thenReturn(true);
136         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiUsername}", "username");
137         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiPassword}", "aaiPassword");
138         ResultCaptor<SSLSocketFactory> sslSocketFactoryResultCaptor = new ResultCaptor<>();
139         doAnswer(sslSocketFactoryResultCaptor).when(aaiSecurityProvider).buildSSLSocketFactory();
140         when(msbApiProvider.getMicroServiceUrl(AAIRestApiProvider.AAIService.CLOUD.getServiceName(), "v11")).thenReturn("http://1.2.3.4/a/");
141         when(aaiSecurityProvider.buildHostnameVerifier()).thenReturn(hostnameVerifier);
142         //when
143         org.onap.aai.ApiClient apiClient = aaiRestApiProvider.buildApiClient(AAIRestApiProvider.AAIService.CLOUD);
144         //verify
145         assertEquals("http://1.2.3.4/a/", apiClient.getAdapterBuilder().build().baseUrl().toString());
146         assertEquals(sslSocketFactoryResultCaptor.getResult(), apiClient.getOkBuilder().build().sslSocketFactory());
147         assertEquals(hostnameVerifier, apiClient.getOkBuilder().build().hostnameVerifier());
148         Response resp = new Response.Builder().message("a").code(200).protocol(Protocol.HTTP_1_0).request(new Request.Builder().url("http://1.2.3.4/d").build()).build();
149         Request authenticate = apiClient.getOkBuilder().build().authenticator().authenticate(null, resp);
150         assertEquals("Basic dXNlcm5hbWU6YWFpUGFzc3dvcmQ=", authenticate.headers().get("Authorization"));
151     }
152
153     /**
154      * test building a client to access AAI API
155      */
156     @Test
157     public void testApiClientBuilderForExternalSystems() throws Exception {
158         when(aaiSecurityProvider.skipCertificateVerification()).thenReturn(true);
159         when(aaiSecurityProvider.skipHostnameVerification()).thenReturn(true);
160         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiUsername}", "username");
161         setFieldWithPropertyAnnotation(aaiRestApiProvider, "${aaiPassword}", "aaiPassword");
162         ResultCaptor<SSLSocketFactory> sslSocketFactoryResultCaptor = new ResultCaptor<>();
163         doAnswer(sslSocketFactoryResultCaptor).when(aaiSecurityProvider).buildSSLSocketFactory();
164         when(msbApiProvider.getMicroServiceUrl(AAIRestApiProvider.AAIService.ESR.getServiceName(), "v11")).thenReturn("http://1.2.3.4/a/");
165         when(aaiSecurityProvider.buildHostnameVerifier()).thenReturn(hostnameVerifier);
166         //when
167         org.onap.aai.ApiClient apiClient = aaiRestApiProvider.buildApiClient(AAIRestApiProvider.AAIService.ESR);
168         //verify
169         assertEquals("http://1.2.3.4/a/", apiClient.getAdapterBuilder().build().baseUrl().toString());
170         assertEquals(sslSocketFactoryResultCaptor.getResult(), apiClient.getOkBuilder().build().sslSocketFactory());
171         assertEquals(hostnameVerifier, apiClient.getOkBuilder().build().hostnameVerifier());
172         Response resp = new Response.Builder().message("a").code(200).protocol(Protocol.HTTP_1_0).request(new Request.Builder().url("http://1.2.3.4/d").build()).build();
173         Request authenticate = apiClient.getOkBuilder().build().authenticator().authenticate(null, resp);
174         assertEquals("Basic dXNlcm5hbWU6YWFpUGFzc3dvcmQ=", authenticate.headers().get("Authorization"));
175     }
176
177     /**
178      * Test API wrapping for NetworkApi
179      * (questionable benefit [ this is more less ensured by Java type safety) ]
180      */
181     @Test
182     public void testNetworkApiAPiWrapping() {
183         org.onap.aai.ApiClient c = Mockito.mock(org.onap.aai.ApiClient.class);
184         class TestClasss extends AAIRestApiProvider {
185             public TestClasss() {
186                 super(msbApiProvider, aaiSecurityProvider);
187             }
188
189             @Override
190             org.onap.aai.ApiClient buildApiClient(AAIRestApiProvider.AAIService service) {
191                 return c;
192             }
193         }
194         NetworkApi defaultApi = Mockito.mock(NetworkApi.class);
195         when(c.createService(NetworkApi.class)).thenReturn(defaultApi);
196         //verify
197         TestClasss testInstnace = new TestClasss();
198         assertEquals(defaultApi, testInstnace.getNetworkApi());
199     }
200
201     /**
202      * Test API wrapping for CloudInfrastructureApi
203      * (questionable benefit [ this is more less ensured by Java type safety) ]
204      */
205     @Test
206     public void testCloudInfrastructureApiWrapping() {
207         org.onap.aai.ApiClient c = Mockito.mock(org.onap.aai.ApiClient.class);
208         class TestClasss extends AAIRestApiProvider {
209             public TestClasss() {
210                 super(msbApiProvider, aaiSecurityProvider);
211             }
212
213             @Override
214             org.onap.aai.ApiClient buildApiClient(AAIRestApiProvider.AAIService service) {
215                 return c;
216             }
217         }
218         CloudInfrastructureApi defaultApi = Mockito.mock(CloudInfrastructureApi.class);
219         when(c.createService(CloudInfrastructureApi.class)).thenReturn(defaultApi);
220         //verify
221         TestClasss testInstnace = new TestClasss();
222         assertEquals(defaultApi, testInstnace.getCloudInfrastructureApi());
223     }
224
225     /**
226      * Test API wrapping for ExternalSystemApi
227      * (questionable benefit [ this is more less ensured by Java type safety) ]
228      */
229     @Test
230     public void testExternalSystemApiWrapping() {
231         org.onap.aai.ApiClient c = Mockito.mock(org.onap.aai.ApiClient.class);
232         class TestClasss extends AAIRestApiProvider {
233             public TestClasss() {
234                 super(msbApiProvider, aaiSecurityProvider);
235             }
236
237             @Override
238             org.onap.aai.ApiClient buildApiClient(AAIRestApiProvider.AAIService service) {
239                 return c;
240             }
241         }
242         ExternalSystemApi defaultApi = Mockito.mock(ExternalSystemApi.class);
243         when(c.createService(ExternalSystemApi.class)).thenReturn(defaultApi);
244         //verify
245         TestClasss testInstnace = new TestClasss();
246         assertEquals(defaultApi, testInstnace.getExternalSystemApi());
247     }
248 }