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

Unified Diff: chrome/browser/extensions/api/copresence/copresence_apitest.cc

Issue 441103002: Tests for the Copresence API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@api
Patch Set: Rewrite Created 6 years, 4 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
« no previous file with comments | « chrome/browser/extensions/api/copresence/copresence_api.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/api/copresence/copresence_apitest.cc
diff --git a/chrome/browser/extensions/api/copresence/copresence_apitest.cc b/chrome/browser/extensions/api/copresence/copresence_apitest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2b7f73cabe3b01e0acfd21e45342d1bfe4135701
--- /dev/null
+++ b/chrome/browser/extensions/api/copresence/copresence_apitest.cc
@@ -0,0 +1,291 @@
+// Copyright 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.
+
+#include "base/json/json_writer.h"
+#include "base/path_service.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/api/copresence/copresence_api.h"
+#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_function_test_utils.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/chrome_content_client.h"
+#include "chrome/common/extensions/chrome_extensions_client.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "components/copresence/proto/data.pb.h"
+#include "components/copresence/proto/rpcs.pb.h"
+#include "components/copresence/public/copresence_manager.h"
+#include "content/common/url_schemes.h"
+#include "content/public/common/content_client.h"
+#include "ui/base/resource/resource_bundle.h"
+
+using base::ListValue;
+using copresence::BROADCAST_ONLY;
+using copresence::CopresenceManager;
+using copresence::CopresenceManagerDelegate;
+using copresence::FAIL;
+using copresence::PublishedMessage;
+using copresence::ReportRequest;
+using copresence::SCAN_ONLY;
+using copresence::Subscription;
+using google::protobuf::RepeatedPtrField;
+namespace test_utils = extension_function_test_utils;
+
+const char kExtensionId[] = "my extension";
+
+namespace extensions {
+
+using api::copresence::Message;
+using api::copresence::Operation;
+using api::copresence::PublishOperation;
+using api::copresence::Strategy;
+using api::copresence::SubscribeOperation;
+using api::copresence::UnpublishOperation;
+using api::copresence::UnsubscribeOperation;
+
+
+PublishOperation* CreatePublish(const std::string& id) {
+ PublishOperation* publish = new PublishOperation;
+
+ publish->id = id;
+ publish->time_to_live_millis.reset(new int(1000));
+ publish->message.type = "joke";
+ publish->message.payload = "Knock Knock";
+
+ return publish;
+}
+
+SubscribeOperation* CreateSubscribe(const std::string& id) {
+ SubscribeOperation* subscribe = new SubscribeOperation;
+
+ subscribe->id = id;
+ subscribe->time_to_live_millis.reset(new int(1000));
+ subscribe->filter.type = "joke";
+
+ return subscribe;
+}
+
+template <typename T>
+bool GetOnly(const RepeatedPtrField<T>& things, T* out) {
+ if (things.size() != 1)
+ return false;
+
+ *out = things.Get(0);
+ return true;
+}
+
+class MockCopresenceManager : public CopresenceManager {
+ public:
+ explicit MockCopresenceManager(CopresenceManagerDelegate* delegate)
+ : delegate_(delegate) {}
+ virtual ~MockCopresenceManager() {}
+
+ virtual void ExecuteReportRequest(
+ ReportRequest request,
+ const std::string& app_id,
+ const copresence::StatusCallback& status_callback) OVERRIDE {
+ request_ = request;
+ app_id_ = app_id;
+ status_callback.Run(copresence::SUCCESS);
+ }
+
+ CopresenceManagerDelegate* delegate_;
+
+ ReportRequest request_;
+ std::string app_id_;
+};
+
+class CopresenceApiTest : public ExtensionApiTest {
+ public:
+ CopresenceApiTest() {
+ TestingBrowserProcess::CreateInstance();
+ CHECK(temp_dir_.CreateUniqueTempDir());
+ TestingBrowserProcess::GetGlobal()->SetProfileManager(
+ new ProfileManager(temp_dir_.path()));
+
+ ExtensionsClient::Set(ChromeExtensionsClient::GetInstance());
+ content::SetContentClient(&content_client_);
+ content::RegisterContentSchemes(false);
+
+ base::FilePath extensions_shell_and_test_pak_path;
+ CHECK(PathService::Get(base::DIR_MODULE,
+ &extensions_shell_and_test_pak_path));
+ ui::ResourceBundle::InitSharedInstanceWithPakPath(
+ extensions_shell_and_test_pak_path.AppendASCII(
+ "extensions_shell_and_test.pak"));
+
+ test_extension_ = test_utils::CreateEmptyExtension(kExtensionId);
+
+ CopresenceService* service =
+ CopresenceService::GetFactoryInstance()->Get(profile());
xiyuan 2014/08/15 20:48:35 You cannot do this in test's ctor. It is way too e
Charlie 2014/08/15 21:25:38 Thanks Xiyuan! That was why I had a lot of extra i
+ copresence_manager_ = new MockCopresenceManager(service);
+ service->set_manager_for_testing(
+ make_scoped_ptr<CopresenceManager>(copresence_manager_));
+ }
+
+ virtual ~CopresenceApiTest() {}
+
+ // Takes ownership of the operation_list.
+ void ExecuteOperations(ListValue* operation_list, bool expect_error) const {
+ ListValue args_list;
+ std::string json_args;
+ args_list.Append(operation_list);
+ base::JSONWriter::Write(&args_list, &json_args);
+
+ scoped_refptr<UIThreadExtensionFunction> function =
+ new CopresenceExecuteFunction;
+ function->set_extension(test_extension_.get());
+ //function->set_browser_context(profile());
+ if (expect_error) {
+ test_utils::RunFunctionAndReturnError(
+ function.get(), json_args, browser());
+ } else {
+ test_utils::RunFunction(
+ function.get(), json_args, browser(), test_utils::NONE);
+ }
+ }
+
+ void ExecuteOperation(scoped_ptr<Operation> operation, bool expect_error)
+ const {
+ ListValue* operation_list = new ListValue;
+ operation_list->Append(operation->ToValue().release());
+ ExecuteOperations(operation_list, expect_error);
+ }
+
+ const ReportRequest& request_sent() const {
+ return copresence_manager_->request_;
+ }
+
+ const std::string& app_id_sent() const {
+ return copresence_manager_->app_id_;
+ }
+
+ void clear_app_id() {
+ copresence_manager_->app_id_ = "";
+ }
+
+ CopresenceManagerDelegate* delegate() {
+ return copresence_manager_->delegate_;
+ }
+
+ protected:
+ scoped_refptr<Extension> test_extension_;
+ MockCopresenceManager* copresence_manager_;
+
+ private:
+ ChromeContentClient content_client_;
+ base::ScopedTempDir temp_dir_;
+};
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Publish) {
+ scoped_ptr<PublishOperation> publish(CreatePublish("pub"));
+ publish->strategies.reset(new Strategy);
+ publish->strategies->only_broadcast.reset(new bool(true)); // Default
+
+ scoped_ptr<Operation> operation(new Operation);
+ operation->publish = publish.Pass();
+
+ clear_app_id();
+ ExecuteOperation(operation.Pass(), false);
+ EXPECT_EQ(kExtensionId, app_id_sent());
+
+ PublishedMessage message;
+ ASSERT_TRUE(GetOnly(
+ request_sent().manage_messages_request().message_to_publish(), &message));
+ EXPECT_EQ("pub", message.id());
+ EXPECT_EQ(1000, message.access_policy().ttl_millis());
+ EXPECT_EQ(copresence::NO_ACL_CHECK, message.access_policy().acl().acl_type());
+ EXPECT_EQ("joke", message.message().type().type());
+ EXPECT_EQ("Knock Knock!", message.message().payload());
+ EXPECT_EQ(BROADCAST_ONLY,
+ message.token_exchange_strategy().broadcast_scan_configuration());
+}
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Subscribe) {
+ scoped_ptr<SubscribeOperation> subscribe(CreateSubscribe("sub"));
+ subscribe->strategies.reset(new Strategy);
+ subscribe->strategies->only_broadcast.reset(new bool(true)); // Not default
+
+ scoped_ptr<Operation> operation(new Operation);
+ operation->subscribe = subscribe.Pass();
+
+ clear_app_id();
+ ExecuteOperation(operation.Pass(), false);
+ EXPECT_EQ(kExtensionId, app_id_sent());
+
+ Subscription subscription;
+ ASSERT_TRUE(GetOnly(
+ request_sent().manage_subscriptions_request().subscription(),
+ &subscription));
+ EXPECT_EQ("sub", subscription.id());
+ EXPECT_EQ(1000, subscription.ttl_millis());
+ EXPECT_EQ("joke", subscription.message_type().type());
+ copresence::BroadcastScanConfiguration strategy =
+ subscription.token_exchange_strategy().broadcast_scan_configuration();
+ EXPECT_EQ(BROADCAST_ONLY, strategy);
+}
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, DefaultStrategies) {
+ scoped_ptr<Operation> publishOperation;
+ publishOperation->publish.reset(CreatePublish("pub2"));
+
+ scoped_ptr<Operation> subscribeOperation;
+ subscribeOperation->subscribe.reset(CreateSubscribe("sub2"));
+
+ ListValue* operation_list = new ListValue;
+ operation_list->Append(publishOperation->ToValue().release());
+ operation_list->Append(subscribeOperation->ToValue().release());
+ ExecuteOperations(operation_list, false);
+
+ EXPECT_EQ(BROADCAST_ONLY,
+ request_sent().manage_messages_request().message_to_publish(0)
+ .token_exchange_strategy().broadcast_scan_configuration());
+ EXPECT_EQ(SCAN_ONLY,
+ request_sent().manage_subscriptions_request().subscription(0)
+ .token_exchange_strategy().broadcast_scan_configuration());
+}
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, UnPubSub) {
+ scoped_ptr<Operation> unpublishOperation(new Operation);
+ unpublishOperation->unpublish.reset(new UnpublishOperation);
+ unpublishOperation->unpublish->unpublish_id = "pub";
+
+ scoped_ptr<Operation> unsubscribeOperation(new Operation);
+ unsubscribeOperation->unsubscribe.reset(new UnsubscribeOperation);
+ unsubscribeOperation->unsubscribe->unsubscribe_id = "sub";
+
+ ListValue* operation_list = new ListValue;
+ operation_list->Append(unpublishOperation->ToValue().release());
+ operation_list->Append(unsubscribeOperation->ToValue().release());
+ ExecuteOperations(operation_list, false);
+
+ std::string unpublish_id;
+ ASSERT_TRUE(GetOnly(
+ request_sent().manage_messages_request().id_to_unpublish(),
+ &unpublish_id));
+ EXPECT_EQ("pub", unpublish_id);
+
+ std::string unsubscribe_id;
+ ASSERT_TRUE(GetOnly(
+ request_sent().manage_subscriptions_request().id_to_unsubscribe(),
+ &unsubscribe_id));
+ EXPECT_EQ("sub", unsubscribe_id);
+}
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, BadId) {
+ scoped_ptr<Operation> unpublishOperation(new Operation);
+ unpublishOperation->unpublish.reset(new UnpublishOperation);
+ unpublishOperation->unpublish->unpublish_id = "invalid id";
+
+ ExecuteOperation(unpublishOperation.Pass(), true);
+}
+
+IN_PROC_BROWSER_TEST_F(CopresenceApiTest, MultipleOperations) {
+ scoped_ptr<Operation> multiOperation;
+ multiOperation->publish.reset(CreatePublish("pub3"));
+ multiOperation->subscribe.reset(CreateSubscribe("sub3"));
+
+ ExecuteOperation(multiOperation.Pass(), true);
+}
+
+} // namespace extensions
« no previous file with comments | « chrome/browser/extensions/api/copresence/copresence_api.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698