AT&T 2.0.19 Code drop, stage 3
[aaf/authz.git] / auth / auth-cass / src / test / java / com / att / dao / aaf / test / AbsJUCass.java
diff --git a/auth/auth-cass/src/test/java/com/att/dao/aaf/test/AbsJUCass.java b/auth/auth-cass/src/test/java/com/att/dao/aaf/test/AbsJUCass.java
new file mode 100644 (file)
index 0000000..5b6a08c
--- /dev/null
@@ -0,0 +1,200 @@
+/**
+ * ============LICENSE_START====================================================
+ * org.onap.aaf
+ * ===========================================================================
+ * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END====================================================
+ *
+ */
+
+package com.att.dao.aaf.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.Properties;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.onap.aaf.auth.dao.CassAccess;
+import org.onap.aaf.auth.dao.CassDAOImpl;
+import org.onap.aaf.auth.env.AuthzEnv;
+import org.onap.aaf.auth.env.AuthzTrans;
+import org.onap.aaf.cadi.Hash;
+import org.onap.aaf.cadi.Symm;
+import org.onap.aaf.misc.env.APIException;
+import org.onap.aaf.misc.env.Env;
+import org.onap.aaf.misc.env.Trans.Metric;
+
+import com.datastax.driver.core.Cluster;
+
+import junit.framework.Assert;
+
+/**
+ * Do Setup of Cassandra for Cassandra JUnit Testing
+ * 
+ * @author Jonathan
+ *
+ */
+public class AbsJUCass {
+       protected static final String AUTHZ = "authz";
+       protected static Cluster cluster;
+       protected static AuthzEnv env;
+       protected static int iterations = 0;
+       protected static float totals=0.0f;
+       protected static float remote = 0.0f;
+       protected static float json = 0.0f;
+       protected static AuthzTrans trans;
+       protected static boolean details = true;
+       
+       @BeforeClass 
+       public static void startup() throws APIException, IOException {
+               try {
+                       synchronized(AUTHZ) {
+                               if(env==null) {
+                                       final String resource = "cadi.properties";
+                           File f = new File("etc" + resource);
+                           InputStream is=null;
+                           Properties props = new Properties();
+                           try {
+                               if(f.exists()) {
+                                   is = new FileInputStream(f);
+                               } else {
+                                   URL rsrc = ClassLoader.getSystemResource(resource);
+                                   is = rsrc.openStream();
+                               }
+                               props.load(is);
+                           } finally {
+                               if(is==null) {
+                                       env= new AuthzEnv();
+                                   Assert.fail(resource + " must exist in etc dir, or in Classpath");
+                               }
+                               is.close();
+                           }
+                                       env = new AuthzEnv(props);
+                               }
+                       }
+                       cluster = CassAccess.cluster(env,"LOCAL");
+       
+                       env.info().log("Connecting to Cluster");
+                       try {
+                               cluster.connect(AUTHZ);
+                       } catch(Exception e) {
+                               cluster=null;
+                               env.error().log(e);
+                               Assert.fail("Not able to connect to DB: " + e.getLocalizedMessage());
+                       }
+                       env.info().log("Connected");
+                       
+                       // Load special data here
+                       
+                       iterations = 0;
+               } catch (Throwable t) {
+                       t.printStackTrace();
+                       throw t;
+               }
+       }
+       
+       @AfterClass
+       public static void shutdown() {
+               if(cluster!=null) {
+                       cluster.close();
+                       cluster = null;
+               }
+       }
+
+       @Before
+       public void newTrans() {
+               trans = env.newTrans();
+               
+               trans.setProperty(CassDAOImpl.USER_NAME, System.getProperty("user.name"));
+       }
+       
+       @After
+       public void auditTrail() {
+               if(totals==0) { // "updateTotals()" was not called... just do one Trans
+                       StringBuilder sb = new StringBuilder();
+                       Metric metric = trans.auditTrail(4, sb, Env.JSON, Env.REMOTE);
+                       if(details) {
+                               env.info().log(
+                               sb,
+                               "Total time:",
+                               totals += metric.total,
+                               "JSON time: ",
+                               metric.buckets[0],
+                               "REMOTE time: ",
+                               metric.buckets[1]
+                               );
+                       } else {
+                               totals += metric.total;
+                       }
+               }
+       }
+       
+       protected void updateTotals() {
+               Metric metric = trans.auditTrail(0, null, Env.JSON, Env.REMOTE);
+               totals+=metric.total;
+               json  +=metric.buckets[0];
+               remote+=metric.buckets[1];
+       }
+
+
+       @AfterClass
+       public static void print() {
+               float transTime;
+               if(iterations==0) {
+                       transTime=totals;
+               } else {
+                       transTime=totals/iterations;
+               }
+               env.info().log(
+               "Total time:",
+               totals,   
+               "JSON time:",
+               json,
+               "REMOTE time:",
+               remote,
+               "Iterations:",
+               iterations,
+               "Transaction time:",
+               transTime
+               );
+       }
+       
+       /**
+        * Take a User/Pass and turn into an MD5 Hashed BasicAuth
+        * 
+        * @param user
+        * @param pass
+        * @return
+        * @throws IOException
+        * @throws NoSuchAlgorithmException
+        */
+       public static byte[] userPassToBytes(String user, String pass)
+                       throws IOException, NoSuchAlgorithmException {
+               // Take the form of BasicAuth, so as to allow any character in Password
+               // (this is an issue in 1.0)
+               // Also, it makes it quicker to evaluate Basic Auth direct questions
+               String ba = Symm.base64url.encode(user + ':' + pass);
+               // Take MD5 Hash, so that data in DB can't be reversed out.
+               return Hash.hashMD5(ba.getBytes());
+       }
+
+}