aboutsummaryrefslogtreecommitdiffstats
path: root/datarouter-prov/src/test/java
diff options
context:
space:
mode:
authorsg481n <sg481n@att.com>2017-08-03 17:56:38 -0400
committerSai Gandham <sg481n@att.com>2017-08-04 15:41:45 +0000
commitaaf2df8b908fcb48043d2cd51803d8fd99f18b43 (patch)
tree5f90faea16d339e30ee2b7dc6607d7fdbfaeaaa7 /datarouter-prov/src/test/java
parent6ec9a9ce6c1062efa99da501fe8c6ea116aebf6f (diff)
 [DMAAP-48] Initial code import
Change-Id: I3e65371093487d7de167ec6c29f327f366f1e299 Signed-off-by: sg481n <sg481n@att.com>
Diffstat (limited to 'datarouter-prov/src/test/java')
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/AllTests.java48
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/FillDB.java125
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/package.html29
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testBase.java158
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testCleanup.java85
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsDelete.java59
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsGet.java188
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPost.java282
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPut.java59
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testFeedDelete.java98
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testFeedPut.java202
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testInternalGet.java105
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testInternalMisc.java151
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testLogGet.java181
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testPublish.java119
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testRLEBitSet.java231
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testRouteAPI.java30
-rw-r--r--datarouter-prov/src/test/java/datarouter/provisioning/testSubscribePost.java180
18 files changed, 2330 insertions, 0 deletions
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/AllTests.java b/datarouter-prov/src/test/java/datarouter/provisioning/AllTests.java
new file mode 100644
index 00000000..92159552
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/AllTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({
+ testDRFeedsPost.class,
+ testDRFeedsGet.class,
+ testDRFeedsPut.class,
+ testDRFeedsDelete.class,
+ testFeedPut.class,
+ testSubscribePost.class,
+ testInternalGet.class,
+ testInternalMisc.class,
+ testPublish.class,
+ testLogGet.class,
+ testFeedDelete.class,
+ testCleanup.class,
+ testRLEBitSet.class
+})
+public class AllTests {
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/FillDB.java b/datarouter-prov/src/test/java/datarouter/provisioning/FillDB.java
new file mode 100644
index 00000000..c41cc801
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/FillDB.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package datarouter.provisioning;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class FillDB {
+ public static void main(String[] args)
+ throws KeyStoreException, FileNotFoundException, KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException
+ {
+ AbstractHttpClient httpclient = new DefaultHttpClient();
+
+ String keystore = "/home/eby/dr2/misc/client.keystore";
+ String kspass = "changeit";
+ KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ FileInputStream instream = new FileInputStream(new File(keystore));
+ try {
+ trustStore.load(instream, kspass.toCharArray());
+ } catch (Exception x) {
+ System.err.println("READING KEYSTORE: "+x);
+ } finally {
+ try { instream.close(); } catch (Exception ignore) {}
+ }
+
+ SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore, "changeit", trustStore);
+ Scheme sch = new Scheme("https", 443, socketFactory);
+ httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+
+ JSONObject jo = buildFeedRequest();
+ for (int i = 0; i < 10000; i++) {
+ jo.put("version", ""+System.currentTimeMillis());
+ int rv = -1;
+ String url = "https://conwy.proto.research.att.com:6443/";
+ HttpPost httpPost = new HttpPost(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+ String t = jo.toString();
+ HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create(FeedServlet.FEED_CONTENT_TYPE));
+ httpPost.setEntity(body);
+
+ HttpResponse response = httpclient.execute(httpPost);
+ rv = response.getStatusLine().getStatusCode();
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ System.err.println(e);
+ } finally {
+ httpPost.releaseConnection();
+ }
+ System.out.println(i + " " + rv);
+ }
+ }
+ private static JSONObject buildFeedRequest() {
+ JSONObject jo = new JSONObject();
+ jo.put("name", "feed");
+ jo.put("version", ""+System.currentTimeMillis());
+ jo.put("description", "Sample feed used by JUnit to test");
+
+ JSONObject jo2 = new JSONObject();
+ jo2.put("classification", "unrestricted");
+
+ JSONArray ja = new JSONArray();
+ JSONObject jo3 = new JSONObject();
+ jo3.put("id", "id001");
+ jo3.put("password", "re1kwelj");
+ JSONObject jo4 = new JSONObject();
+ jo4.put("id", "id002");
+ jo4.put("password", "o9eqlmbd");
+ ja.put(jo3);
+ ja.put(jo4);
+ jo2.put("endpoint_ids", ja);
+
+ ja = new JSONArray();
+ ja.put("10.0.0.1");
+ ja.put("192.168.0.1");
+ ja.put("135.207.136.128/25");
+ jo2.put("endpoint_addrs", ja);
+
+ jo.put("authorization", jo2);
+ return jo;
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/package.html b/datarouter-prov/src/test/java/datarouter/provisioning/package.html
new file mode 100644
index 00000000..d0383b8d
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/package.html
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+<html>
+<body>
+<p>
+This package provides JUnit tests for the provisioning server.
+</p>
+</body>
+</html>
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testBase.java b/datarouter-prov/src/test/java/datarouter/provisioning/testBase.java
new file mode 100644
index 00000000..9a96933b
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testBase.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyStore;
+import java.util.Properties;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.After;
+import org.junit.Before;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testBase {
+ /** The properties file to read the DB properties from */
+ public static final String CONFIG_FILE = "tests.properties";
+
+ public Properties props;
+ protected AbstractHttpClient httpclient;
+ protected String s_33;
+ protected String s_257;
+ protected static JSONObject db_state;
+
+ @Before
+ public void setUp() throws Exception {
+ if (props == null) {
+ props = new Properties();
+ InputStream inStream = getClass().getClassLoader().getResourceAsStream(CONFIG_FILE);
+ try {
+ props.load(inStream);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ inStream.close();
+ }
+ }
+
+ httpclient = new DefaultHttpClient();
+ String s = "0123456789ABCDEF";
+ s_33 = s + s + "!";
+ s = s + s + s + s;
+ s_257 = s + s + s + s + "!";
+
+ // keystore
+ String store = props.getProperty("test.keystore");
+ String pass = props.getProperty("test.kspassword");
+ KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ FileInputStream instream = new FileInputStream(new File(store));
+ try {
+ keyStore.load(instream, pass.toCharArray());
+ } catch (Exception x) {
+ System.err.println("READING KEYSTORE: "+x);
+ } finally {
+ try { instream.close(); } catch (Exception ignore) {}
+ }
+
+ store = props.getProperty("test.truststore");
+ pass = props.getProperty("test.tspassword");
+ KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ instream = new FileInputStream(new File(store));
+ try {
+ trustStore.load(instream, pass.toCharArray());
+ } catch (Exception x) {
+ System.err.println("READING TRUSTSTORE: "+x);
+ } finally {
+ try { instream.close(); } catch (Exception ignore) {}
+ }
+
+ SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, "changeit", trustStore);
+ Scheme sch = new Scheme("https", 443, socketFactory);
+ httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+ }
+
+ public JSONObject getDBstate() {
+ // set db_state!
+ if (db_state == null) {
+ String url = props.getProperty("test.host") + "/internal/prov";
+ HttpGet httpGet = new HttpGet(url);
+ try {
+ httpGet.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+ HttpResponse response = httpclient.execute(httpGet);
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ // save the response body as db_state
+ boolean ok = ctype.equals(FeedServlet.PROVFULL_CONTENT_TYPE1);
+ ok |= ctype.equals(FeedServlet.PROVFULL_CONTENT_TYPE2);
+ if (ok) {
+ db_state = null;
+ try {
+ db_state = new JSONObject(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ httpGet.releaseConnection();
+ }
+ }
+ return db_state;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ // When HttpClient instance is no longer needed,
+ // shut down the connection manager to ensure
+ // immediate deallocation of all system resources
+ httpclient.getConnectionManager().shutdown();
+ }
+
+ protected void ckResponse(HttpResponse response, int expect) {
+ System.out.println(response.getStatusLine());
+ StatusLine sl = response.getStatusLine();
+ int code = sl.getStatusCode();
+ if (code != expect)
+ fail("Unexpected response, expect "+expect+" got "+code+" "+sl.getReasonPhrase());
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testCleanup.java b/datarouter-prov/src/test/java/datarouter/provisioning/testCleanup.java
new file mode 100644
index 00000000..fa1c5f4c
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testCleanup.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testCleanup extends testBase {
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ }
+
+ @Test
+ public void testNormal() {
+ // Delete all feeds w/JUnit as publisher
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject feed = ja.getJSONObject(i);
+ if (feed != null && !feed.getBoolean("deleted")) {
+ if (feed.getString("publisher").equals("JUnit")) {
+ int feedid = feed.getInt("feedid");
+ delete("/feed/"+feedid);
+ }
+ }
+ }
+ // Delete all subscriptions w/JUnit as subscriber
+ ja = db_state.getJSONArray("subscriptions");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject sub = ja.getJSONObject(i);
+ if (sub != null && sub.getString("subscriber").equals("JUnit")) {
+ int subid = sub.getInt("subid");
+ delete("/subs/"+subid);
+ }
+ }
+ }
+ private void delete(String uri) {
+ String url = props.getProperty("test.host") + uri;;
+ HttpDelete del = new HttpDelete(url);
+ try {
+ del.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+ HttpResponse response = httpclient.execute(del);
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ del.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsDelete.java b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsDelete.java
new file mode 100644
index 00000000..fb4a554b
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsDelete.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testDRFeedsDelete extends testBase {
+ @Test
+ public void testNotAllowed() {
+ String url = props.getProperty("test.host") + "/";
+ HttpDelete del = new HttpDelete(url);
+ try {
+ del.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(del);
+ ckResponse(response, HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ del.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsGet.java b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsGet.java
new file mode 100644
index 00000000..33303fa4
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsGet.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testDRFeedsGet extends testBase {
+ private JSONArray returnedlist;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ }
+
+ @Test
+ public void testNormal() {
+ testCommon(HttpServletResponse.SC_OK);
+ int expect = 0;
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject jo = ja.getJSONObject(i);
+ if (!jo.getBoolean("deleted"))
+ expect++;
+ }
+ if (returnedlist.length() != expect)
+ fail("bad length, got "+ returnedlist.length() + " expect " + expect);
+ }
+ @Test
+ public void testNormalGoodName() {
+ JSONArray ja = db_state.getJSONArray("feeds");
+ JSONObject feed0 = ja.getJSONObject(0);
+ String name = feed0.getString("name");
+ String query = "?name=" + name;
+ int expect = 0;
+ for (int n = 0; n < ja.length(); n++) {
+ JSONObject jo = ja.getJSONObject(n);
+ if (!jo.getBoolean("deleted") && jo.getString("name").equals(name))
+ expect++;
+ }
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ if (returnedlist.length() != expect)
+ fail("bad length, got "+ returnedlist.length() + " expect "+expect);
+ }
+ @Test
+ public void testNormalBadName() {
+ String query = "?name=ZZTOP123456";
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ if (returnedlist.length() != 0)
+ fail("bad length, got "+ returnedlist.length() + " expect 0");
+ }
+ @Test
+ public void testNormalBadPath() {
+ String query = "flarg/?publisher=JUnit";
+ testCommon(HttpServletResponse.SC_NOT_FOUND, query, "text/html;charset=ISO-8859-1", "JUnit");
+ }
+ @Test
+ public void testNormalGoodPublisher() {
+ JSONArray ja = db_state.getJSONArray("feeds");
+ JSONObject feed0 = ja.getJSONObject(0);
+ String query = "?publisher=" + feed0.getString("publisher");
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ int expect = 0;
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject jo = ja.getJSONObject(i);
+ if (jo.getString("publisher").equals(feed0.getString("publisher")) && !jo.getBoolean("deleted"))
+ expect++;
+ }
+ if (returnedlist.length() != expect)
+ fail("bad length, got "+returnedlist.length()+" expected "+expect);
+ }
+ @Test
+ public void testNormalBadPublisher() {
+ String query = "?publisher=ZZTOP123456";
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ if (returnedlist.length() != 0)
+ fail("bad length");
+ }
+ @Test
+ public void testNormalGoodSubscriber() {
+ JSONArray ja = db_state.getJSONArray("subscriptions");
+ if (ja.length() > 0) {
+ JSONObject sub0 = ja.getJSONObject(0);
+ String query = "?subscriber=" + sub0.getString("subscriber");
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+// aarg! - this is complicated!
+// int expect = 0;
+// for (int i = 0; i < ja.length(); i++) {
+// JSONObject jo = ja.getJSONObject(i);
+// if (jo.getString("subscriber").equals(sub0.getString("subscriber")))
+// expect++;
+// }
+// if (returnedlist.length() != 1)
+// fail("bad length "+returnedlist.toString());
+ } else {
+ // There are no subscriptions yet, so use a made up name
+ testCommon(HttpServletResponse.SC_OK, "?subscriber=foo", FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ }
+ }
+ @Test
+ public void testNormalBadSubscriber() {
+ String query = "?subscriber=ZZTOP123456";
+ testCommon(HttpServletResponse.SC_OK, query, FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ if (returnedlist.length() != 0)
+ fail("bad length");
+ }
+ private void testCommon(int expect) {
+ testCommon(expect, "", FeedServlet.FEEDLIST_CONTENT_TYPE, "JUnit");
+ }
+ private void testCommon(int expect, String query, String ectype, String bhdr) {
+ String url = props.getProperty("test.host") + "/" + query;
+ HttpGet httpGet = new HttpGet(url);
+ try {
+ if (bhdr != null)
+ httpGet.addHeader(FeedServlet.BEHALF_HEADER, bhdr);
+
+ HttpResponse response = httpclient.execute(httpGet);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ if (!ctype.equals(ectype))
+ fail("Got wrong content type: "+ctype);
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ctype.equals(FeedServlet.FEEDLIST_CONTENT_TYPE)) {
+ try {
+ returnedlist = new JSONArray(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ httpGet.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPost.java b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPost.java
new file mode 100644
index 00000000..65d041d1
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPost.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testDRFeedsPost extends testBase {
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Test
+ public void testNormal() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_CREATED);
+ }
+ @Test
+ public void testNormalNoCTVersion() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_CREATED, "application/vnd.att-dr.feed", "JUnit");
+ }
+ @Test
+ public void testBadContentType() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "bad/bad", "Junit");
+ }
+ @Test
+ public void testNoBehalfHeader() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST, FeedServlet.FEED_CONTENT_TYPE, null);
+ }
+ @Test
+ public void testMissingName() {
+ JSONObject jo = buildFeedRequest();
+ jo.remove("name");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testTooLongName() {
+ JSONObject jo = buildFeedRequest();
+ jo.put("name", "123456789012345678901234567890");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testMissingVersion() {
+ JSONObject jo = buildFeedRequest();
+ jo.remove("version");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testTooLongVersion() {
+ JSONObject jo = buildFeedRequest();
+ jo.put("version", "123456789012345678901234567890");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testTooLongDescription() {
+ // normal request
+ JSONObject jo = buildFeedRequest();
+ jo.put("description", s_257);
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testMissingAuthorization() {
+ JSONObject jo = buildFeedRequest();
+ jo.remove("authorization");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testMissingClassification() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ j2.remove("classification");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testTooLongClassification() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ j2.put("classification", s_33);
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testNoEndpointIds() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ j2.put("endpoint_ids", new JSONArray());
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testBadIPAddress1() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("ZZZ^&#$%@#&^%$@#&^");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testBadIPAddress2() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("135.207.136.678"); // bad IPv4 addr
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testBadIPAddress3() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("2001:1890:1110:d000:1a29::17567"); // bad IPv6 addr
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testBadNetMask() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("10.10.10.10/64");
+ testCommon(jo, 400);
+ }
+ @Test
+ public void testGoodIPAddress1() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("135.207.136.175"); // good IPv4 addr
+ testCommon(jo, 201);
+ }
+ @Test
+ public void testGoodIPAddress2() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("2001:1890:1110:d000:1a29::175"); // good IPv6 addr
+ testCommon(jo, 201);
+ }
+ @Test
+ public void testGoodNetMask() {
+ JSONObject jo = buildFeedRequest();
+ JSONObject j2 = jo.getJSONObject("authorization");
+ JSONArray ja = j2.getJSONArray("endpoint_addrs");
+ ja.put("2001:1890:1110:d000:1a29::175/120");
+ testCommon(jo, 201);
+ }
+ private void testCommon(JSONObject jo, int expect) {
+ testCommon(jo, expect, FeedServlet.FEED_CONTENT_TYPE, "JUnit");
+ }
+ private void testCommon(JSONObject jo, int expect, String ctype, String bhdr) {
+ String url = props.getProperty("test.host") + "/";
+ HttpPost httpPost = new HttpPost(url);
+ try {
+ if (bhdr != null)
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, bhdr);
+ String t = jo.toString();
+ HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create(ctype));
+ httpPost.setEntity(body);
+
+ HttpResponse response = httpclient.execute(httpPost);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ ctype = entity.getContentType().getValue().trim();
+ int code = response.getStatusLine().getStatusCode();
+ if (code == HttpServletResponse.SC_CREATED && !ctype.equals(FeedServlet.FEEDFULL_CONTENT_TYPE))
+ fail("Got wrong content type: "+ctype);
+
+ if (code == HttpServletResponse.SC_CREATED) {
+ Header[] loc = response.getHeaders("Location");
+ if (loc == null)
+ fail("Missing Location header.");
+ }
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ctype.equals(FeedServlet.FEEDFULL_CONTENT_TYPE)) {
+ // ck Location header!
+ JSONObject jo2 = null;
+ try {
+ jo2 = new JSONObject(new JSONTokener(entity.getContent()));
+ System.err.println(jo2.toString());
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ try {
+ jo2.getString("publisher");
+ JSONObject jo3 = jo2.getJSONObject("links");
+ jo3.getString("self");
+ jo3.getString("publish");
+ jo3.getString("subscribe");
+ jo3.getString("log");
+ } catch (JSONException e) {
+ fail("required field missing from result: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+ private JSONObject buildFeedRequest() {
+ JSONObject jo = new JSONObject();
+ jo.put("name", "JunitFeed");
+ jo.put("version", ""+System.currentTimeMillis()); // make version unique
+ jo.put("description", "Sample feed used by JUnit to test");
+
+ JSONObject jo2 = new JSONObject();
+ jo2.put("classification", "unrestricted");
+
+ JSONArray ja = new JSONArray();
+ JSONObject jo3 = new JSONObject();
+ jo3.put("id", "id001");
+ jo3.put("password", "re1kwelj");
+ JSONObject jo4 = new JSONObject();
+ jo4.put("id", "id002");
+ jo4.put("password", "o9eqlmbd");
+ ja.put(jo3);
+ ja.put(jo4);
+ jo2.put("endpoint_ids", ja);
+
+ ja = new JSONArray();
+ ja.put("10.0.0.1");
+ ja.put("192.168.0.1");
+ ja.put("135.207.136.128/25");
+ jo2.put("endpoint_addrs", ja);
+
+ jo.put("authorization", jo2);
+ return jo;
+ }
+}
+/*
+curl -v -X POST -H 'X-ATT-DR-ON-BEHALF-OF: tester' -H 'Content-type: application/vnd.att-dr.feed' --user publisher:tomcat \
+ --data "$data" http://127.0.0.1:8080/prov/feed/
+*/
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPut.java b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPut.java
new file mode 100644
index 00000000..aee58b26
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testDRFeedsPut.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testDRFeedsPut extends testBase {
+ @Test
+ public void testNotAllowed() {
+ String url = props.getProperty("test.host") + "/";
+ HttpPut put = new HttpPut(url);
+ try {
+ put.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(put);
+ ckResponse(response, HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ put.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testFeedDelete.java b/datarouter-prov/src/test/java/datarouter/provisioning/testFeedDelete.java
new file mode 100644
index 00000000..6e2b7181
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testFeedDelete.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testFeedDelete extends testBase {
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ }
+
+ @Test
+ public void testDeleteNormal() {
+ // Delete the first non-deleted feed in the DB
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = ja.length()-1; i >= 0; i--) {
+ JSONObject feed = ja.getJSONObject(i);
+ if (!feed.getBoolean("deleted")) {
+ int feedid = feed.getInt("feedid");
+ testCommon(HttpServletResponse.SC_NO_CONTENT, "/feed/"+feedid);
+ return;
+ }
+ }
+ }
+ @Test
+ public void testDeleteNoFeedID() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "/feed/");
+ }
+ @Test
+ public void testDeleteNoFeed() {
+ testCommon(HttpServletResponse.SC_NOT_FOUND, "/feed/999999");
+ }
+ private void testCommon(int expect, String uri) {
+ String url = props.getProperty("test.host") + uri;
+ HttpDelete del = new HttpDelete(url);
+ try {
+ del.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(del);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ del.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testFeedPut.java b/datarouter-prov/src/test/java/datarouter/provisioning/testFeedPut.java
new file mode 100644
index 00000000..8393a98a
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testFeedPut.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testFeedPut extends testBase {
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ }
+
+ @Test
+ public void testPutNoFeedID() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST, "/feed/");
+ }
+ @Test
+ public void testPutNoFeed() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_NOT_FOUND, "/feed/999999");
+ }
+ @Test
+ public void testBadContentType() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "bad/bad", "JUnit");
+ }
+ @Test
+ public void testChangeName() {
+ JSONObject jo = buildFeedRequest();
+ jo.put("name", "badname");
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST, FeedServlet.FEED_CONTENT_TYPE, "JUnit");
+ }
+ @Test
+ public void testChangeVersion() {
+ JSONObject jo = buildFeedRequest();
+ jo.put("version", "badvers");
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST, FeedServlet.FEED_CONTENT_TYPE, "JUnit");
+ }
+ @Test
+ public void testBadPublisher() {
+ JSONObject jo = buildFeedRequest();
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST, FeedServlet.FEED_CONTENT_TYPE, "BadBadBad");
+ }
+ @Test
+ public void testChangeDescription() {
+ JSONObject jo = buildFeedRequest();
+ // change descr
+ jo.put("description", "This description HAS BEEN CHANGED!!!");
+ testCommon(jo, HttpServletResponse.SC_OK, FeedServlet.FEED_CONTENT_TYPE, "JUnit");
+ }
+
+ private void testCommon(JSONObject jo, int expect, String uri) {
+ testCommon(jo, expect, FeedServlet.FEED_CONTENT_TYPE, "Junit", uri);
+ }
+ private void testCommon(JSONObject jo, int expect, String ctype, String bhdr) {
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject feed0 = ja.getJSONObject(i);
+ if (!feed0.getBoolean("deleted") && feed0.getString("publisher").equals(bhdr)) {
+ int feedid = feed0.getInt("feedid");
+ testCommon(jo, expect, ctype, bhdr, "/feed/"+feedid);
+ return;
+ }
+ }
+ }
+ private void testCommon(JSONObject jo, int expect, String ctype, String bhdr, String uri) {
+ String url = props.getProperty("test.host") + uri;
+ HttpPut put = new HttpPut(url);
+ try {
+ if (bhdr != null)
+ put.addHeader(FeedServlet.BEHALF_HEADER, bhdr);
+ String t = jo.toString();
+ HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create(ctype));
+ put.setEntity(body);
+
+ HttpResponse response = httpclient.execute(put);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ ctype = entity.getContentType().getValue().trim();
+ int code = response.getStatusLine().getStatusCode();
+ if (code == HttpServletResponse.SC_CREATED && !ctype.equals(FeedServlet.FEEDFULL_CONTENT_TYPE))
+ fail("Got wrong content type: "+ctype);
+
+ if (code == HttpServletResponse.SC_CREATED) {
+ Header[] loc = response.getHeaders("Location");
+ if (loc == null)
+ fail("Missing Location header.");
+ }
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ctype.equals(FeedServlet.FEEDFULL_CONTENT_TYPE)) {
+ // ck Location header!
+ JSONObject jo2 = null;
+ try {
+ jo2 = new JSONObject(new JSONTokener(entity.getContent()));
+ System.err.println(jo2.toString());
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ try {
+ jo2.getString("publisher");
+ JSONObject jo3 = jo2.getJSONObject("links");
+ jo3.getString("self");
+ jo3.getString("publish");
+ jo3.getString("subscribe");
+ jo3.getString("log");
+ } catch (JSONException e) {
+ fail("required field missing from result: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ put.releaseConnection();
+ }
+ }
+ private JSONObject buildFeedRequest() {
+ JSONObject jo = new JSONObject();
+ jo.put("name", "feed");
+ jo.put("version", "1.0.0");
+ jo.put("description", "Sample feed used by JUnit to test");
+
+ JSONObject jo2 = new JSONObject();
+ jo2.put("classification", "unrestricted");
+
+ JSONArray ja = new JSONArray();
+ JSONObject jo3 = new JSONObject();
+ jo3.put("id", "id001");
+ jo3.put("password", "re1kwelj");
+ JSONObject jo4 = new JSONObject();
+ jo4.put("id", "id002");
+ jo4.put("password", "o9eqlmbd");
+ ja.put(jo3);
+ ja.put(jo4);
+ jo2.put("endpoint_ids", ja);
+
+ ja = new JSONArray();
+ ja.put("20.0.0.1");
+ ja.put("195.68.12.15");
+ ja.put("135.207.136.128/25");
+ jo2.put("endpoint_addrs", ja);
+
+ jo.put("authorization", jo2);
+ return jo;
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testInternalGet.java b/datarouter-prov/src/test/java/datarouter/provisioning/testInternalGet.java
new file mode 100644
index 00000000..877975ac
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testInternalGet.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+import com.att.research.datarouter.provisioning.beans.Parameters;
+
+public class testInternalGet extends testBase {
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Test
+ public void testNormal() {
+ String url = props.getProperty("test.host") + "/internal/prov";
+ HttpGet httpPost = new HttpGet(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(httpPost);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != 200)
+ fail("Unexpected response, expect "+200+" got "+code);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ boolean ok = ctype.equals(FeedServlet.PROVFULL_CONTENT_TYPE1);
+ ok |= ctype.equals(FeedServlet.PROVFULL_CONTENT_TYPE2);
+ if (!ok)
+ fail("Got wrong content type: "+ctype);
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ok) {
+ JSONObject jo = null;
+ try {
+ jo = new JSONObject(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ try {
+ jo.getJSONArray("feeds");
+ jo.getJSONArray("subscriptions");
+ JSONObject jo2 = jo.getJSONObject("parameters");
+ jo2.getJSONArray(Parameters.NODES);
+ jo2.getString(Parameters.ACTIVE_POD);
+ jo2.getString(Parameters.STANDBY_POD);
+ jo2.getInt(Parameters.LOGROLL_INTERVAL);
+ jo2.getInt(Parameters.DELIVERY_INIT_RETRY_INTERVAL);
+ jo2.getInt(Parameters.DELIVERY_MAX_RETRY_INTERVAL);
+ jo2.getInt(Parameters.DELIVERY_RETRY_RATIO);
+ jo2.getInt(Parameters.DELIVERY_MAX_AGE);
+ } catch (JSONException e) {
+ fail("required field missing from result: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testInternalMisc.java b/datarouter-prov/src/test/java/datarouter/provisioning/testInternalMisc.java
new file mode 100644
index 00000000..f8a1da10
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testInternalMisc.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONTokener;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testInternalMisc extends testBase {
+ @Test
+ public void testInternalDrlogs() {
+ String url = props.getProperty("test.host") + "/internal/drlogs";
+ HttpGet httpPost = new HttpGet(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(httpPost);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != 200)
+ fail("Unexpected response, expect "+HttpServletResponse.SC_NOT_FOUND+" got "+code);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ boolean ok = ctype.equals("text/plain");
+ if (!ok)
+ fail("Got wrong content type: "+ctype);
+
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+
+ @Test
+ public void testInternalHalt() {
+ String url = props.getProperty("test.host") + "/internal/halt";
+ HttpGet httpPost = new HttpGet(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(httpPost);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != HttpServletResponse.SC_NOT_FOUND)
+ fail("Unexpected response, expect "+HttpServletResponse.SC_NOT_FOUND+" got "+code);
+
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+
+ @SuppressWarnings("unused")
+ @Test
+ public void testInternalLogs() {
+ String url = props.getProperty("test.host") + "/internal/logs";
+ HttpGet httpPost = new HttpGet(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(httpPost);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != 200)
+ fail("Unexpected response, expect "+200+" got "+code);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ boolean ok = ctype.equals("application/json");
+ if (!ok)
+ fail("Got wrong content type: "+ctype);
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ok) {
+ try {
+ new JSONArray(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+
+ @Test
+ public void testInternalBadURL() {
+ String url = props.getProperty("test.host") + "/internal/badurl";
+ HttpGet httpPost = new HttpGet(url);
+ try {
+ httpPost.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+
+ HttpResponse response = httpclient.execute(httpPost);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != HttpServletResponse.SC_NOT_FOUND)
+ fail("Unexpected response, expect "+HttpServletResponse.SC_NOT_FOUND+" got "+code);
+
+ HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testLogGet.java b/datarouter-prov/src/test/java/datarouter/provisioning/testLogGet.java
new file mode 100644
index 00000000..510150a2
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testLogGet.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testLogGet extends testBase {
+ private JSONArray returnedlist;
+ private int feedid = 4;
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ // need to seed the DB here
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ // need to "unseed" the DB
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+// JSONArray ja = db_state.getJSONArray("feeds");
+// for (int i = 0; i < ja.length(); i++) {
+// JSONObject jo = ja.getJSONObject(i);
+// if (!jo.getBoolean("deleted"))
+// feedid = jo.getInt("feedid");
+// }
+ }
+
+ @Test
+ public void testNormal() {
+ testCommon(HttpServletResponse.SC_OK);
+ }
+ @Test
+ public void testNormalPubOnly() {
+ testCommon(HttpServletResponse.SC_OK, "?type=pub");
+ }
+ @Test
+ public void testNormalDelOnly() {
+ testCommon(HttpServletResponse.SC_OK, "?type=del");
+ }
+ @Test
+ public void testNormalExpOnly() {
+ testCommon(HttpServletResponse.SC_OK, "?type=exp");
+ }
+ @Test
+ public void testNormalXXXOnly() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "?type=xxx");
+ }
+ @Test
+ public void testNormalStatusSuccess() {
+ testCommon(HttpServletResponse.SC_OK, "?statusCode=success");
+ }
+ @Test
+ public void testNormalStatusRedirect() {
+ testCommon(HttpServletResponse.SC_OK, "?statusCode=redirect");
+ }
+ @Test
+ public void testNormalStatusFailure() {
+ testCommon(HttpServletResponse.SC_OK, "?statusCode=failure");
+ }
+ @Test
+ public void testNormalStatus200() {
+ testCommon(HttpServletResponse.SC_OK, "?statusCode=200");
+ }
+ @Test
+ public void testNormalStatusXXX() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "?statusCode=xxx");
+ }
+ @Test
+ public void testNormalExpiryNotRetryable() {
+ testCommon(HttpServletResponse.SC_OK, "?expiryReason=notRetryable");
+ }
+ @Test
+ public void testNormalExpiryRetriesExhausted() {
+ testCommon(HttpServletResponse.SC_OK, "?expiryReason=retriesExhausted");
+ }
+ @Test
+ public void testNormalExpiryXXX() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "?expiryReason=xxx");
+ }
+ @Test
+ public void testNormalPublishId() {
+ testCommon(HttpServletResponse.SC_OK, "?publishId=1366985877801.mtdvnj00-drtr.proto.research.att.com");
+ }
+ @Test
+ public void testNormalStart() {
+ long n = System.currentTimeMillis() - (5 * 24 * 60 * 60 * 1000L); // 5 days
+ testCommon(HttpServletResponse.SC_OK, String.format("?start=%s", sdf.format(n)));
+ }
+ @Test
+ public void testBadStart() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "?start=xxx");
+ }
+ @Test
+ public void testLongEnd() {
+ testCommon(HttpServletResponse.SC_OK, "?end=1364837896220");
+ }
+ @Test
+ public void testBadEnd() {
+ testCommon(HttpServletResponse.SC_BAD_REQUEST, "?end=2013-04-25T11:01:25Q");
+ }
+ private void testCommon(int expect) {
+ testCommon(expect, "");
+ }
+ private void testCommon(int expect, String query) {
+ String url = props.getProperty("test.host") + "/feedlog/" + feedid + query;
+ HttpGet httpGet = new HttpGet(url);
+ try {
+ HttpResponse response = httpclient.execute(httpGet);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ if (expect == HttpServletResponse.SC_OK) {
+ if (!ctype.equals(FeedServlet.LOGLIST_CONTENT_TYPE))
+ fail("Got wrong content type: "+ctype);
+ }
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ctype.equals(FeedServlet.LOGLIST_CONTENT_TYPE)) {
+ try {
+ returnedlist = new JSONArray(new JSONTokener(entity.getContent()));
+ int n = returnedlist.length();
+ if (n != 0)
+ System.err.println(n + " items");
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ httpGet.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testPublish.java b/datarouter-prov/src/test/java/datarouter/provisioning/testPublish.java
new file mode 100644
index 00000000..15d0565f
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testPublish.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.RedirectStrategy;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+
+public class testPublish extends testBase {
+ private String publish_url;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ // Get publish URL from first feed
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = ja.length()-1; i >= 0; i--) {
+ JSONObject feed = ja.getJSONObject(i);
+ if (!feed.getBoolean("deleted")) {
+ publish_url = feed.getJSONObject("links").getString("publish");
+ publish_url += "/" + System.currentTimeMillis();
+ return;
+ }
+ }
+ }
+
+ @Test
+ public void testDelete() {
+ HttpDelete x = new HttpDelete(publish_url);
+ testCommon(x);
+ }
+ @Test
+ public void testGet() {
+ HttpGet x = new HttpGet(publish_url);
+ testCommon(x);
+ }
+ @Test
+ public void testPut() {
+ HttpPut x = new HttpPut(publish_url);
+ testCommon(x);
+ }
+ @Test
+ public void testPost() {
+ HttpPost x = new HttpPost(publish_url);
+ testCommon(x);
+ }
+ private void testCommon(HttpRequestBase rb) {
+ try {
+ rb.addHeader(FeedServlet.BEHALF_HEADER, "JUnit");
+ RedirectStrategy strategy = new DefaultRedirectStrategy() {
+ protected boolean isRedirectable(String method) {
+ return false;
+ }
+ };
+ httpclient.setRedirectStrategy(strategy);
+ HttpResponse response = httpclient.execute(rb);
+ ckResponse(response, HttpServletResponse.SC_MOVED_PERMANENTLY);
+
+ // Make sure there is a Location hdr
+ Header[] loc = response.getHeaders("Location");
+ if (loc == null || loc.length == 0)
+ fail("No location header");
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ rb.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testRLEBitSet.java b/datarouter-prov/src/test/java/datarouter/provisioning/testRLEBitSet.java
new file mode 100644
index 00000000..40970edf
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testRLEBitSet.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.util.Iterator;
+
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.utils.RLEBitSet;
+
+public class testRLEBitSet {
+ @Test
+ public void testBasicConstructor() {
+ RLEBitSet bs = new RLEBitSet();
+ if (!bs.isEmpty())
+ fail("bit set not empty");
+ }
+ @Test
+ public void testStringConstructor() {
+ RLEBitSet bs = new RLEBitSet("1-10");
+ if (bs.isEmpty())
+ fail("bit set is empty");
+ if (!bs.toString().equals("1-10"))
+ fail("bad value");
+ bs = new RLEBitSet("69,70,71");
+ if (bs.isEmpty())
+ fail("bit set is empty");
+ if (!bs.toString().equals("69-71"))
+ fail("bad value");
+ bs = new RLEBitSet("555 444 443 442");
+ if (!bs.toString().equals("442-444,555"))
+ fail("bad value");
+ }
+ @Test
+ public void testLength() {
+ RLEBitSet bs = new RLEBitSet();
+ if (bs.length() != 0)
+ fail("testLength fail "+bs + " " + bs.length());
+ bs = new RLEBitSet("1-10");
+ if (bs.length() != 11)
+ fail("testLength fail "+bs + " " + bs.length());
+ bs = new RLEBitSet("1-20,100000000-100000005");
+ if (bs.length() != 100000006)
+ fail("testLength fail "+bs + " " + bs.length());
+ }
+ @Test
+ public void testGet() {
+ RLEBitSet bs = new RLEBitSet("1-10");
+ if (!bs.get(5))
+ fail("get");
+ if (bs.get(69))
+ fail("get");
+ }
+ @Test
+ public void testSetOneBit() {
+ RLEBitSet bs = new RLEBitSet();
+ for (int i = 12; i < 200; i++)
+ bs.set(i);
+ bs.set(690);
+ for (int i = 305; i < 309; i++)
+ bs.set(i);
+ bs.set(304);
+ if (!bs.toString().equals("12-199,304-308,690"))
+ fail("testSetOneBit fail "+bs);
+ }
+ @Test
+ public void testSetString() {
+ RLEBitSet bs = new RLEBitSet();
+ bs.set("1-100");
+ if (!bs.toString().equals("1-100"))
+ fail("testSetString fail "+bs);
+ }
+ @Test
+ public void testSetRange() {
+ RLEBitSet bs = new RLEBitSet();
+ bs.set(50,60);
+ if (!bs.toString().equals("50-59"))
+ fail("testSetRange fail "+bs);
+ }
+ @Test
+ public void testClearOneBit() {
+ RLEBitSet bs = new RLEBitSet("1-10");
+ bs.clear(5);
+ if (!bs.toString().equals("1-4,6-10"))
+ fail("testClearOneBit fail");
+ bs = new RLEBitSet("1-10");
+ bs.clear(11);
+ if (!bs.toString().equals("1-10"))
+ fail("testClearOneBit fail "+bs);
+ }
+ @Test
+ public void testClearRangeLeft() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(40,50);
+ if (!bs.toString().equals("100-200"))
+ fail("testClearRangeLeft fail "+bs);
+ }
+ @Test
+ public void testClearRangeRight() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(400,500);
+ if (!bs.toString().equals("100-200"))
+ fail("testClearRangeRight fail "+bs);
+ }
+ @Test
+ public void testClearRangeMiddle() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(120,130);
+ if (!bs.toString().equals("100-119,130-200"))
+ fail("testClearRangeRight fail "+bs);
+ }
+ @Test
+ public void testClearRangeIntersect() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(100,200);
+ if (!bs.toString().equals("200"))
+ fail("testClearRangeIntersect fail "+bs);
+ }
+ @Test
+ public void testClearOverlapLeft() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(50,150);
+ if (!bs.toString().equals("150-200"))
+ fail("testClearOverlapLeft fail "+bs);
+ }
+ @Test
+ public void testClearOverlapRight() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(150,250);
+ if (!bs.toString().equals("100-149"))
+ fail("testClearOverlapRight fail "+bs);
+ }
+ @Test
+ public void testClearOverlapAll() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ bs.clear(50,250);
+ if (!bs.toString().equals(""))
+ fail("testClearOverlapAll fail "+bs);
+ }
+ @Test
+ public void testAnd() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ RLEBitSet b2 = new RLEBitSet("150-400");
+ bs.and(b2);
+ if (!bs.toString().equals("150-200"))
+ fail("testAnd fail "+bs);
+ bs = new RLEBitSet("100-200");
+ b2 = new RLEBitSet("1500-4000");
+ bs.and(b2);
+ if (!bs.isEmpty())
+ fail("testAnd fail "+bs);
+ }
+ @Test
+ public void testAndNot() {
+ RLEBitSet bs = new RLEBitSet("100-200");
+ RLEBitSet b2 = new RLEBitSet("150-159");
+ bs.andNot(b2);
+ if (!bs.toString().equals("100-149,160-200"))
+ fail("testAndNot fail "+bs);
+ }
+ @Test
+ public void testIsEmpty() {
+ RLEBitSet bs = new RLEBitSet("");
+ if (!bs.isEmpty())
+ fail("testIsEmpty fail "+bs);
+ bs.set(1);
+ if (bs.isEmpty())
+ fail("testIsEmpty fail "+bs);
+ }
+ @Test
+ public void testCardinality() {
+ RLEBitSet bs = new RLEBitSet("1-120,10000000-10000005");
+ if (bs.cardinality() != 126)
+ fail("testCardinality fail 1");
+ }
+ @Test
+ public void testIterator() {
+ RLEBitSet bs = new RLEBitSet("1,5,10-12");
+ Iterator<Long[]> i = bs.getRangeIterator();
+ if (!i.hasNext())
+ fail("iterator fail 1");
+ Long[] ll = i.next();
+ if (ll == null || ll[0] != 1 || ll[1] != 1)
+ fail("iterator fail 2");
+
+ if (!i.hasNext())
+ fail("iterator fail 3");
+ ll = i.next();
+ if (ll == null || ll[0] != 5 || ll[1] != 5)
+ fail("iterator fail 4");
+
+ if (!i.hasNext())
+ fail("iterator fail 5");
+ ll = i.next();
+ if (ll == null || ll[0] != 10 || ll[1] != 12)
+ fail("iterator fail 6");
+
+ if (i.hasNext())
+ fail("iterator fail 7");
+ }
+ @Test
+ public void testClone() {
+ RLEBitSet bs1 = new RLEBitSet("1,5,10-12");
+ RLEBitSet bs2 = (RLEBitSet) bs1.clone();
+ if (!bs1.toString().equals(bs2.toString()))
+ fail("clone");
+ }
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testRouteAPI.java b/datarouter-prov/src/test/java/datarouter/provisioning/testRouteAPI.java
new file mode 100644
index 00000000..7295d00f
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testRouteAPI.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import datarouter.provisioning.testBase;
+
+public class testRouteAPI extends testBase {
+
+}
diff --git a/datarouter-prov/src/test/java/datarouter/provisioning/testSubscribePost.java b/datarouter-prov/src/test/java/datarouter/provisioning/testSubscribePost.java
new file mode 100644
index 00000000..0f624ec5
--- /dev/null
+++ b/datarouter-prov/src/test/java/datarouter/provisioning/testSubscribePost.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 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====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package datarouter.provisioning;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.att.research.datarouter.provisioning.FeedServlet;
+import com.att.research.datarouter.provisioning.SubscribeServlet;
+
+public class testSubscribePost extends testBase {
+ private int feednum = 0;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ getDBstate();
+ // use the first feed to subscribe to
+ JSONArray ja = db_state.getJSONArray("feeds");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject feed0 = ja.getJSONObject(i);
+ if (feed0 != null && !feed0.getBoolean("deleted")) {
+ feednum = feed0.getInt("feedid");
+ return;
+ }
+ }
+ }
+
+ @Test
+ public void testNormal() {
+ JSONObject jo = buildSubRequest();
+ testCommon(jo, HttpServletResponse.SC_CREATED);
+ }
+ @Test
+ public void testMissingUrl() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").remove("url");
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testTooLongUrl() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").put("url", "https://"+s_257);
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testMissingUser() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").remove("user");
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testTooLongUser() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").put("user", s_33);
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testMissingPassword() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").remove("password");
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testTooLongPassword() {
+ JSONObject jo = buildSubRequest();
+ jo.getJSONObject("delivery").put("password", s_33);
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ @Test
+ public void testNonBooleanMetadata() {
+ JSONObject jo = buildSubRequest();
+ jo.put("metadataOnly", s_33);
+ testCommon(jo, HttpServletResponse.SC_BAD_REQUEST);
+ }
+ private void testCommon(JSONObject jo, int expect) {
+ String url = props.getProperty("test.host") + "/subscribe/" + feednum;
+ HttpPost httpPost = new HttpPost(url);
+ try {
+ httpPost.addHeader(SubscribeServlet.BEHALF_HEADER, "JUnit");
+ String t = jo.toString();
+ HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create(SubscribeServlet.SUB_CONTENT_TYPE));
+ httpPost.setEntity(body);
+
+ HttpResponse response = httpclient.execute(httpPost);
+ ckResponse(response, expect);
+
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue();
+ int code = response.getStatusLine().getStatusCode();
+ if (code == HttpServletResponse.SC_CREATED && !ctype.equals(SubscribeServlet.SUBFULL_CONTENT_TYPE))
+ fail("Got wrong content type: "+ctype);
+
+ // do something useful with the response body and ensure it is fully consumed
+ if (ctype.equals(FeedServlet.SUBFULL_CONTENT_TYPE)) {
+ JSONObject jo2 = null;
+ try {
+ jo2 = new JSONObject(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ fail("Bad JSON: "+e.getMessage());
+ }
+ try {
+ jo2.getString("subscriber");
+ JSONObject jo3 = jo2.getJSONObject("links");
+ jo3.getString("self");
+ jo3.getString("feed");
+ jo3.getString("log");
+ } catch (JSONException e) {
+ fail("required field missing from result: "+e.getMessage());
+ }
+ } else {
+ EntityUtils.consume(entity);
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+ private JSONObject buildSubRequest() {
+ JSONObject jo = new JSONObject();
+
+ JSONObject jo2 = new JSONObject();
+ jo2.put("url", "https://www.att.com/");
+ jo2.put("user", "dmr");
+ jo2.put("password", "passw0rd");
+ jo2.put("use100", true);
+
+ jo.put("delivery", jo2);
+ jo.put("metadataOnly", Boolean.FALSE);
+ return jo;
+ }
+}