Test segmentation
diff --git a/src/main/java/com/intel/jndn/utils/server/SegmentedServerHelper.java b/src/main/java/com/intel/jndn/utils/server/SegmentedServerHelper.java
index b22e02b..4bf67e0 100644
--- a/src/main/java/com/intel/jndn/utils/server/SegmentedServerHelper.java
+++ b/src/main/java/com/intel/jndn/utils/server/SegmentedServerHelper.java
@@ -16,6 +16,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
@@ -57,18 +58,21 @@
public static List<Data> segment(Data template, InputStream bytes, int segmentSize) throws IOException {
List<Data> segments = new ArrayList<>();
byte[] buffer_ = readAll(bytes);
- ByteBuffer buffer = ByteBuffer.wrap(buffer_, 0, buffer_.length);
- int end = (int) Math.floor(buffer_.length / (segmentSize + 1));
- Name.Component lastSegment = Name.Component.fromNumberWithMarker(end, 0x00);
- for (int i = 0; i <= end; i++) {
+ int numBytes = buffer_.length;
+ int numPackets = (int) Math.ceil((double) numBytes / segmentSize);
+ ByteBuffer buffer = ByteBuffer.wrap(buffer_, 0, numBytes);
+ Name.Component lastSegment = Name.Component.fromNumberWithMarker(numPackets - 1, 0x00);
+
+ for (int i = 0; i < numPackets; i++) {
Data segment = new Data(template);
segment.getName().appendSegment(i);
segment.getMetaInfo().setFinalBlockId(lastSegment);
- byte[] content = new byte[segmentSize];
+ byte[] content = new byte[Math.min(segmentSize, buffer.remaining())];
buffer.get(content);
- segment.setContent(new Blob(content));
+ segment.setContent(new Blob(content));
segments.add(segment);
}
+
return segments;
}
@@ -81,12 +85,13 @@
*/
public static byte[] readAll(InputStream bytes) throws IOException {
ByteArrayOutputStream builder = new ByteArrayOutputStream();
- byte[] buffer = new byte[4096];
- int read = 0;
- while ((read = bytes.read(buffer)) != -1) {
- builder.write(buffer);
+ int read = bytes.read();
+ while (read != -1) {
+ builder.write(read);
+ read = bytes.read();
}
builder.flush();
+ bytes.close();
return builder.toByteArray();
}
}
diff --git a/src/test/java/com/intel/jndn/utils/server/SegmentedServerHelperTest.java b/src/test/java/com/intel/jndn/utils/server/SegmentedServerHelperTest.java
new file mode 100644
index 0000000..ff21d77
--- /dev/null
+++ b/src/test/java/com/intel/jndn/utils/server/SegmentedServerHelperTest.java
@@ -0,0 +1,75 @@
+/*
+ * jndn-utils
+ * Copyright (c) 2015, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 3, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ */
+package com.intel.jndn.utils.server;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.List;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Name;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class SegmentedServerHelperTest {
+
+ /**
+ * Test of segment method, of class SegmentedServerHelper.
+ *
+ * @throws java.lang.Exception
+ */
+ @Test
+ public void testSegmentation() throws Exception {
+ final Data template = new Data(new Name("/segmented/data"));
+ final InputStream content = new ByteArrayInputStream("0123456789".getBytes());
+ List<Data> segments = SegmentedServerHelper.segment(template, content, 1);
+ assertEquals(10, segments.size());
+
+ // test first packet
+ assertEquals(0, segments.get(0).getName().get(-1).toSegment());
+ assertEquals(9, segments.get(0).getMetaInfo().getFinalBlockId().toSegment());
+ assertEquals("0", segments.get(0).getContent().toString());
+
+ // test last packet
+ assertEquals(9, segments.get(9).getName().get(-1).toSegment());
+ assertEquals(9, segments.get(9).getMetaInfo().getFinalBlockId().toSegment());
+ assertEquals("9", segments.get(9).getContent().toString());
+ }
+
+ @Test
+ public void testSegmentationDifferentSizes() throws Exception {
+ final Data template = new Data(new Name("/segmented/data"));
+
+ // size 2
+ final InputStream content2 = new ByteArrayInputStream("0123456789".getBytes());
+ List<Data> segments2 = SegmentedServerHelper.segment(template, content2, 2);
+ assertEquals(5, segments2.size());
+ assertEquals("89", segments2.get(4).getContent().toString());
+
+ // size 3
+ final InputStream content3 = new ByteArrayInputStream("0123456789".getBytes());
+ List<Data> segments3 = SegmentedServerHelper.segment(template, content3, 3);
+ assertEquals(4, segments3.size());
+ assertEquals("9", segments3.get(3).getContent().toString());
+
+ // size 4
+ final InputStream content4 = new ByteArrayInputStream("0123456789".getBytes());
+ List<Data> segments4 = SegmentedServerHelper.segment(template, content4, 4);
+ assertEquals(3, segments4.size());
+ assertEquals("89", segments4.get(2).getContent().toString());
+ }
+}