diff options
author | Håkon Hallingstad <hakon@oath.com> | 2019-01-09 12:08:53 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@oath.com> | 2019-01-09 12:08:53 +0100 |
commit | 68cbb82330cb610ff3e3462a7ec704f78e49a31c (patch) | |
tree | 6c3a996789700f24037a2c6a4d4d37f7f643ea60 /flags/src/test/java/com/yahoo | |
parent | 8bec9bc0719af7ee27cda0f0d6d6b3627d155180 (diff) |
Flag repository cfg client and flag directory
- Makes new FlagRepository config server client to retrieve all flag data.
- Makes WireFlagDataList to be used for creating the HTTP response in the
config server, and parse the HTTP response in host admin.
- Fixes problem with URL generation for controller: when port is not present
in the request, remove ":-1" port specification in the url.
- Makes a new FlagDirectory class, responsible for reading flags from
/opt/vespa/var/vespa/flags (in FlagData JSON format), and reversely,
sync that directory to exactly match a set of FlagData.
- No longer have 'State state()' as a default method in interface.
Diffstat (limited to 'flags/src/test/java/com/yahoo')
-rw-r--r-- | flags/src/test/java/com/yahoo/vespa/flags/file/FlagDirectoryTest.java | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/file/FlagDirectoryTest.java b/flags/src/test/java/com/yahoo/vespa/flags/file/FlagDirectoryTest.java new file mode 100644 index 00000000000..fec98fab164 --- /dev/null +++ b/flags/src/test/java/com/yahoo/vespa/flags/file/FlagDirectoryTest.java @@ -0,0 +1,86 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.flags.file; + +import com.yahoo.vespa.flags.FetchVector; +import com.yahoo.vespa.flags.FlagId; +import com.yahoo.vespa.flags.json.FlagData; +import com.yahoo.vespa.test.file.TestFileSystem; +import org.hamcrest.collection.IsMapContaining; +import org.hamcrest.collection.IsMapWithSize; +import org.junit.Test; + +import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystem; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; + +import static com.yahoo.yolean.Exceptions.uncheck; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +/** + * @author hakonhall + */ +public class FlagDirectoryTest { + private final FileSystem fileSystem = TestFileSystem.create(); + private final FlagDirectory flagDirectory = new FlagDirectory(fileSystem); + + @Test + public void testReadingOnly() { + Map<FlagId, FlagData> data = flagDirectory.read(); + assertThat(data, IsMapWithSize.anEmptyMap()); + + FlagId id1 = new FlagId("id1"); + String json1 = "{\"id\":\"id1\"}"; + writeUtf8FlagFile(id1.toString(), json1); + data = flagDirectory.read(); + assertThat(data, IsMapWithSize.aMapWithSize(1)); + assertThat(data, IsMapContaining.hasKey(id1)); + assertThat(data.get(id1).id(), equalTo(id1)); + assertThat(data.get(id1).serializeToJson(), equalTo(json1)); + } + + @Test + public void testSync() { + Map<FlagId, FlagData> dataMap = new HashMap<>(); + FlagId id1 = new FlagId("id1"); + FlagData data1 = new FlagData(id1, new FetchVector()); + dataMap.put(id1, data1); + FlagId id2 = new FlagId("id2"); + FlagData data2 = new FlagData(id2, new FetchVector()); + dataMap.put(id2, data2); + + // Non-existing directory => empty map + assertThat(flagDirectory.read(), IsMapWithSize.anEmptyMap()); + + // sync() will create directory with map content + assertThat(flagDirectory.sync(dataMap), equalTo(true)); + Map<FlagId, FlagData> readDataMap = flagDirectory.read(); + assertThat(readDataMap, IsMapWithSize.aMapWithSize(2)); + assertThat(readDataMap, IsMapContaining.hasKey(id1)); + assertThat(readDataMap, IsMapContaining.hasKey(id2)); + + // another sync with the same data is a no-op + assertThat(flagDirectory.sync(dataMap), equalTo(false)); + + // Changing value of id1, removing id2, adding id3 + dataMap.remove(id2); + FlagData newData1 = new FlagData(id1, new FetchVector().with(FetchVector.Dimension.HOSTNAME, "h1")); + dataMap.put(id1, newData1); + FlagId id3 = new FlagId("id3"); + FlagData data3 = new FlagData(id3, new FetchVector()); + dataMap.put(id3, data3); + assertThat(flagDirectory.sync(dataMap), equalTo(true)); + Map<FlagId, FlagData> anotherReadDataMap = flagDirectory.read(); + assertThat(anotherReadDataMap, IsMapWithSize.aMapWithSize(2)); + assertThat(anotherReadDataMap, IsMapContaining.hasKey(id1)); + assertThat(anotherReadDataMap, IsMapContaining.hasKey(id3)); + assertThat(anotherReadDataMap.get(id1).serializeToJson(), equalTo("{\"id\":\"id1\",\"attributes\":{\"hostname\":\"h1\"}}")); + } + + private void writeUtf8FlagFile(String flagIdAkaFilename, String content) { + uncheck(() -> Files.createDirectories(flagDirectory.getPath())); + uncheck(() -> Files.write(flagDirectory.getPath().resolve(flagIdAkaFilename), content.getBytes(StandardCharsets.UTF_8))); + } +}
\ No newline at end of file |