From 9869141c46d299e84ac9285a3ee575e49cb1970a Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Tue, 30 Jan 2018 09:33:06 +0100 Subject: Fix bug where nextContent() always returned all data --- .../filedistribution/FileReferenceDataBlob.java | 11 +++++++-- .../filedistribution/FileReferenceDataTest.java | 28 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java index f0db12a45fc..c22770395d3 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java @@ -9,6 +9,7 @@ import java.nio.ByteBuffer; public class FileReferenceDataBlob extends FileReferenceData { private final byte[] content; private final long xxhash; + private boolean contentRead = false; public FileReferenceDataBlob(FileReference fileReference, String filename, Type type, byte[] content) { this(fileReference, filename, type, content, XXHashFactory.fastestInstance().hash64().hash(ByteBuffer.wrap(content), 0)); @@ -27,10 +28,16 @@ public class FileReferenceDataBlob extends FileReferenceData { public ByteBuffer content() { return ByteBuffer.wrap(content); } + @Override public int nextContent(ByteBuffer bb) { - bb.put(content); - return content.length; + if (contentRead) { + return -1; + } else { + contentRead = true; + bb.put(content); + return content.length; + } } @Override diff --git a/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java new file mode 100644 index 00000000000..0b85def5809 --- /dev/null +++ b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java @@ -0,0 +1,28 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.filedistribution; + +import com.yahoo.config.FileReference; +import com.yahoo.text.Utf8; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import static org.junit.Assert.assertEquals; + +public class FileReferenceDataTest { + + @Test + public void testDataBlob() { + String content = "blob"; + FileReferenceData fileReferenceData = + new FileReferenceDataBlob(new FileReference("ref"), "foo", FileReferenceData.Type.compressed, Utf8.toBytes(content)); + ByteBuffer byteBuffer = ByteBuffer.allocate(100); + assertEquals(4, fileReferenceData.nextContent(byteBuffer)); + assertEquals(content, Utf8.toString(Arrays.copyOfRange(byteBuffer.array(), 0, 4))); + + // nextContent() will always return everything for FileReferenceDataBlob, so nothing more should be read + assertEquals(-1, fileReferenceData.nextContent(byteBuffer)); + } + +} -- cgit v1.2.3