/* * Copyright © 2015 Cask Data, Inc. * * 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. */ package co.cask.cdap.internal.app.services.http.handlers; import co.cask.cdap.WordCountApp; import co.cask.cdap.common.conf.Constants; import co.cask.cdap.gateway.handlers.PreferencesHttpHandler; import co.cask.cdap.internal.app.services.http.AppFabricTestBase; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import org.junit.Assert; import org.junit.Test; import java.util.Map; /** * Tests for {@link PreferencesHttpHandler} */ public class PreferencesHttpHandlerTest extends AppFabricTestBase { @Test public void testInstance() throws Exception { Map<String, String> propMap = Maps.newHashMap(); Assert.assertEquals(propMap, getProperty(getURI(), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(), true, 200)); propMap.put("k1", "3@#3"); propMap.put("@#$#ljfds", "231@#$"); setProperty(getURI(), propMap, 200); Assert.assertEquals(propMap, getProperty(getURI(), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(), true, 200)); propMap.clear(); deleteProperty(getURI(), 200); Assert.assertEquals(propMap, getProperty(getURI(), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(), true, 200)); } @Test public void testNamespace() throws Exception { Map<String, String> propMap = Maps.newHashMap(); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2), true, 200)); propMap.put("k1", "3@#3"); propMap.put("@#$#ljfds", "231@#$"); setProperty(getURI(TEST_NAMESPACE1), propMap, 200); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); Map<String, String> instanceMap = Maps.newHashMap(); instanceMap.put("k1", "432432*#######"); setProperty(getURI(), instanceMap, 200); Assert.assertEquals(instanceMap, getProperty(getURI(), true, 200)); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE2), true, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); instanceMap.put("k2", "(93424"); setProperty(getURI(), instanceMap, 200); instanceMap.putAll(propMap); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); deleteProperty(getURI(TEST_NAMESPACE1), 200); deleteProperty(getURI(TEST_NAMESPACE2), 200); instanceMap.clear(); instanceMap.put("*&$kjh", "*(&*1"); setProperty(getURI(), instanceMap, 200); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE2), true, 200)); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); instanceMap.clear(); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE2), false, 200)); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE1), false, 200)); deleteProperty(getURI(), 200); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE2), true, 200)); Assert.assertEquals(instanceMap, getProperty(getURI(TEST_NAMESPACE1), true, 200)); getProperty(getURI("invalidNamespace"), true, 404); } @Test public void testApplication() throws Exception { deploy(WordCountApp.class, Constants.Gateway.API_VERSION_3_TOKEN, TEST_NAMESPACE1); Map<String, String> propMap = Maps.newHashMap(); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), true, 200)); getProperty(getURI(TEST_NAMESPACE1, "InvalidAppName"), false, 404); setProperty(getURI(), ImmutableMap.of("k1", "instance"), 200); setProperty(getURI(TEST_NAMESPACE1), ImmutableMap.of("k1", "namespace"), 200); setProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), ImmutableMap.of("k1", "application"), 200); Assert.assertEquals("application", getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), false, 200).get("k1")); Assert.assertEquals("application", getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), true, 200).get("k1")); Assert.assertEquals("namespace", getProperty(getURI(TEST_NAMESPACE1), false, 200).get("k1")); Assert.assertEquals("namespace", getProperty(getURI(TEST_NAMESPACE1), true, 200).get("k1")); Assert.assertEquals("instance", getProperty(getURI(), true, 200).get("k1")); Assert.assertEquals("instance", getProperty(getURI(), false, 200).get("k1")); deleteProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), 200); Assert.assertEquals("namespace", getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), true, 200).get("k1")); Assert.assertNull(getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), false, 200).get("k1")); deleteProperty(getURI(TEST_NAMESPACE1), 200); Assert.assertEquals("instance", getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), true, 200).get("k1")); Assert.assertEquals("instance", getProperty(getURI(TEST_NAMESPACE1), true, 200).get("k1")); Assert.assertNull(getProperty(getURI(TEST_NAMESPACE1), false, 200).get("k1")); deleteProperty(getURI(), 200); Assert.assertNull(getProperty(getURI(), true, 200).get("k1")); Assert.assertNull(getProperty(getURI(TEST_NAMESPACE1), true, 200).get("k1")); Assert.assertNull(getProperty(getURI(TEST_NAMESPACE1, "WordCountApp"), true, 200).get("k1")); } @Test public void testProgram() throws Exception { deploy(WordCountApp.class, Constants.Gateway.API_VERSION_3_TOKEN, TEST_NAMESPACE2); Map<String, String> propMap = Maps.newHashMap(); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), false, 200)); getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "invalidType", "somename"), false, 400); getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "somename"), false, 404); propMap.put("k1", "k349*&#$"); setProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), propMap, 200); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), false, 200)); propMap.put("k1", "instance"); setProperty(getURI(), propMap, 200); Assert.assertEquals(propMap, getProperty(getURI(), true, 200)); propMap.put("k1", "k349*&#$"); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), false, 200)); deleteProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), 200); propMap.put("k1", "instance"); Assert.assertEquals(0, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), false, 200).size()); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), true, 200)); deleteProperty(getURI(), 200); propMap.clear(); Assert.assertEquals(propMap, getProperty(getURI(TEST_NAMESPACE2, "WordCountApp", "flows", "WordCountFlow"), false, 200)); Assert.assertEquals(propMap, getProperty(getURI(), false, 200)); } private String getURI() { return ""; } private String getURI(String namespace) { return String.format("%s/namespaces/%s", getURI(), namespace); } private String getURI(String namespace, String appId) { return String.format("%s/apps/%s", getURI(namespace), appId); } private String getURI(String namespace, String appId, String programType, String programId) { return String.format("%s/%s/%s", getURI(namespace, appId), programType, programId); } private void setProperty(String uri, Map<String, String> props, int expectedStatus) throws Exception { HttpResponse response = doPut(String.format("/v3/%s/preferences", uri), GSON.toJson(props)); Assert.assertEquals(expectedStatus, response.getStatusLine().getStatusCode()); } private Map<String, String> getProperty(String uri, boolean resolved, int expectedStatus) throws Exception { String request = String.format("/v3/%s/preferences", uri); if (resolved) { request += "?resolved=true"; } HttpResponse response = doGet(request); Assert.assertEquals(expectedStatus, response.getStatusLine().getStatusCode()); if (expectedStatus == 200) { String s = EntityUtils.toString(response.getEntity()); return GSON.fromJson(s, MAP_STRING_STRING_TYPE); } return null; } private void deleteProperty(String uri, int expectedStatus) throws Exception { HttpResponse response = doDelete(String.format("/v3/%s/preferences", uri)); Assert.assertEquals(expectedStatus, response.getStatusLine().getStatusCode()); } }