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 "chrome/browser/extensions/api/copresence/copresence_api.h" | |
| 6 #include "chrome/browser/extensions/extension_apitest.h" | |
| 7 #include "components/copresence/public/copresence_client.h" | |
| 8 | |
| 9 using copresence::CopresenceClient; | |
| 10 using copresence::CopresenceClientDelegate; | |
| 11 using copresence::FAIL; | |
| 12 using copresence::Message; | |
| 13 using copresence::PublishedMessage; | |
| 14 using copresence::ReportRequest; | |
| 15 using copresence::Subscription; | |
| 16 using google::protobuf::RepeatedPtrField; | |
| 17 | |
| 18 namespace extensions { | |
| 19 | |
| 20 typedef ExtensionApiTest CopresenceApiTest; | |
| 21 | |
| 22 template <typename T> | |
| 23 bool GetOnly(const RepeatedPtrField<T>& things, T* out) { | |
| 24 if (things.size() != 1) { | |
| 25 return false; | |
| 26 } else { | |
|
not at google - send to devlin
2014/08/07 23:21:12
no else after return
Charlie
2014/08/07 23:52:24
Done.
| |
| 27 *out = things.Get(0); | |
| 28 return true; | |
| 29 } | |
| 30 } | |
| 31 | |
| 32 bool ValidatePublishes(const RepeatedPtrField<PublishedMessage>& publishes) { | |
| 33 PublishedMessage publish; | |
| 34 return GetOnly(publishes, &publish) && | |
| 35 publish.id() == "call" && | |
| 36 publish.access_policy().acl().acl_type() == copresence::NO_ACL_CHECK && | |
| 37 publish.message().type().type() == "joke" && | |
| 38 publish.message().payload() == "Knock Knock!" && | |
| 39 publish.token_exchange_strategy().broadcast_scan_configuration() | |
| 40 == copresence::BROADCAST_ONLY; | |
| 41 } | |
| 42 | |
| 43 bool ValidateSubscriptions( | |
| 44 const RepeatedPtrField<Subscription>& subscriptions) { | |
| 45 Subscription subscription; | |
| 46 return GetOnly(subscriptions, &subscription) && | |
| 47 subscription.id() == "response" && | |
| 48 subscription.ttl_millis() == 1000 && | |
| 49 subscription.message_type().type() == "joke" && | |
| 50 subscription.token_exchange_strategy().broadcast_scan_configuration() | |
| 51 == copresence::SCAN_ONLY; | |
| 52 } | |
| 53 | |
| 54 bool ValidateUnpublishUnsubscribe(const ReportRequest& request) { | |
| 55 const RepeatedPtrField<std::string>& unpublish_ids = | |
| 56 request.manage_messages_request().id_to_unpublish(); | |
| 57 const RepeatedPtrField<std::string>& unsubscribe_ids = | |
| 58 request.manage_subscriptions_request().id_to_unsubscribe(); | |
| 59 | |
| 60 std::string unpublish_id; | |
| 61 std::string unsubscribe_id; | |
| 62 return GetOnly(unpublish_ids, &unpublish_id) && unpublish_id == "call" && | |
| 63 GetOnly(unsubscribe_ids, &unsubscribe_id) && unsubscribe_id == "response"; | |
| 64 } | |
| 65 | |
| 66 class MockCopresenceClient : public CopresenceClient { | |
| 67 public: | |
| 68 explicit MockCopresenceClient(CopresenceClientDelegate* delegate) | |
| 69 : delegate_(delegate) {} | |
| 70 virtual ~MockCopresenceClient() {} | |
| 71 | |
| 72 virtual void ExecuteReportRequest( | |
| 73 ReportRequest request, | |
| 74 const std::string& app_id, | |
| 75 const copresence::StatusCallback& status_callback) OVERRIDE { | |
| 76 | |
| 77 const RepeatedPtrField<PublishedMessage>& publishes = | |
| 78 request.manage_messages_request().message_to_publish(); | |
| 79 const RepeatedPtrField<Subscription>& subscriptions = | |
| 80 request.manage_subscriptions_request().subscription(); | |
| 81 | |
| 82 // Expecting either a publish, a subscribe, or unpublish *and* unsubscribe. | |
| 83 if (publishes.size() > 0) { | |
| 84 if (!ValidatePublishes(publishes)) { | |
| 85 LOG(ERROR) << "Found invalid publish"; | |
| 86 status_callback.Run(FAIL); | |
| 87 return; | |
| 88 } | |
| 89 } else if (subscriptions.size() > 0) { | |
| 90 if (!ValidateSubscriptions(subscriptions)) { | |
| 91 LOG(ERROR) << "Found invalid subscribe"; | |
| 92 status_callback.Run(FAIL); | |
| 93 return; | |
| 94 } else { | |
| 95 // For subscriptions, deliver messages. | |
| 96 Message returned_message; | |
| 97 returned_message.mutable_type()->set_type("joke"); | |
| 98 returned_message.set_payload("Who's there?"); | |
| 99 delegate_->HandleMessages( | |
| 100 app_id, "response", std::vector<Message>(2, returned_message)); | |
| 101 } | |
| 102 } else { | |
| 103 if (!ValidateUnpublishUnsubscribe(request)) { | |
| 104 LOG(ERROR) << "Found invalid unpublish/unsubscribe"; | |
| 105 status_callback.Run(FAIL); | |
| 106 return; | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 status_callback.Run(copresence::SUCCESS); | |
| 111 } | |
| 112 | |
| 113 private: | |
| 114 CopresenceClientDelegate* delegate_; | |
| 115 }; | |
| 116 | |
| 117 // TODO(ckehoe): Instead of using the full browser test stack, | |
| 118 // test individual functions. See extension_function_test_utils.h. | |
| 119 IN_PROC_BROWSER_TEST_F(CopresenceApiTest, Basic) { | |
| 120 CopresenceService* service = | |
| 121 CopresenceService::GetFactoryInstance()->Get(browser()->profile()); | |
| 122 service->set_client_for_testing( | |
| 123 make_scoped_ptr<CopresenceClient>(new MockCopresenceClient(service))); | |
| 124 | |
| 125 ASSERT_TRUE(RunExtensionTestNoFileAccess("copresence")) << message_; | |
| 126 } | |
| 127 | |
| 128 } // namespace extensions | |
| OLD | NEW |