Add MockFace
diff --git a/src/test/java/com/intel/jndn/mock/MockFaceTest.java b/src/test/java/com/intel/jndn/mock/MockFaceTest.java
new file mode 100644
index 0000000..77ce5a3
--- /dev/null
+++ b/src/test/java/com/intel/jndn/mock/MockFaceTest.java
@@ -0,0 +1,130 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.intel.jndn.mock;
+
+import java.io.IOException;
+import net.named_data.jndn.Data;
+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.encoding.EncodingException;
+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.*;
+
+/**
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class MockFaceTest {
+
+  /**
+   * Setup logging
+   */
+  private static final Logger logger = LogManager.getLogger();
+
+  /**
+   * Test of addResponse method, of class MockFace.
+   * @throws java.io.IOException
+   * @throws net.named_data.jndn.encoding.EncodingException
+   */
+  @Test
+  public void testWithResponses() throws IOException, EncodingException {
+    MockFace face = new MockFace();
+
+    // add response
+    Data response = new Data(new Name("/test/with/responses"));
+    response.setContent(new Blob("..."));
+    face.addResponse(new Name("/test/with/responses"), response);
+
+    // make request
+    final Counter count = new Counter();
+    logger.info("Express interest: /test/with/responses");
+    face.expressInterest(new Interest(new Name("/test/with/responses")), new OnData() {
+      @Override
+      public void onData(Interest interest, Data data) {
+        count.inc();
+        logger.debug("Received data");
+        assertEquals(data.getContent().buf(), new Blob("...").buf());
+      }
+    });
+
+    // process face until a response is received
+    int allowedLoops = 100;
+    while (count.get() == 0 && allowedLoops > 0) {
+      allowedLoops--;
+      face.processEvents();
+    }
+    assertEquals(1, count.get());
+  }
+
+  /**
+   * Test of removeResponse method, of class MockFace.
+   * @throws net.named_data.jndn.encoding.EncodingException
+   * @throws java.io.IOException
+   * @throws net.named_data.jndn.security.SecurityException
+   */
+  @Test
+  public void testWithHandlers() throws EncodingException, IOException, net.named_data.jndn.security.SecurityException {
+    MockFace face = new MockFace();
+
+    // add interest handler
+    logger.info("Register prefix: /test/with/responses");
+    face.registerPrefix(new Name("/test/with/handlers"), new OnInterest() {
+      @Override
+      public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
+        logger.debug("Received interest, responding: " + interest.getName().toUri());
+        Data response = new Data(new Name("/test/with/handlers"));
+        response.setContent(new Blob("..."));
+        try {
+          transport.send(response.wireEncode().buf());
+        } catch (IOException e) {
+          fail("Failed to send encoded data packet.");
+        }
+      }
+    }, null);
+
+    // make request
+    final Counter count = new Counter();
+    logger.info("Express interest: /test/with/responses");
+    face.expressInterest(new Interest(new Name("/test/with/handlers")), new OnData() {
+      @Override
+      public void onData(Interest interest, Data data) {
+        count.inc();
+        logger.debug("Received data");
+        assertEquals(data.getContent().buf(), new Blob("...").buf());
+      }
+    });
+
+    // process faces until a response is received
+    int allowedLoops = 100;
+    while (count.get() == 0 && allowedLoops > 0) {
+      allowedLoops--;
+      face.processEvents();
+    }
+    assertEquals(1, count.get());
+  }
+
+  /**
+   * Count reference
+   */
+  class Counter {
+
+    int count = 0;
+
+    public void inc() {
+      count++;
+    }
+
+    public int get() {
+      return count;
+    }
+  }
+}
diff --git a/src/test/java/com/intel/jndn/mock/MockTransportTest.java b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
index 06ed987..44ad258 100644
--- a/src/test/java/com/intel/jndn/mock/MockTransportTest.java
+++ b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
@@ -24,8 +24,7 @@
 import static org.junit.Assert.*;
 
 /**
- * Mock the transport class
- * TODO add face.registerPrefix() example
+ * Mock the transport class TODO add face.registerPrefix() example
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
@@ -38,7 +37,7 @@
 
   /**
    * Test sending a Data packet.
-   * 
+   *
    * @throws java.io.IOException
    * @throws net.named_data.jndn.encoding.EncodingException
    */
@@ -62,16 +61,20 @@
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
-    
-    while(count.get() == 0){
+
+    // process the face until one response
+    while (count.get() == 0) {
       face.processEvents();
     }
+
+    // check for sent packets
+    assertEquals(0, transport.getSentDataPackets().size());
+    assertEquals(1, transport.getSentInterestPackets().size());
   }
-  
-  
+
   /**
    * Test sending multiple Data packets.
-   * 
+   *
    * @throws java.io.IOException
    * @throws net.named_data.jndn.encoding.EncodingException
    */
@@ -98,11 +101,16 @@
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
-    
-    while(count.get() == 0){
+
+    // process the face until one response received
+    while (count.get() == 0) {
       face.processEvents();
     }
-    
+
+    // check for sent packets
+    assertEquals(0, transport.getSentDataPackets().size());
+    assertEquals(1, transport.getSentInterestPackets().size());
+
     // express interest again, but this time it should time out because there 
     // is no data left on the wire; the first processEvents() has already 
     // picked it up
@@ -115,28 +123,36 @@
         count2.inc();
         fail("Should not return data; data should already be cleared");
       }
-    }, new OnTimeout(){
+    }, new OnTimeout() {
       @Override
       public void onTimeout(Interest interest) {
         count2.inc();
         assertTrue(true);
       }
     });
-    
-    while(count2.get() == 0){
+
+    // process the face until timeout
+    while (count2.get() == 0) {
       face.processEvents();
     }
+
+    // check for sent packets
+    assertEquals(0, transport.getSentDataPackets().size());
+    assertEquals(2, transport.getSentInterestPackets().size());
   }
-  
+
   /**
    * Count reference
    */
-  class Counter{
+  class Counter {
+
     int count = 0;
-    public void inc(){
+
+    public void inc() {
       count++;
     }
-    public int get(){
+
+    public int get() {
       return count;
     }
   }