Initial commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c7ccd3b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+# Created by https://www.gitignore.io
+
+### Maven ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+
+
+### Java ###
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# Linux temporary files
+*~
diff --git a/nb-configuration.xml b/nb-configuration.xml
new file mode 100644
index 0000000..7f3f7dc
--- /dev/null
+++ b/nb-configuration.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-shared-configuration>
+ <!--
+This file contains additional configuration written by modules in the NetBeans IDE.
+The configuration is intended to be shared among all the users of project and
+therefore it is assumed to be part of version control checkout.
+Without this configuration present, some functionality in the IDE may be limited or fail altogether.
+-->
+ <properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
+ <!--
+Properties that influence various parts of the IDE, especially code formatting and the like.
+You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
+That way multiple projects can share the same settings (useful for formatting rules for example).
+Any value defined here will override the pom.xml file value but is only applicable to the current project.
+-->
+ <org-netbeans-modules-editor-indent.CodeStyle.usedProfile>project</org-netbeans-modules-editor-indent.CodeStyle.usedProfile>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab>2</org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.tab-size>4</org-netbeans-modules-editor-indent.CodeStyle.project.tab-size>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width>2</org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs>true</org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width>80</org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width>
+ <org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap>none</org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap>
+ <org-netbeans-modules-editor-indent.text.x-fortran.CodeStyle.project.text-limit-width>132</org-netbeans-modules-editor-indent.text.x-fortran.CodeStyle.project.text-limit-width>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab>2</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size>4</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width>2</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs>true</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-limit-width>80</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-limit-width>
+ <org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-line-wrap>words</org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.text-line-wrap>
+ </properties>
+</project-shared-configuration>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..1ab8753
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.intel.jndn.mock</groupId>
+ <artifactId>jndn-mock</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>net.named_data.jndn</groupId>
+ <artifactId>jndn</artifactId>
+ <version>RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ <version>2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>2.1</version>
+ </dependency>
+ <!-- Test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.10</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <maven.compiler.source>1.7</maven.compiler.source>
+ <maven.compiler.target>1.7</maven.compiler.target>
+ </properties>
+ <distributionManagement>
+ <repository>
+ <id>ubit-artifactory-or.intel.com</id>
+ <name>ubit-artifactory-or.intel.com-releases</name>
+ <url>https://ubit-artifactory-or.intel.com/artifactory/ext-releases-local</url>
+ </repository>
+ <snapshotRepository>
+ <id>ubit-artifactory-or.intel.com</id>
+ <name>ubit-artifactory-or.intel.com-snapshots</name>
+ <url>https://ubit-artifactory-or.intel.com/artifactory/ext-snapshots-local</url>
+ </snapshotRepository>
+ </distributionManagement>
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/intel/jndn/mock/MockTransport.java b/src/main/java/com/intel/jndn/mock/MockTransport.java
new file mode 100644
index 0000000..ee9c4e3
--- /dev/null
+++ b/src/main/java/com/intel/jndn/mock/MockTransport.java
@@ -0,0 +1,174 @@
+/*
+ * File name: MockTransport.java
+ *
+ * Purpose: Provide testing functionality for running NDN unit tests without
+ * connecting to the network or requiring an NFD installed.
+ *
+ * © Copyright Intel Corporation. All rights reserved.
+ * Intel Corporation, 2200 Mission College Boulevard,
+ * Santa Clara, CA 95052-8119, USA
+ */
+package com.intel.jndn.mock;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.encoding.ElementListener;
+import net.named_data.jndn.encoding.ElementReader;
+import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.transport.Transport;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Mock the transport class Example: ...
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class MockTransport extends Transport {
+
+ public final static int BUFFER_CAPACITY = 8000;
+ private static final Logger logger = LogManager.getLogger();
+ protected boolean connected;
+ protected ByteBuffer inputBuffer = ByteBuffer.allocate(BUFFER_CAPACITY);
+ protected ByteBuffer outputBuffer = ByteBuffer.allocate(BUFFER_CAPACITY);
+ protected ElementReader elementReader;
+ protected List<Data> outputPackets = new ArrayList<>();
+
+ /**
+ * Retrieve sent bytes
+ *
+ * @return
+ */
+ public ByteBuffer getSentBuffer() {
+ return outputBuffer;
+ }
+
+ /**
+ *
+ */
+ public void clear() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ /**
+ *
+ * @return
+ */
+ public List<Data> getSentDataPackets() {
+ return outputPackets;
+ }
+
+ /**
+ * Retrieve received bytes; this is mocked by adding bytes to the buffer with
+ * respondWith()
+ *
+ * @return
+ */
+ public ByteBuffer getReceivedBuffer() {
+ return inputBuffer;
+ }
+
+ /**
+ *
+ * @param response
+ */
+ public void respondWith(ByteBuffer response) {
+ inputBuffer.put(response);
+ }
+
+ /**
+ *
+ * @param response
+ */
+ public void respondWith(Data response) {
+ respondWith(response.wireEncode().buf());
+ }
+
+ /**
+ * Mock connection
+ *
+ * @param connectionInfo
+ * @param elementListener
+ * @throws IOException
+ */
+ @Override
+ public void connect(Transport.ConnectionInfo connectionInfo,
+ ElementListener elementListener) throws IOException {
+ logger.debug("Connecting...");
+ connected = true;
+ elementReader = new ElementReader(elementListener);
+ }
+
+ /**
+ * Mock sending data to the host; access the data as bytes using
+ * getSentBuffer() or as packets with getSentDataPackets()
+ *
+ * @param data The buffer of data to send. This reads from position() to
+ * limit(), but does not change the position.
+ * @throws IOException For I/O error.
+ */
+ @Override
+ public void send(ByteBuffer data) throws IOException {
+ logger.debug("Sending " + (data.capacity() - data.position()) + " bytes");
+
+ // add to sent bytes
+ outputBuffer.put(data);
+ data.flip();
+
+ // add to sent packets
+ try {
+ Data packet = new Data();
+ packet.wireDecode(data);
+ outputPackets.add(new Data());
+ } catch (EncodingException e) {
+ logger.warn("Failed to parse bytes into a data packet");
+ }
+ }
+
+ /**
+ * Process any data to receive and clear the input buffer; to mock incoming
+ * Data packets, add data to the buffer with respondWith().
+ *
+ * @throws IOException For I/O error.
+ * @throws EncodingException For invalid encoding.
+ */
+ @Override
+ public void processEvents() throws IOException, EncodingException {
+ if (!getIsConnected()) {
+ logger.warn("Not connnected, aborting...");
+ return;
+ }
+
+ // pass data up to face
+ inputBuffer.limit(inputBuffer.capacity());
+ inputBuffer.position(0);
+ elementReader.onReceivedData(inputBuffer);
+
+ // reset buffer
+ inputBuffer = ByteBuffer.allocate(BUFFER_CAPACITY);
+ }
+
+ /**
+ * Check if the transport is connected.
+ *
+ * @return true if connected.
+ */
+ @Override
+ public boolean getIsConnected() {
+ return connected;
+ }
+
+ /**
+ * Close the connection.
+ *
+ * @throws IOException For I/O error.
+ */
+ @Override
+ public void close() throws IOException {
+ logger.debug("Closing...");
+ connected = false;
+ }
+}
diff --git a/src/main/resources/log4j2-test.xml b/src/main/resources/log4j2-test.xml
new file mode 100644
index 0000000..9e29cc3
--- /dev/null
+++ b/src/main/resources/log4j2-test.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Root level="trace">
+ <AppenderRef ref="Console"/>
+ </Root>
+ </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..8f7a167
--- /dev/null
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Root level="error">
+ <AppenderRef ref="Console"/>
+ </Root>
+ </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/src/test/java/com/intel/jndn/mock/MockTransportTest.java b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
new file mode 100644
index 0000000..137717f
--- /dev/null
+++ b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
@@ -0,0 +1,133 @@
+/*
+ * File name: MockTransportTest.java
+ *
+ * Purpose: Test the MockTransport
+ *
+ * © Copyright Intel Corporation. All rights reserved.
+ * Intel Corporation, 2200 Mission College Boulevard,
+ * Santa Clara, CA 95052-8119, USA
+ */
+package com.intel.jndn.mock;
+
+import java.io.IOException;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Face;
+import net.named_data.jndn.Interest;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.OnData;
+import net.named_data.jndn.OnInterest;
+import net.named_data.jndn.OnRegisterFailed;
+import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.security.SecurityException;
+import net.named_data.jndn.transport.Transport;
+import net.named_data.jndn.util.Blob;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Mock the transport class Example: ...
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class MockTransportTest {
+
+ /**
+ * Setup logging
+ */
+ private static final Logger logger = LogManager.getLogger();
+
+ /**
+ * Test of getSentBuffer method, of class MockTransport.
+ * @throws java.io.IOException
+ * @throws net.named_data.jndn.encoding.EncodingException
+ */
+ @Test
+ public void testGetSentBuffer() throws IOException, EncodingException {
+ MockTransport transport = new MockTransport();
+ Face face = new Face(transport, null);
+
+ // setup return data
+ Data response = new Data(new Name("/a/b/c"));
+ response.setContent(new Blob("..."));
+ transport.respondWith(response);
+
+ // express interest on the face
+ final Counter count = new Counter();
+ face.expressInterest(new Interest(new Name("/a/b/c")), new OnData() {
+ @Override
+ public void onData(Interest interest, Data data) {
+ count.inc();
+ logger.debug("Received data");
+ assertEquals(data.getContent().buf(), new Blob("...").buf());
+ }
+ });
+
+ while(count.get() == 0){
+ face.processEvents();
+ }
+ }
+
+ class Counter{
+ int count = 0;
+ public void inc(){
+ count++;
+ }
+ public int get(){
+ return count;
+ }
+ }
+
+ /**
+ * Test of getSentBuffer method, of class MockTransport.
+ */
+// @Test
+// public void testGetSentBuffer() {
+// MockTransport transport = new MockTransport();
+// Face face = new Face(transport, null);
+//
+// // setup return data
+// int typeCode = 101;
+// int[] tlvBytes = new int[]{1, 200};
+//
+// // register prefix
+// try {
+// Name prefix = new Name("/a/b/c");
+// logger.info("Registering prefix: " + prefix.toUri());
+// long id = face.registerPrefix(prefix, new TestOnInterest(), new TestOnRegisterFailed());
+// assertTrue(id > 0);
+// } catch (IOException | SecurityException e) {
+// fail("Failed to register prefix.");
+// }
+// }
+// class TestOnData implements OnData {
+//
+// @Override
+// public void onData(Interest interest, Data data) {
+// assertEquals(data.getName(), new Name("/a/b/c"));
+// assertEquals(data.getContent(), new Blob("..."));
+// }
+// }
+ class TestOnInterest implements OnInterest {
+
+ @Override
+ public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
+ Data data = new Data(interest.getName());
+ data.setContent(new Blob("..."));
+ try {
+ transport.send(data.wireEncode().buf());
+ } catch (IOException e) {
+ fail("Failed to send packet.");
+ }
+ }
+ }
+
+ class TestOnRegisterFailed implements OnRegisterFailed {
+
+ @Override
+ public void onRegisterFailed(Name prefix) {
+ fail("Failed to register prefix.");
+ }
+ }
+}