2 * ============LICENSE_START====================================================
4 * ===========================================================================
5 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6 * ===========================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END====================================================
22 package org.onap.aaf.cadi.oauth.test;
24 import java.io.ByteArrayOutputStream;
25 import java.io.PrintStream;
26 import java.lang.reflect.Field;
27 import java.net.ConnectException;
28 import java.util.Date;
29 import java.util.GregorianCalendar;
30 import java.util.HashMap;
32 import org.junit.After;
33 import org.junit.AfterClass;
34 import org.junit.Before;
35 import org.junit.BeforeClass;
36 import org.junit.Test;
37 import org.onap.aaf.cadi.CadiException;
38 import org.onap.aaf.cadi.PropAccess;
39 import org.onap.aaf.cadi.client.Future;
40 import org.onap.aaf.cadi.client.Rcli;
41 import org.onap.aaf.cadi.client.Result;
42 import org.onap.aaf.cadi.client.Retryable;
43 import org.onap.aaf.cadi.config.Config;
44 import org.onap.aaf.cadi.config.SecurityInfoC;
45 import org.onap.aaf.cadi.oauth.TimedToken;
46 import org.onap.aaf.cadi.oauth.TokenClient;
47 import org.onap.aaf.cadi.oauth.TokenClientFactory;
48 import org.onap.aaf.cadi.oauth.TzClient;
49 import org.onap.aaf.cadi.principal.Kind;
50 import org.onap.aaf.misc.env.APIException;
51 import org.onap.aaf.misc.env.util.Chrono;
53 import aafoauth.v2_0.Introspect;
54 import aafoauth.v2_0.Token;
55 import junit.framework.Assert;
57 public class JU_OAuthTest {
59 private ByteArrayOutputStream outStream;
61 private static PropAccess access;
62 private static TokenClientFactory tcf;
65 public static void setUpBeforeClass() {
66 ByteArrayOutputStream outStream = new ByteArrayOutputStream();
67 System.setOut(new PrintStream(outStream));
69 access = new PropAccess();
71 tcf = TokenClientFactory.instance(access);
72 } catch (Exception e) {
79 public static void tearDownAfterClass() throws Exception {
80 Field field = SecurityInfoC.class.getDeclaredField("sicMap");
81 field.setAccessible(true);
82 field.set(null, new HashMap<>());
86 public void setUp() throws Exception {
87 outStream = new ByteArrayOutputStream();
88 System.setOut(new PrintStream(outStream));
92 public void tearDown() throws Exception {
93 System.setOut(System.out);
97 public void testROPCFlowHappy() {
100 String client_id = access.getProperty(Config.AAF_APPID);
101 String client_secret = access.getProperty(Config.AAF_APPPASS);
102 String tokenServiceURL = access.getProperty(Config.AAF_OAUTH2_TOKEN_URL);
103 // Assert.assertNotNull(tokenServiceURL);
104 String tokenIntrospectURL = access.getProperty(Config.AAF_OAUTH2_INTROSPECT_URL);
105 String tokenAltIntrospectURL = access.getProperty(Config.AAF_ALT_OAUTH2_INTROSPECT_URL);
106 // Assert.assertNotNull(tokenIntrospectURL);
107 final String endServicesURL = access.getProperty(Config.AAF_OAUTH2_HELLO_URL);
108 String username = access.getProperty("cadi_username");
111 Result<TimedToken> rtt;
113 tc = tcf.newClient(tokenServiceURL, 3000);
114 tc.client_creds(client_id,client_secret);
115 tc.password(access.getProperty("cadi_username"),access.getProperty("cadi_password"));
116 rtt = tc.getToken(Kind.BASIC_AUTH,"org.osaaf.aaf","org.osaaf.test");
119 rtt = tc.refreshToken(rtt.value);
122 TokenClient ic = tcf.newClient(tokenIntrospectURL,3000);
123 ic.client_creds(client_id,client_secret);
125 Result<Introspect> ri = ic.introspect(rtt.value.getAccessToken());
129 System.out.println(ri.code + ' ' + ri.error);
130 Assert.fail(ri.code + ' ' + ri.error);
132 TzClient helloClient = tcf.newTzClient(endServicesURL);
133 helloClient.setToken(client_id, rtt.value);
134 // String rv = serviceCall(helloClient);
135 // System.out.println(rv);
136 // Assert.assertEquals("Hello AAF OAuth2\n",rv);
138 System.out.println(rtt.code + ' ' + rtt.error);
139 Assert.fail(rtt.code + ' ' + rtt.error);
142 System.out.println(rtt.code + ' ' + rtt.error);
143 Assert.fail(rtt.code + ' ' + rtt.error);
149 System.out.println("**** ISAM TEST ****");
150 tokenServiceURL=access.getProperty(Config.AAF_ALT_OAUTH2_TOKEN_URL);
151 client_id=access.getProperty(Config.AAF_ALT_CLIENT_ID);
152 client_secret=access.getProperty(Config.AAF_ALT_CLIENT_SECRET);
153 if (tokenServiceURL!=null) {
154 tc = tcf.newClient(tokenServiceURL, 3000);
155 tc.client_creds(client_id, client_secret);
156 int at = username.indexOf('@');
158 tc.password(at>=0?username.substring(0, at):username,access.getProperty("cadi_password"));
159 rtt = tc.getToken("org.osaaf.aaf","org.osaaf.test");
162 rtt = tc.refreshToken(rtt.value);
166 tc = tcf.newClient(tokenAltIntrospectURL, 3000);
167 tc.client_creds(client_id, client_secret);
168 Result<Introspect> rti = tc.introspect(rtt.value.getAccessToken());
170 System.out.print("Normal ISAM ");
173 System.out.println(rti.code + ' ' + rti.error);
174 Assert.fail(rtt.code + ' ' + rtt.error);
177 tc = tcf.newClient(tokenIntrospectURL, 3000);
178 tc.client_creds(client_id, client_secret);
179 rti = tc.introspect(rtt.value.getAccessToken());
181 System.out.print("AAF with ISAM Token ");
184 System.out.println(rti.code + ' ' + rti.error);
186 Assert.fail(rti.code + ' ' + rti.error);
190 TzClient tzClient = tcf.newTzClient(endServicesURL);
191 tzClient.setToken(client_id, rtt.value);
192 // Note: this is AAF's "Hello" server
193 String rv = serviceCall(tzClient);
194 System.out.println(rv);
195 // Assert.assertEquals("Hello AAF OAuth2\n",rv);
197 System.out.println(rtt.code + ' ' + rtt.error);
198 Assert.fail(rtt.code + ' ' + rtt.error);
201 System.out.println(rtt.code + ' ' + rtt.error);
202 Assert.fail(rtt.code + ' ' + rtt.error);
205 Assert.fail(Config.AAF_ALT_OAUTH2_TOKEN_URL + " is required");
208 } catch (Exception e) {
214 // private TokenClient testROPCFlow(final String url, final String client_id, final String client_secret, String user, String password, final String ... scope) throws Exception {
215 // TokenClient tclient = tcf.newClient(url,3000);
216 // tclient.client_creds(client_id, client_secret);
217 // if (user!=null && password!=null) {
218 // tclient.password(user,password);
220 // Result<TimedToken> rt = tclient.getToken(scope);
223 // Result<Introspect> rti = tclient.introspect(rt.value.getAccessToken());
227 // printAndFail(rti);
235 private String serviceCall(TzClient tzClient) throws Exception {
236 return tzClient.best(new Retryable<String>() {
238 public String code(Rcli<?> client) throws CadiException, ConnectException, APIException {
239 Future<String> future = client.read(null,"text/plain");
240 if (future.get(3000)) {
243 throw new APIException(future.code() + future.body());
248 // private void printAndFail(Result<?> rt) {
249 // System.out.printf("HTTP Code %d: %s\n", rt.code, rt.error);
250 // Assert.fail(rt.toString());
253 private void print(Token t) {
254 GregorianCalendar exp_date = new GregorianCalendar();
255 exp_date.add(GregorianCalendar.SECOND, t.getExpiresIn());
256 System.out.printf("Access Token\n\tToken:\t\t%s\n\tToken Type:\t%s\n\tExpires In:\t%d (%s)\n\tScope:\t\t%s\n\tRefresh Token:\t%s\n",
260 Chrono.timeStamp(new Date(System.currentTimeMillis()+(t.getExpiresIn()*1000))),
262 t.getRefreshToken());
265 private void print(Introspect ti) {
266 if (ti==null || ti.getClientId()==null) {
267 System.out.println("Empty Introspect");
270 Date exp = new Date(ti.getExp()*1000); // seconds
271 System.out.printf("Introspect\n"
272 + "\tAccessToken:\t%s\n"
273 + "\tClient-id:\t%s\n"
274 + "\tClient Type:\t%s\n"
276 + "\tUserName:\t%s\n"
277 + "\tExpires: \t%d (%s)\n"
279 + "\tContent:\t\t%s\n",
283 ti.isActive()?Boolean.TRUE.toString():Boolean.FALSE.toString(),
286 Chrono.timeStamp(exp),
288 ti.getContent()==null?"":ti.getContent());
290 System.out.println();