Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/json/json_writer.h" | |
| 6 #include "base/path_service.h" | |
| 7 #include "base/values.h" | |
| 8 #include "chrome/browser/extensions/api/copresence/copresence_api.h" | |
| 9 #include "chrome/browser/extensions/extension_apitest.h" | |
| 10 #include "chrome/browser/extensions/extension_function_test_utils.h" | |
| 11 #include "chrome/browser/profiles/profile_manager.h" | |
| 12 #include "chrome/common/chrome_content_client.h" | |
| 13 #include "chrome/common/extensions/chrome_extensions_client.h" | |
| 14 #include "chrome/test/base/testing_browser_process.h" | |
| 15 #include "components/copresence/proto/data.pb.h" | |
| 16 #include "components/copresence/proto/rpcs.pb.h" | |
| 17 #include "components/copresence/public/copresence_manager.h" | |
| 18 #include "content/common/url_schemes.h" | |
| 19 #include "content/public/common/content_client.h" | |
| 20 #include "ui/base/resource/resource_bundle.h" | |
| 21 | |
| 22 using base::ListValue; | |
| 23 using copresence::BROADCAST_ONLY; | |
| 24 using copresence::CopresenceManager; | |
| 25 using copresence::CopresenceManagerDelegate; | |
| 26 using copresence::FAIL; | |
| 27 using copresence::PublishedMessage; | |
| 28 using copresence::ReportRequest; | |
| 29 using copresence::SCAN_ONLY; | |
| 30 using copresence::Subscription; | |
| 31 using google::protobuf::RepeatedPtrField; | |
| 32 namespace test_utils = extension_function_test_utils; | |
| 33 | |
| 34 const char kExtensionId[] = "my extension"; | |
| 35 | |
| 36 namespace extensions { | |
| 37 | |
| 38 using api::copresence::Message; | |
| 39 using api::copresence::Operation; | |
| 40 using api::copresence::PublishOperation; | |
| 41 using api::copresence::Strategy; | |
| 42 using api::copresence::SubscribeOperation; | |
| 43 using api::copresence::UnpublishOperation; | |
| 44 using api::copresence::UnsubscribeOperation; | |
| 45 | |
| 46 | |
| 47 PublishOperation* CreatePublish(const std::string& id) { | |
| 48 PublishOperation* publish = new PublishOperation; | |
| 49 | |
| 50 publish->id = id; | |
| 51 publish->time_to_live_millis.reset(new int(1000)); | |
| 52 publish->message.type = "joke"; | |
| 53 publish->message.payload = "Knock Knock"; | |
| 54 | |
| 55 return publish; | |
| 56 } | |
| 57 | |
| 58 SubscribeOperation* CreateSubscribe(const std::string& id) { | |
| 59 SubscribeOperation* subscribe = new SubscribeOperation; | |
| 60 | |
| 61 subscribe->id = id; | |
| 62 subscribe->time_to_live_millis.reset(new int(1000)); | |
| 63 subscribe->filter.type = "joke"; | |
| 64 | |
| 65 return subscribe; | |
| 66 } | |
| 67 | |
| 68 template <typename T> | |
| 69 bool GetOnly(const RepeatedPtrField<T>& things, T* out) { | |
| 70 if (things.size() != 1) | |
| 71 return false; | |
| 72 | |
| 73 *out = things.Get(0); | |
| 74 return true; | |
| 75 } | |
| 76 | |
| 77 class MockCopresenceManager : public CopresenceManager { | |
| 78 public: | |
| 79 explicit MockCopresenceManager(CopresenceManagerDelegate* delegate) | |
| 80 : delegate_(delegate) {} | |
| 81 virtual ~MockCopresenceManager() {} | |
| 82 | |
| 83 virtual void ExecuteReportRequest( | |
| 84 ReportRequest request, | |
| 85 const std::string& app_id, | |
| 86 const copresence::StatusCallback& status_callback) OVERRIDE { | |
| 87 request_ = request; | |
| 88 app_id_ = app_id; | |
| 89 status_callback.Run(copresence::SUCCESS); | |
| 90 } | |
| 91 | |
| 92 CopresenceManagerDelegate* delegate_; | |
| 93 | |
| 94 ReportRequest request_; | |
| 95 std::string app_id_; | |
| 96 }; | |
| 97 | |
| 98 class CopresenceApiTest : public ExtensionApiTest { | |
| 99 public: | |
| 100 CopresenceApiTest() { | |
| 101 TestingBrowserProcess::CreateInstance(); | |
| 102 CHECK(temp_dir_.CreateUniqueTempDir()); | |
| 103 TestingBrowserProcess::GetGlobal()->SetProfileManager( | |
| 104 new ProfileManager(temp_dir_.path())); | |
| 105 | |
| 106 ExtensionsClient::Set(ChromeExtensionsClient::GetInstance()); | |
| 107 content::SetContentClient(&content_client_); | |
| 108 content::RegisterContentSchemes(false); | |
| 109 | |
| 110 base::FilePath extensions_shell_and_test_pak_path; | |
| 111 CHECK(PathService::Get(base::DIR_MODULE, | |
| 112 &extensions_shell_and_test_pak_path)); | |
| 113 ui::ResourceBundle::InitSharedInstanceWithPakPath( | |
| 114 extensions_shell_and_test_pak_path.AppendASCII( | |
| 115 "extensions_shell_and_test.pak")); | |
| 116 | |
| 117 test_extension_ = test_utils::CreateEmptyExtension(kExtensionId); | |
| 118 | |
| 119 CopresenceService* service = | |
| 120 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
| |
| 121 copresence_manager_ = new MockCopresenceManager(service); | |
| 122 service->set_manager_for_testing( | |
| 123 make_scoped_ptr<CopresenceManager>(copresence_manager_)); | |
| 124 } | |
| 125 | |
| 126 virtual ~CopresenceApiTest() {} | |
| 127 | |
| 128 // Takes ownership of the operation_list. | |
| 129 void ExecuteOperations(ListValue* operation_list, bool expect_error) const { | |
| 130 ListValue args_list; | |
| 131 std::string json_args; | |
| 132 args_list.Append(operation_list); | |
| 133 base::JSONWriter::Write(&args_list, &json_args); | |
| 134 | |
| 135 scoped_refptr<UIThreadExtensionFunction> function = | |
| 136 new CopresenceExecuteFunction; | |
| 137 function->set_extension(test_extension_.get()); | |
| 138 //function->set_browser_context(profile()); | |
| 139 if (expect_error) { | |
| 140 test_utils::RunFunctionAndReturnError( | |
| 141 function.get(), json_args, browser()); | |
| 142 } else { | |
| 143 test_utils::RunFunction( | |
| 144 function.get(), json_args, browser(), test_utils::NONE); | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 void ExecuteOperation(scoped_ptr<Operation> operation, bool expect_error) | |
| 149 const { | |
| 150 ListValue* operation_list = new ListValue; | |
| 151 operation_list->Append(operation->ToValue().release()); | |
| 152 ExecuteOperations(operation_list, expect_error); | |
| 153 } | |
| 154 | |
| 155 const ReportRequest& request_sent() const { | |
| 156 return copresence_manager_->request_; | |
| 157 } | |
| 158 | |
| 159 const std::string& app_id_sent() const { | |
| 160 return copresence_manager_->app_id_; | |
| 161 } | |
| 162 | |
| 163 void clear_app_id() { | |
| 164 copresence_manager_->app_id_ = ""; | |
| 165 } | |
| 166 | |
| 167 CopresenceManagerDelegate* delegate() { | |
| 168 return copresence_manager_->delegate_; | |
| 169 } | |
| 170 | |
| 171 protected: | |
| 172 scoped_refptr<Extension> test_extension_; | |
| 173 MockCopresenceManager* copresence_manager_; | |
| 174 | |
| 175 private: | |
| 176 ChromeContentClient content_client_; | |
| 177 base::ScopedTempDir temp_dir_; | |
| 178 }; | |
| 179 | |
| 180 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Publish) { | |
| 181 scoped_ptr<PublishOperation> publish(CreatePublish("pub")); | |
| 182 publish->strategies.reset(new Strategy); | |
| 183 publish->strategies->only_broadcast.reset(new bool(true)); // Default | |
| 184 | |
| 185 scoped_ptr<Operation> operation(new Operation); | |
| 186 operation->publish = publish.Pass(); | |
| 187 | |
| 188 clear_app_id(); | |
| 189 ExecuteOperation(operation.Pass(), false); | |
| 190 EXPECT_EQ(kExtensionId, app_id_sent()); | |
| 191 | |
| 192 PublishedMessage message; | |
| 193 ASSERT_TRUE(GetOnly( | |
| 194 request_sent().manage_messages_request().message_to_publish(), &message)); | |
| 195 EXPECT_EQ("pub", message.id()); | |
| 196 EXPECT_EQ(1000, message.access_policy().ttl_millis()); | |
| 197 EXPECT_EQ(copresence::NO_ACL_CHECK, message.access_policy().acl().acl_type()); | |
| 198 EXPECT_EQ("joke", message.message().type().type()); | |
| 199 EXPECT_EQ("Knock Knock!", message.message().payload()); | |
| 200 EXPECT_EQ(BROADCAST_ONLY, | |
| 201 message.token_exchange_strategy().broadcast_scan_configuration()); | |
| 202 } | |
| 203 | |
| 204 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Subscribe) { | |
| 205 scoped_ptr<SubscribeOperation> subscribe(CreateSubscribe("sub")); | |
| 206 subscribe->strategies.reset(new Strategy); | |
| 207 subscribe->strategies->only_broadcast.reset(new bool(true)); // Not default | |
| 208 | |
| 209 scoped_ptr<Operation> operation(new Operation); | |
| 210 operation->subscribe = subscribe.Pass(); | |
| 211 | |
| 212 clear_app_id(); | |
| 213 ExecuteOperation(operation.Pass(), false); | |
| 214 EXPECT_EQ(kExtensionId, app_id_sent()); | |
| 215 | |
| 216 Subscription subscription; | |
| 217 ASSERT_TRUE(GetOnly( | |
| 218 request_sent().manage_subscriptions_request().subscription(), | |
| 219 &subscription)); | |
| 220 EXPECT_EQ("sub", subscription.id()); | |
| 221 EXPECT_EQ(1000, subscription.ttl_millis()); | |
| 222 EXPECT_EQ("joke", subscription.message_type().type()); | |
| 223 copresence::BroadcastScanConfiguration strategy = | |
| 224 subscription.token_exchange_strategy().broadcast_scan_configuration(); | |
| 225 EXPECT_EQ(BROADCAST_ONLY, strategy); | |
| 226 } | |
| 227 | |
| 228 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, DefaultStrategies) { | |
| 229 scoped_ptr<Operation> publishOperation; | |
| 230 publishOperation->publish.reset(CreatePublish("pub2")); | |
| 231 | |
| 232 scoped_ptr<Operation> subscribeOperation; | |
| 233 subscribeOperation->subscribe.reset(CreateSubscribe("sub2")); | |
| 234 | |
| 235 ListValue* operation_list = new ListValue; | |
| 236 operation_list->Append(publishOperation->ToValue().release()); | |
| 237 operation_list->Append(subscribeOperation->ToValue().release()); | |
| 238 ExecuteOperations(operation_list, false); | |
| 239 | |
| 240 EXPECT_EQ(BROADCAST_ONLY, | |
| 241 request_sent().manage_messages_request().message_to_publish(0) | |
| 242 .token_exchange_strategy().broadcast_scan_configuration()); | |
| 243 EXPECT_EQ(SCAN_ONLY, | |
| 244 request_sent().manage_subscriptions_request().subscription(0) | |
| 245 .token_exchange_strategy().broadcast_scan_configuration()); | |
| 246 } | |
| 247 | |
| 248 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, UnPubSub) { | |
| 249 scoped_ptr<Operation> unpublishOperation(new Operation); | |
| 250 unpublishOperation->unpublish.reset(new UnpublishOperation); | |
| 251 unpublishOperation->unpublish->unpublish_id = "pub"; | |
| 252 | |
| 253 scoped_ptr<Operation> unsubscribeOperation(new Operation); | |
| 254 unsubscribeOperation->unsubscribe.reset(new UnsubscribeOperation); | |
| 255 unsubscribeOperation->unsubscribe->unsubscribe_id = "sub"; | |
| 256 | |
| 257 ListValue* operation_list = new ListValue; | |
| 258 operation_list->Append(unpublishOperation->ToValue().release()); | |
| 259 operation_list->Append(unsubscribeOperation->ToValue().release()); | |
| 260 ExecuteOperations(operation_list, false); | |
| 261 | |
| 262 std::string unpublish_id; | |
| 263 ASSERT_TRUE(GetOnly( | |
| 264 request_sent().manage_messages_request().id_to_unpublish(), | |
| 265 &unpublish_id)); | |
| 266 EXPECT_EQ("pub", unpublish_id); | |
| 267 | |
| 268 std::string unsubscribe_id; | |
| 269 ASSERT_TRUE(GetOnly( | |
| 270 request_sent().manage_subscriptions_request().id_to_unsubscribe(), | |
| 271 &unsubscribe_id)); | |
| 272 EXPECT_EQ("sub", unsubscribe_id); | |
| 273 } | |
| 274 | |
| 275 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, BadId) { | |
| 276 scoped_ptr<Operation> unpublishOperation(new Operation); | |
| 277 unpublishOperation->unpublish.reset(new UnpublishOperation); | |
| 278 unpublishOperation->unpublish->unpublish_id = "invalid id"; | |
| 279 | |
| 280 ExecuteOperation(unpublishOperation.Pass(), true); | |
| 281 } | |
| 282 | |
| 283 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, MultipleOperations) { | |
| 284 scoped_ptr<Operation> multiOperation; | |
| 285 multiOperation->publish.reset(CreatePublish("pub3")); | |
| 286 multiOperation->subscribe.reset(CreateSubscribe("sub3")); | |
| 287 | |
| 288 ExecuteOperation(multiOperation.Pass(), true); | |
| 289 } | |
| 290 | |
| 291 } // namespace extensions | |
| OLD | NEW |