Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: chrome/browser/extensions/api/serial/serial_apitest.cc

Issue 10702138: Instrument serial API code to make testing easier. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/serial/serial_apitest.cc
diff --git a/chrome/browser/extensions/api/serial/serial_apitest.cc b/chrome/browser/extensions/api/serial/serial_apitest.cc
index cf31f19db78da1e698e4a8ae0bc7aa63b8df77ac..e72853e6d0361a225095e4c3a3c53a93f566aa21 100644
--- a/chrome/browser/extensions/api/serial/serial_apitest.cc
+++ b/chrome/browser/extensions/api/serial/serial_apitest.cc
@@ -2,9 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <string>
+
#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/extensions/api/api_resource_event_notifier.h"
#include "chrome/browser/extensions/api/serial/serial_api.h"
+#include "chrome/browser/extensions/api/serial/serial_connection.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/ui/browser.h"
@@ -21,39 +26,138 @@ class SerialApiTest : public PlatformAppApiTest {
} // namespace
+namespace extensions {
+
+class FakeSerialGetPortsFunction : public AsyncExtensionFunction {
+ public:
+ virtual bool RunImpl() {
+ ListValue* ports = new ListValue();
+ ports->Append(Value::CreateStringValue("/dev/fakeserial"));
+ ports->Append(Value::CreateStringValue("\\\\COM800\\"));
+ result_.reset(ports);
+ SendResponse(true);
+ return true;
+ }
+};
+
+class FakeEchoSerialConnection : public SerialConnection {
+ public:
+ explicit FakeEchoSerialConnection(
+ const std::string& port,
+ int bitrate,
+ APIResourceEventNotifier* event_notifier)
+ : SerialConnection(port, bitrate, event_notifier),
+ opened_(true) {
+ Flush();
+ opened_ = false;
+ }
+
+ virtual bool Open() {
+ DCHECK(!opened_);
+ opened_ = true;
+ return true;
+ }
+
+ virtual void Close() {
+ DCHECK(opened_);
+ }
+
+ virtual void Flush() {
+ DCHECK(opened_);
+ read_index_ = write_index_ = 0;
+ }
+
+ virtual int Read(uint8* byte) {
+ DCHECK(byte);
+
+ if (read_index_ >= write_index_) {
+ return 0;
+ }
+ *byte = ring_buffer_[read_index_++];
+ if (read_index_ == BUFFER_SIZE)
+ read_index_ = 0;
+ return 1;
+ }
+
+ virtual int Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count) {
+ DCHECK(io_buffer.get());
+ DCHECK(byte_count >= 0);
+
+ char *data = io_buffer->data();
+ int count = byte_count;
+ while (count--) {
+ ring_buffer_[write_index_++] = *data++;
+ if (write_index_ == BUFFER_SIZE)
+ write_index_ = 0;
+ }
+ return byte_count;
+ }
+
+ private:
+ enum { BUFFER_SIZE = 256 };
+ bool opened_;
+ char ring_buffer_[BUFFER_SIZE];
+ int read_index_;
+ int write_index_;
+
+ DISALLOW_COPY_AND_ASSIGN(FakeEchoSerialConnection);
+};
+
+class FakeSerialOpenFunction : public SerialOpenFunction {
+ protected:
+ virtual SerialConnection* CreateSerialConnection(
+ const std::string& port,
+ int bitrate,
+ APIResourceEventNotifier* event_notifier) OVERRIDE {
+ return new FakeEchoSerialConnection(port, bitrate, event_notifier);
+ }
+ virtual bool DoesPortExist(const std::string& port) OVERRIDE {
+ return true;
+ }
+};
+
+} // namespace extensions
+
+ExtensionFunction* FakeSerialGetPortsFunctionFactory() {
+ return new extensions::FakeSerialGetPortsFunction();
+}
+
+ExtensionFunction* FakeSerialOpenFunctionFactory() {
+ return new extensions::FakeSerialOpenFunction();
+}
+
+// Disable SIMULATE_SERIAL_PORTS only if all the following are true:
+//
+// 1. You have an Arduino or compatible board attached to your machine and
+// properly appearing as the first virtual serial port ("first" is very loosely
+// defined as whichever port shows up in serial.getPorts). We've tested only
+// the Atmega32u4 Breakout Board and Arduino Leonardo; note that both these
+// boards are based on the Atmel ATmega32u4, rather than the more common
+// Arduino '328p with either FTDI or '8/16u2 USB interfaces. TODO: test more
+// widely.
+//
+// 2. Your user has permission to read/write the port. For example, this might
+// mean that your user is in the "tty" or "uucp" group on Ubuntu flavors of
+// Linux, or else that the port's path (e.g., /dev/ttyACM0) has global
+// read/write permissions.
+//
+// 3. You have uploaded a program to the board that does a byte-for-byte echo
+// on the virtual serial port at 57600 bps. An example is at
+// chrome/test/data/extensions/api_test/serial/api/serial_arduino_test.ino.
+//
+#define SIMULATE_SERIAL_PORTS (1)
IN_PROC_BROWSER_TEST_F(SerialApiTest, SerialExtension) {
ResultCatcher catcher;
catcher.RestrictToProfile(browser()->profile());
- ExtensionTestMessageListener listener("serial_port", true);
-
- ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("serial/api")));
- EXPECT_TRUE(listener.WaitUntilSatisfied());
-
-#if 0
- // Enable this path only if all the following are true:
- //
- // 1. You have an Arduino or compatible board attached to your machine and
- // properly appearing as the first virtual serial port ("first" is very
- // loosely defined as whichever port shows up in serial.getPorts). We've
- // tested only the Atmega32u4 Breakout Board and Arduino Leonardo; note that
- // both these boards are based on the Atmel ATmega32u4, rather than the more
- // common Arduino '328p with either FTDI or '8/16u2 USB interfaces. TODO:
- // test more widely.
- //
- // 2. Your user has permission to read/write the port. For example, this
- // might mean that your user is in the "tty" or "uucp" group on Ubuntu
- // flavors of Linux, or else that the port's path (e.g., /dev/ttyACM0) has
- // global read/write permissions.
- //
- // 3. You have uploaded a program to the board that does a byte-for-byte echo
- // on the virtual serial port at 57600 bps. An example is at
- // chrome/test/data/extensions/api_test/serial/api/serial_arduino_test.ino.
- //
- listener.Reply("echo_device_attached");
-#else
- listener.Reply("false");
+#if SIMULATE_SERIAL_PORTS
+ ASSERT_TRUE(ExtensionFunctionDispatcher::OverrideFunction(
+ "experimental.serial.getPorts",
+ FakeSerialGetPortsFunctionFactory));
+ ASSERT_TRUE(ExtensionFunctionDispatcher::OverrideFunction(
+ "experimental.serial.open",
+ FakeSerialOpenFunctionFactory));
#endif
- EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
+ ASSERT_TRUE(RunExtensionTest("serial/api")) << message_;
}

Powered by Google App Engine
This is Rietveld 408576698