diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-07-12 15:49:04 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-07-12 15:49:04 +0200 |
commit | c10ba446e46fe390b052958e3148cbf9bbb74a9b (patch) | |
tree | 7d422465c5c46c8e5ca8fedce4b8e1bb4f8cf68e /flags/src/test | |
parent | 12b55be208be4199178c7c1387c308fe8d80f947 (diff) |
Revert "Decouple flags REST API from config server"
This reverts commit b81b21546cdff92d360cbdf7dda27e6ed7bc7170.
Diffstat (limited to 'flags/src/test')
-rw-r--r-- | flags/src/test/java/com/yahoo/vespa/flags/http/FlagsHandlerTest.java | 203 | ||||
-rw-r--r-- | flags/src/test/java/com/yahoo/vespa/flags/persistence/FlagsDbTest.java | 56 |
2 files changed, 0 insertions, 259 deletions
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/http/FlagsHandlerTest.java b/flags/src/test/java/com/yahoo/vespa/flags/http/FlagsHandlerTest.java deleted file mode 100644 index 8ae1008ba22..00000000000 --- a/flags/src/test/java/com/yahoo/vespa/flags/http/FlagsHandlerTest.java +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.flags.http; - -import com.yahoo.container.jdisc.HttpRequest; -import com.yahoo.container.jdisc.HttpResponse; -import com.yahoo.jdisc.http.HttpRequest.Method; -import com.yahoo.text.Utf8; -import com.yahoo.vespa.curator.mock.MockCurator; -import com.yahoo.vespa.flags.FetchVector; -import com.yahoo.vespa.flags.FlagId; -import com.yahoo.vespa.flags.Flags; -import com.yahoo.vespa.flags.UnboundBooleanFlag; -import com.yahoo.vespa.flags.persistence.FlagsDb; -import com.yahoo.yolean.Exceptions; -import org.junit.Test; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; - -/** - * @author hakonhall - */ -public class FlagsHandlerTest { - private static final UnboundBooleanFlag FLAG1 = Flags.defineFeatureFlag( - "id1", false, "desc1", "mod1"); - private static final UnboundBooleanFlag FLAG2 = Flags.defineFeatureFlag( - "id2", true, "desc2", "mod2", - FetchVector.Dimension.HOSTNAME, FetchVector.Dimension.APPLICATION_ID); - - private static final String FLAGS_V1_URL = "https://foo.com:4443/flags/v1"; - - private final FlagsDb flagsDb = new FlagsDb(new MockCurator()); - private final FlagsHandler handler = new FlagsHandler(FlagsHandler.testOnlyContext(), flagsDb); - - @Test - public void testV1() { - String expectedResponse = "{" + - Stream.of("data", "defined") - .map(name -> "\"" + name + "\":{\"url\":\"https://foo.com:4443/flags/v1/" + name + "\"}") - .collect(Collectors.joining(",")) + - "}"; - verifySuccessfulRequest(Method.GET, "", "", expectedResponse); - verifySuccessfulRequest(Method.GET, "/", "", expectedResponse); - } - - @Test - public void testDefined() { - try (Flags.Replacer replacer = Flags.clearFlagsForTesting()) { - fixUnusedWarning(replacer); - Flags.defineFeatureFlag("id", false, "desc", "mod", FetchVector.Dimension.HOSTNAME); - verifySuccessfulRequest(Method.GET, "/defined", "", - "{\"id\":{\"description\":\"desc\",\"modification-effect\":\"mod\",\"dimensions\":[\"hostname\"]}}"); - - verifySuccessfulRequest(Method.GET, "/defined/id", "", - "{\"description\":\"desc\",\"modification-effect\":\"mod\",\"dimensions\":[\"hostname\"]}"); - } - } - - private void fixUnusedWarning(Flags.Replacer replacer) { } - - @Test - public void testData() { - // PUT flag with ID id1 - verifySuccessfulRequest(Method.PUT, "/data/" + FLAG1.id(), - "{\n" + - " \"id\": \"id1\",\n" + - " \"rules\": [\n" + - " {\n" + - " \"value\": true\n" + - " }\n" + - " ]\n" + - "}", - ""); - - // GET on ID id1 should return the same as the put. - verifySuccessfulRequest(Method.GET, "/data/" + FLAG1.id(), - "", "{\"id\":\"id1\",\"rules\":[{\"value\":true}]}"); - - // List all flags should list only id1 - verifySuccessfulRequest(Method.GET, "/data", - "", "{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com:4443/flags/v1/data/id1\"}]}"); - - // Should be identical to above: suffix / on path should be ignored - verifySuccessfulRequest(Method.GET, "/data/", - "", "{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com:4443/flags/v1/data/id1\"}]}"); - - // Verify absent port => absent in response - assertThat(handleWithPort(Method.GET, -1, "/data", "", 200), - is("{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com/flags/v1/data/id1\"}]}")); - - // PUT id2 - verifySuccessfulRequest(Method.PUT, "/data/" + FLAG2.id(), - "{\n" + - " \"id\": \"id2\",\n" + - " \"rules\": [\n" + - " {\n" + - " \"conditions\": [\n" + - " {\n" + - " \"type\": \"whitelist\",\n" + - " \"dimension\": \"hostname\",\n" + - " \"values\": [ \"host1\", \"host2\" ]\n" + - " },\n" + - " {\n" + - " \"type\": \"blacklist\",\n" + - " \"dimension\": \"application\",\n" + - " \"values\": [ \"app1\", \"app2\" ]\n" + - " }\n" + - " ],\n" + - " \"value\": true\n" + - " }\n" + - " ],\n" + - " \"attributes\": {\n" + - " \"zone\": \"zone1\"\n" + - " }\n" + - "}\n", - ""); - - // GET on id2 should now return what was put - verifySuccessfulRequest(Method.GET, "/data/" + FLAG2.id(), "", - "{\"id\":\"id2\",\"rules\":[{\"conditions\":[{\"type\":\"whitelist\",\"dimension\":\"hostname\",\"values\":[\"host1\",\"host2\"]},{\"type\":\"blacklist\",\"dimension\":\"application\",\"values\":[\"app1\",\"app2\"]}],\"value\":true}],\"attributes\":{\"zone\":\"zone1\"}}"); - - // The list of flag data should return id1 and id2 - verifySuccessfulRequest(Method.GET, "/data", - "", - "{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com:4443/flags/v1/data/id1\"},{\"id\":\"id2\",\"url\":\"https://foo.com:4443/flags/v1/data/id2\"}]}"); - - // Putting (overriding) id1 should work silently - verifySuccessfulRequest(Method.PUT, "/data/" + FLAG1.id(), - "{\n" + - " \"id\": \"id1\",\n" + - " \"rules\": [\n" + - " {\n" + - " \"value\": false\n" + - " }\n" + - " ]\n" + - "}\n", - ""); - - // Verify PUT - verifySuccessfulRequest(Method.GET, "/data/" + FLAG1.id(), "", "{\"id\":\"id1\",\"rules\":[{\"value\":false}]}"); - - // Get all recursivelly displays all flag data - verifySuccessfulRequest(Method.GET, "/data?recursive=true", "", - "{\"flags\":[{\"id\":\"id1\",\"rules\":[{\"value\":false}]},{\"id\":\"id2\",\"rules\":[{\"conditions\":[{\"type\":\"whitelist\",\"dimension\":\"hostname\",\"values\":[\"host1\",\"host2\"]},{\"type\":\"blacklist\",\"dimension\":\"application\",\"values\":[\"app1\",\"app2\"]}],\"value\":true}],\"attributes\":{\"zone\":\"zone1\"}}]}"); - - // Deleting both flags - verifySuccessfulRequest(Method.DELETE, "/data/" + FLAG1.id(), "", ""); - verifySuccessfulRequest(Method.DELETE, "/data/" + FLAG2.id(), "", ""); - - // And the list of data flags should now be empty - verifySuccessfulRequest(Method.GET, "/data", "", "{\"flags\":[]}"); - } - - @Test - public void testForcing() { - assertThat(handle(Method.PUT, "/data/" + new FlagId("undef"), "", 400), - containsString("There is no flag 'undef'")); - - assertThat(handle(Method.PUT, "/data/" + new FlagId("undef") + "?force=true", "", 400), - containsString("No content to map due to end-of-input")); - - assertThat(handle(Method.PUT, "/data/" + FLAG1.id(), "{}", 400), - containsString("Flag ID missing")); - - assertThat(handle(Method.PUT, "/data/" + FLAG1.id(), "{\"id\": \"id1\",\"rules\": [{\"value\":\"string\"}]}", 400), - containsString("Wrong type of JsonNode: STRING")); - - assertThat(handle(Method.PUT, "/data/" + FLAG1.id() + "?force=true", "{\"id\": \"id1\",\"rules\": [{\"value\":\"string\"}]}", 200), - is("")); - } - - private void verifySuccessfulRequest(Method method, String pathSuffix, String requestBody, String expectedResponseBody) { - assertThat(handle(method, pathSuffix, requestBody, 200), is(expectedResponseBody)); - } - - private String handle(Method method, String pathSuffix, String requestBody, int expectedStatus) { - return handleWithPort(method, 4443, pathSuffix, requestBody, expectedStatus); - } - - private String handleWithPort(Method method, int port, String pathSuffix, String requestBody, int expectedStatus) { - String uri = "https://foo.com" + (port < 0 ? "" : ":" + port) + "/flags/v1" + pathSuffix; - HttpRequest request = HttpRequest.createTestRequest(uri, method, makeInputStream(requestBody)); - HttpResponse response = handler.handle(request); - assertEquals(expectedStatus, response.getStatus()); - assertEquals("application/json", response.getContentType()); - var outputStream = new ByteArrayOutputStream(); - Exceptions.uncheck(() -> response.render(outputStream)); - return outputStream.toString(StandardCharsets.UTF_8); - } - - private InputStream makeInputStream(String content) { - return new ByteArrayInputStream(Utf8.toBytes(content)); - } -} diff --git a/flags/src/test/java/com/yahoo/vespa/flags/persistence/FlagsDbTest.java b/flags/src/test/java/com/yahoo/vespa/flags/persistence/FlagsDbTest.java deleted file mode 100644 index 5102305af90..00000000000 --- a/flags/src/test/java/com/yahoo/vespa/flags/persistence/FlagsDbTest.java +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.flags.persistence; - -import com.yahoo.vespa.curator.mock.MockCurator; -import com.yahoo.vespa.flags.FetchVector; -import com.yahoo.vespa.flags.FlagId; -import com.yahoo.vespa.flags.JsonNodeRawFlag; -import com.yahoo.vespa.flags.json.Condition; -import com.yahoo.vespa.flags.json.FlagData; -import com.yahoo.vespa.flags.json.Rule; -import org.junit.Test; - -import java.util.Map; -import java.util.Optional; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author hakonhall - */ -public class FlagsDbTest { - @Test - public void test() { - MockCurator curator = new MockCurator(); - FlagsDb db = new FlagsDb(curator); - - Condition condition1 = new Condition(Condition.Type.WHITELIST, FetchVector.Dimension.HOSTNAME, "host1"); - Rule rule1 = new Rule(Optional.of(JsonNodeRawFlag.fromJson("13")), condition1); - FlagId flagId = new FlagId("id"); - FlagData data = new FlagData(flagId, new FetchVector().with(FetchVector.Dimension.ZONE_ID, "zone-a"), rule1); - db.setValue(flagId, data); - - Optional<FlagData> dataCopy = db.getValue(flagId); - assertTrue(dataCopy.isPresent()); - - assertEquals("{\"id\":\"id\",\"rules\":[{\"conditions\":[{\"type\":\"whitelist\",\"dimension\":\"hostname\"," + - "\"values\":[\"host1\"]}],\"value\":13}],\"attributes\":{\"zone\":\"zone-a\"}}", - dataCopy.get().serializeToJson()); - - FlagId flagId2 = new FlagId("id2"); - FlagData data2 = new FlagData(flagId2, new FetchVector().with(FetchVector.Dimension.ZONE_ID, "zone-a"), rule1); - db.setValue(flagId2, data2); - Map<FlagId, FlagData> flags = db.getAllFlags(); - assertThat(flags.size(), equalTo(2)); - assertThat(flags.get(flagId), notNullValue()); - assertThat(flags.get(flagId2), notNullValue()); - - db.removeValue(flagId2); - assertFalse(db.getValue(flagId2).isPresent()); - } -} |