| Index: chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
 | 
| diff --git a/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc b/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..c80cd48985beccb785ab875d37bfc384bbc010fa
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/extensions/api/braille_display_private/braille_display_private_apitest.cc
 | 
| @@ -0,0 +1,146 @@
 | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef USE_BRLAPI
 | 
| +#error This test requires brlapi.
 | 
| +#endif
 | 
| +
 | 
| +#include <deque>
 | 
| +
 | 
| +#include "base/bind.h"
 | 
| +#include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
 | 
| +#include "chrome/browser/extensions/api/braille_display_private/brlapi_connection.h"
 | 
| +#include "chrome/browser/extensions/extension_apitest.h"
 | 
| +#include "content/public/browser/browser_thread.h"
 | 
| +#include "testing/gtest/include/gtest/gtest.h"
 | 
| +
 | 
| +using content::BrowserThread;
 | 
| +using extensions::api::braille_display_private::BrailleController;
 | 
| +using extensions::api::braille_display_private::BrlapiConnection;
 | 
| +
 | 
| +// Data maintained by the mock BrlapiConnection.  This data lives throughout
 | 
| +// a test, while the api implementation takes ownership of the connection
 | 
| +// itself.
 | 
| +struct MockBrlapiConnectionData {
 | 
| +  bool connected;
 | 
| +  size_t display_size;
 | 
| +  brlapi_error_t error;
 | 
| +  std::vector<std::string> written_content;
 | 
| +  std::deque<brlapi_keyCode_t> pending_keys;
 | 
| +};
 | 
| +
 | 
| +class MockBrlapiConnection : public BrlapiConnection {
 | 
| + public:
 | 
| +  MockBrlapiConnection(MockBrlapiConnectionData* data)
 | 
| +      : data_(data) {}
 | 
| +  virtual bool Connect(const OnDataReadyCallback& on_data_ready) OVERRIDE {
 | 
| +    data_->connected = true;
 | 
| +    on_data_ready_ = on_data_ready;
 | 
| +    if (!data_->pending_keys.empty()) {
 | 
| +      BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
 | 
| +                              base::Bind(&MockBrlapiConnection::NotifyDataReady,
 | 
| +                                        base::Unretained(this)));
 | 
| +    }
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual void Disconnect() OVERRIDE {
 | 
| +    data_->connected = false;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool Connected() OVERRIDE {
 | 
| +    return data_->connected;
 | 
| +  }
 | 
| +
 | 
| +  virtual brlapi_error_t* BrlapiError() OVERRIDE {
 | 
| +    return &data_->error;
 | 
| +  }
 | 
| +
 | 
| +  virtual std::string BrlapiStrError() OVERRIDE {
 | 
| +    return data_->error.brlerrno != BRLAPI_ERROR_SUCCESS ? "Error" : "Success";
 | 
| +  }
 | 
| +
 | 
| +  virtual bool GetDisplaySize(size_t* size) OVERRIDE {
 | 
| +    *size = data_->display_size;
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool WriteDots(const unsigned char* cells) OVERRIDE {
 | 
| +    std::string written(reinterpret_cast<const char*>(cells),
 | 
| +                        data_->display_size);
 | 
| +    data_->written_content.push_back(written);
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual int ReadKey(brlapi_keyCode_t* keyCode) {
 | 
| +    if (!data_->pending_keys.empty()) {
 | 
| +      *keyCode = data_->pending_keys.front();
 | 
| +      data_->pending_keys.pop_front();
 | 
| +      return 1;
 | 
| +    } else {
 | 
| +      return 0;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +
 | 
| +  void NotifyDataReady() {
 | 
| +    on_data_ready_.Run();
 | 
| +    if (!data_->pending_keys.empty()) {
 | 
| +      BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
 | 
| +                              base::Bind(&MockBrlapiConnection::NotifyDataReady,
 | 
| +                                        base::Unretained(this)));
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  MockBrlapiConnectionData* data_;
 | 
| +  OnDataReadyCallback on_data_ready_;
 | 
| +};
 | 
| +
 | 
| +class BrailleDisplayPrivateApiTest : public ExtensionApiTest {
 | 
| + public:
 | 
| +  virtual void SetUpInProcessBrowserTestFixture() {
 | 
| +    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
 | 
| +    connection_data_.connected = false;
 | 
| +    connection_data_.display_size = 0;
 | 
| +    connection_data_.error.brlerrno = BRLAPI_ERROR_SUCCESS;
 | 
| +    BrailleController::GetInstance()->SetCreateBrlapiConnectionForTesting(
 | 
| +        base::Bind(
 | 
| +            &BrailleDisplayPrivateApiTest::CreateBrlapiConnection,
 | 
| +            base::Unretained(this)));
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  MockBrlapiConnectionData connection_data_;
 | 
| +
 | 
| + private:
 | 
| +  scoped_ptr<BrlapiConnection> CreateBrlapiConnection() {
 | 
| +    return scoped_ptr<BrlapiConnection>(
 | 
| +        new MockBrlapiConnection(&connection_data_));
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, WriteDots) {
 | 
| +  connection_data_.display_size = 11;
 | 
| +  ASSERT_TRUE(RunComponentExtensionTest("braille_display_private/write_dots"))
 | 
| +      << message_;
 | 
| +  ASSERT_EQ(3U, connection_data_.written_content.size());
 | 
| +  const std::string expected_content(connection_data_.display_size, '\0');
 | 
| +  for (size_t i = 0; i < connection_data_.written_content.size(); ++i) {
 | 
| +    ASSERT_EQ(std::string(
 | 
| +        connection_data_.display_size,
 | 
| +        static_cast<char>(i)),
 | 
| +                 connection_data_.written_content[i])
 | 
| +        << "String " << i << " doesn't match";
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +IN_PROC_BROWSER_TEST_F(BrailleDisplayPrivateApiTest, KeyEvents) {
 | 
| +  connection_data_.display_size = 11;
 | 
| +  connection_data_.pending_keys.push_back(
 | 
| +      BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_LNUP);
 | 
| +  connection_data_.pending_keys.push_back(
 | 
| +      BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_LNDN);
 | 
| +  ASSERT_TRUE(RunComponentExtensionTest("braille_display_private/key_events"));
 | 
| +}
 | 
| 
 |