summaryrefslogtreecommitdiffstats
path: root/config-proxy/src/test
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2017-11-07 10:53:58 +0100
committerHarald Musum <musum@oath.com>2017-11-07 10:53:58 +0100
commit3844115235cf56c977aa580a3cd56f81ebfcc520 (patch)
tree11607e9a45284e34d9fae3536b5d3c02ef418330 /config-proxy/src/test
parent5e9a9227722eec66390b2670359a41b4703b343a (diff)
Implement downloading of file references, not functional yet
Diffstat (limited to 'config-proxy/src/test')
-rw-r--r--config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ConfigProxyRpcServerTest.java3
-rw-r--r--config-proxy/src/test/java/com/yahoo/vespa/config/proxy/MockConfigSource.java9
-rw-r--r--config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ProxyServerTest.java1
-rw-r--r--config-proxy/src/test/java/com/yahoo/vespa/config/proxy/filedistribution/FileDownloaderTest.java219
4 files changed, 192 insertions, 40 deletions
diff --git a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ConfigProxyRpcServerTest.java b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ConfigProxyRpcServerTest.java
index c1e9826e29f..f9b334a6f87 100644
--- a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ConfigProxyRpcServerTest.java
+++ b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ConfigProxyRpcServerTest.java
@@ -38,8 +38,7 @@ public class ConfigProxyRpcServerTest {
@Test
public void basic() {
- ConfigSourceSet configSources = new ConfigSourceSet();
- ProxyServer proxy = ProxyServer.createTestServer(configSources);
+ ProxyServer proxy = ProxyServer.createTestServer(new MockConfigSource(new MockClientUpdater()));
Spec spec = new Spec("localhost", 12345);
ConfigProxyRpcServer server = new ConfigProxyRpcServer(proxy, spec);
assertThat(server.getSpec(), is(spec));
diff --git a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/MockConfigSource.java b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/MockConfigSource.java
index dc9a3408510..2b26996fbdc 100644
--- a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/MockConfigSource.java
+++ b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/MockConfigSource.java
@@ -1,12 +1,14 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.proxy;
-import com.yahoo.config.subscription.ConfigSource;
import com.yahoo.config.subscription.ConfigSourceSet;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.RawConfig;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.Set;
/**
* A simple class to be able to test config proxy without having an RPC config
@@ -37,4 +39,9 @@ class MockConfigSource extends ConfigSourceSet {
backing.clear();
}
+ @Override
+ public Set<String> getSources() {
+ return Collections.singleton("tcp/localhost:19070,tcp/localhost:19071,tcp/localhost:19072");
+ }
+
}
diff --git a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ProxyServerTest.java b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ProxyServerTest.java
index f82d9e90184..3cd0f1043cc 100644
--- a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ProxyServerTest.java
+++ b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ProxyServerTest.java
@@ -95,7 +95,6 @@ public class ProxyServerTest {
*/
@Test
public void testModeSwitch() {
- ConfigSourceSet source = new ConfigSourceSet(); // Need to use a ConfigSourceSet to test modes
ProxyServer proxy = ProxyServer.createTestServer(source);
assertTrue(proxy.getMode().isDefault());
diff --git a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/filedistribution/FileDownloaderTest.java b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/filedistribution/FileDownloaderTest.java
index ea880e451b6..64ae1a07aea 100644
--- a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/filedistribution/FileDownloaderTest.java
+++ b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/filedistribution/FileDownloaderTest.java
@@ -1,79 +1,226 @@
package com.yahoo.vespa.config.proxy.filedistribution;
import com.yahoo.config.FileReference;
-import com.yahoo.config.subscription.ConfigSourceSet;
import com.yahoo.io.IOUtils;
+import com.yahoo.jrt.Int32Value;
+import com.yahoo.jrt.Request;
+import com.yahoo.jrt.RequestWaiter;
+import com.yahoo.text.Utf8;
+import com.yahoo.vespa.config.Connection;
+import com.yahoo.vespa.config.ConnectionPool;
+import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.time.Duration;
-import java.util.*;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
public class FileDownloaderTest {
- private static final ConfigSourceSet configSourceSet = new ConfigSourceSet();
+
+ private MockConnection connection;
+ private FileDownloader fileDownloader;
+
+ @Before
+ public void setup() {
+ try {
+ File downloadDir = Files.createTempDirectory("filedistribution").toFile();
+ connection = new MockConnection();
+ fileDownloader = new FileDownloader(connection, downloadDir, Duration.ofMillis(3000));
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
@Test
- public void download() throws IOException {
- File downloadDir = Files.createTempDirectory("filedistribution").toFile();
- FileDownloader fileDownloader = new FileDownloader(configSourceSet, downloadDir.getAbsolutePath(), Duration.ofMillis(200));
+ public void getFile() throws IOException {
+ File downloadDir = fileDownloader.downloadDirectory();
- // Write a file to download directory to simulate download going OK
- String fileReferenceString = "somehash";
- String fileName = "foo.jar";
- File fileReferenceFullPath = fileReferenceFullPath(downloadDir, fileReferenceString);
- FileReference fileReference = writeFileReference(downloadDir, fileReferenceString, fileName);
+ {
+ // fileReference already exists on disk, does not have to be downloaded
- // Check that we get correct path and content when asking for file reference
- Optional<File> pathToFile = fileDownloader.getFile(fileReference);
- assertTrue(pathToFile.isPresent());
- String downloadedFile = new File(fileReferenceFullPath, fileName).getAbsolutePath();
- assertEquals(new File(fileReferenceFullPath, fileName).getAbsolutePath(), downloadedFile);
- assertEquals("content", IOUtils.readFile(pathToFile.get()));
+ String fileReferenceString = "foo";
+ String filename = "foo.jar";
+ File fileReferenceFullPath = fileReferenceFullPath(downloadDir, fileReferenceString);
+ FileReference fileReference = new FileReference(fileReferenceString);
+ writeFileReference(downloadDir, fileReferenceString, filename);
- // Verify download status
- Map<FileReference, Double> downloadStatus = fileDownloader.downloadStatus();
- assertEquals(1, downloadStatus.size());
- assertDownloadStatus(Collections.singletonList(fileReference), downloadStatus.entrySet().iterator().next(), 100.0);
+ // Check that we get correct path and content when asking for file reference
+ Optional<File> pathToFile = fileDownloader.getFile(fileReference);
+ assertTrue(pathToFile.isPresent());
+ String downloadedFile = new File(fileReferenceFullPath, filename).getAbsolutePath();
+ assertEquals(new File(fileReferenceFullPath, filename).getAbsolutePath(), downloadedFile);
+ assertEquals("content", IOUtils.readFile(pathToFile.get()));
+
+ // Verify download status when downloaded
+ assertDownloadStatus(fileDownloader, fileReference, 100.0);
+ }
+
+ {
+ // fileReference does not exist on disk, needs to be downloaded, but fails when asking upstream for file)
+
+ connection.setResponseHandler(new MockConnection.UnknownFileReferenceResponseHandler());
+
+ FileReference fileReference = new FileReference("bar");
+ File fileReferenceFullPath = fileReferenceFullPath(downloadDir, fileReference.value());
+ assertFalse(fileReferenceFullPath.getAbsolutePath(), fileDownloader.getFile(fileReference).isPresent());
+
+ // Verify download status when unable to download
+ assertDownloadStatus(fileDownloader, fileReference, 0.0);
+ }
+
+ {
+ // fileReference does not exist on disk, needs to be downloaded)
- // Non-existing file
- assertFalse(fileReferenceFullPath.getAbsolutePath(), fileDownloader.getFile(new FileReference("doesnotexist")).isPresent());
+ FileReference fileReference = new FileReference("fileReference");
+ File fileReferenceFullPath = fileReferenceFullPath(downloadDir, fileReference.value());
+ assertFalse(fileReferenceFullPath.getAbsolutePath(), fileDownloader.getFile(fileReference).isPresent());
+
+ // Verify download status
+ assertDownloadStatus(fileDownloader, fileReference, 0.0);
+
+ // Receives fileReference, should return and make it available to caller
+ String filename = "abc.jar";
+ fileDownloader.receiveFile(fileReference, filename, Utf8.toBytes("some other content"));
+ Optional<File> downloadedFile = fileDownloader.getFile(fileReference);
+
+ assertTrue(downloadedFile.isPresent());
+ File downloadedFileFullPath = new File(fileReferenceFullPath, filename);
+ assertEquals(downloadedFileFullPath.getAbsolutePath(), downloadedFile.get().getAbsolutePath());
+ assertEquals("some other content", IOUtils.readFile(downloadedFile.get()));
+
+ // Verify download status when downloaded
+ assertDownloadStatus(fileDownloader, fileReference, 100.0);
+ }
}
@Test
public void setFilesToDownload() throws IOException {
File downloadDir = Files.createTempDirectory("filedistribution").toFile();
- FileDownloader fileDownloader = new FileDownloader(configSourceSet, downloadDir.getAbsolutePath(), Duration.ofMillis(200));
- List<FileReference> fileReferences = Arrays.asList(new FileReference("foo"), new FileReference("bar"));
- fileDownloader.queueForDownload(fileReferences);
+ MockConnection configSource = new MockConnection();
+ FileDownloader fileDownloader = new FileDownloader(configSource, downloadDir, Duration.ofMillis(200));
+ FileReference foo = new FileReference("foo");
+ FileReference bar = new FileReference("bar");
+ List<FileReference> fileReferences = Arrays.asList(foo, bar);
+ fileDownloader.download(fileReferences);
assertEquals(fileReferences, fileDownloader.queuedForDownload().asList());
// Verify download status
- Map<FileReference, Double> downloadStatus = fileDownloader.downloadStatus();
- assertEquals(2, downloadStatus.size());
-
- assertDownloadStatus(fileReferences, downloadStatus.entrySet().iterator().next(), 0.0);
- assertDownloadStatus(fileReferences, downloadStatus.entrySet().iterator().next(), 0.0);
+ assertDownloadStatus(fileDownloader, foo, 0.0);
+ assertDownloadStatus(fileDownloader, bar, 0.0);
}
- private FileReference writeFileReference(File dir, String fileReferenceString, String fileName) throws IOException {
+ private void writeFileReference(File dir, String fileReferenceString, String fileName) throws IOException {
File file = new File(new File(dir, fileReferenceString), fileName);
IOUtils.writeFile(file, "content", false);
- return new FileReference(fileReferenceString);
}
private File fileReferenceFullPath(File dir, String fileReferenceString) {
return new File(dir, fileReferenceString);
}
- private void assertDownloadStatus(List<FileReference> fileReferences, Map.Entry<FileReference, Double> entry, double expectedDownloadStatus) {
- assertTrue(fileReferences.contains(new FileReference(entry.getKey().value())));
- assertEquals(expectedDownloadStatus, entry.getValue(), 0.0001);
+ private void assertDownloadStatus(FileDownloader fileDownloader, FileReference fileReference, double expectedDownloadStatus) {
+ double downloadStatus = fileDownloader.downloadStatus(fileReference);
+ assertEquals(expectedDownloadStatus, downloadStatus, 0.0001);
+ }
+
+ private static class MockConnection implements ConnectionPool, com.yahoo.vespa.config.Connection {
+
+ private ResponseHandler responseHandler;
+
+ MockConnection() {
+ this(new FileReferenceFoundResponseHandler());
+ }
+
+ MockConnection(ResponseHandler responseHandler) {
+ this.responseHandler = responseHandler;
+ }
+
+ @Override
+ public void invokeAsync(Request request, double jrtTimeout, RequestWaiter requestWaiter) {
+ responseHandler.request(request);
+ }
+
+ @Override
+ public void invokeSync(Request request, double jrtTimeout) {
+ responseHandler.request(request);
+ }
+
+ @Override
+ public void setError(int errorCode) {
+ }
+
+ @Override
+ public void setSuccess() {
+ }
+
+ @Override
+ public String getAddress() {
+ return null;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public void setError(Connection connection, int errorCode) {
+ connection.setError(errorCode);
+ }
+
+ @Override
+ public Connection getCurrent() {
+ return this;
+ }
+
+ @Override
+ public Connection setNewCurrentConnection() {
+ return this;
+ }
+
+ @Override
+ public int getSize() {
+ return 1;
+ }
+
+ public void setResponseHandler(ResponseHandler responseHandler) {
+ this.responseHandler = responseHandler;
+ }
+
+ static class FileReferenceFoundResponseHandler implements ResponseHandler {
+
+ @Override
+ public void request(Request request) {
+ if (request.methodName().equals("filedistribution.serveFile"))
+ request.returnValues().add(new Int32Value(0));
+ }
+ }
+
+ static class UnknownFileReferenceResponseHandler implements ResponseHandler {
+
+ @Override
+ public void request(Request request) {
+ if (request.methodName().equals("filedistribution.serveFile"))
+ request.returnValues().add(new Int32Value(1));
+ }
+ }
+
+ public interface ResponseHandler {
+
+ void request(Request request);
+
+ }
+
}
+
}