Add a working CDC TTY USB device

I'm pretty sure it reliably moves data in both directions, but it has a
lot of TODOs left wrt error handling.

Change-Id: I1d96a63eea7bdc08f6ec78c868c4a1ccbfbda600
diff --git a/motors/usb/queue_test.cc b/motors/usb/queue_test.cc
new file mode 100644
index 0000000..fed54d6
--- /dev/null
+++ b/motors/usb/queue_test.cc
@@ -0,0 +1,45 @@
+#include "motors/usb/queue.h"
+
+#include "gtest/gtest.h"
+
+namespace frc971 {
+namespace teensy {
+namespace testing {
+
+TEST(QueueTest, Basic) {
+  Queue queue(64);
+  ASSERT_EQ(0u, queue.data_queued());
+  ASSERT_TRUE(queue.empty());
+  ASSERT_EQ(5u, queue.Write("abcde", 5));
+  ASSERT_EQ(5u, queue.data_queued());
+  ASSERT_FALSE(queue.empty());
+  char buffer[5];
+  ASSERT_EQ(5u, queue.Read(buffer, 5));
+  ASSERT_EQ("abcde", ::std::string(buffer, 5));
+  ASSERT_TRUE(queue.empty());
+}
+
+TEST(QueueTest, Fill) {
+  Queue queue(8);
+  ASSERT_EQ(0u, queue.data_queued());
+  ASSERT_EQ(7u, queue.Write("abcdefgh", 8));
+  ASSERT_EQ(7u, queue.data_queued());
+  char buffer[7];
+  ASSERT_EQ(7u, queue.Read(buffer, 100));
+  ASSERT_EQ("abcdefg", ::std::string(buffer, 7));
+  ASSERT_TRUE(queue.empty());
+
+  ASSERT_EQ(3u, queue.Write("xyz", 3));
+  ASSERT_EQ(3u, queue.Read(buffer, 100));
+  ASSERT_EQ(0u, queue.data_queued());
+
+  ASSERT_EQ(7u, queue.Write("abcdefgh", 8));
+  ASSERT_EQ(7u, queue.data_queued());
+  ASSERT_EQ(7u, queue.Read(buffer, 100));
+  ASSERT_EQ("abcdefg", ::std::string(buffer, 7));
+  ASSERT_TRUE(queue.empty());
+}
+
+}  // namespace testing
+}  // namespace teensy
+}  // namespace frc971