Commit 03aac594 authored by ckehoe@chromium.org's avatar ckehoe@chromium.org

Setting OptInStateFilter for publishes and subscribes (b/16324352)

Review URL: https://codereview.chromium.org/459903006

Cr-Commit-Position: refs/heads/master@{#289337}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289337 0039d316-1c4b-4281-b951-d872f2087c98
parent 50d65abd
...@@ -84,6 +84,7 @@ bool ReportErrorLogged(const ReportResponse& response) { ...@@ -84,6 +84,7 @@ bool ReportErrorLogged(const ReportResponse& response) {
} }
// Request construction // Request construction
// TODO(ckehoe): Move these into a separate file?
template <typename T> template <typename T>
BroadcastScanConfiguration GetBroadcastScanConfig(const T& msg) { BroadcastScanConfiguration GetBroadcastScanConfig(const T& msg) {
...@@ -119,11 +120,11 @@ BroadcastScanConfiguration ExtractTokenExchangeStrategy( ...@@ -119,11 +120,11 @@ BroadcastScanConfiguration ExtractTokenExchangeStrategy(
// Strategies for subscriptions. // Strategies for subscriptions.
if (request.has_manage_subscriptions_request()) { if (request.has_manage_subscriptions_request()) {
const RepeatedPtrField<Subscription>& messages = const RepeatedPtrField<Subscription> subscriptions =
request.manage_subscriptions_request().subscription(); request.manage_subscriptions_request().subscription();
for (int i = 0; i < messages.size(); ++i) { for (int i = 0; i < subscriptions.size(); ++i) {
BroadcastScanConfiguration config = BroadcastScanConfiguration config =
GetBroadcastScanConfig(messages.Get(i)); GetBroadcastScanConfig(subscriptions.Get(i));
broadcast_only = broadcast_only || config == BROADCAST_ONLY; broadcast_only = broadcast_only || config == BROADCAST_ONLY;
scan_only = scan_only || config == SCAN_ONLY; scan_only = scan_only || config == SCAN_ONLY;
if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only)) if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only))
...@@ -205,6 +206,36 @@ void AddTokenToRequest(ReportRequest* request, const AudioToken& token) { ...@@ -205,6 +206,36 @@ void AddTokenToRequest(ReportRequest* request, const AudioToken& token) {
signals->set_observed_time_millis(base::Time::Now().ToJsTime()); signals->set_observed_time_millis(base::Time::Now().ToJsTime());
} }
OptInStateFilter* CreateOptedInOrOutFilter() {
OptInStateFilter* filter = new OptInStateFilter;
filter->add_allowed_opt_in_state(copresence::OPTED_IN);
filter->add_allowed_opt_in_state(copresence::OPTED_OUT);
return filter;
}
void AllowOptedOutMessages(ReportRequest* request) {
// TODO(ckehoe): Collapse this pattern into ProcessPublish()
// and ProcessSubscribe() methods.
RepeatedPtrField<PublishedMessage>* messages =
request->mutable_manage_messages_request()->mutable_message_to_publish();
for (int i = 0; i < messages->size(); ++i) {
PublishedMessage* message = messages->Mutable(i);
if (!message->has_opt_in_state_filter())
message->set_allocated_opt_in_state_filter(CreateOptedInOrOutFilter());
}
RepeatedPtrField<Subscription>* subscriptions =
request->mutable_manage_subscriptions_request()->mutable_subscription();
for (int i = 0; i < subscriptions->size(); ++i) {
Subscription* subscription = subscriptions->Mutable(i);
if (!subscription->has_opt_in_state_filter()) {
subscription->set_allocated_opt_in_state_filter(
CreateOptedInOrOutFilter());
}
}
}
} // namespace } // namespace
// Public methods // Public methods
...@@ -271,6 +302,7 @@ void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request, ...@@ -271,6 +302,7 @@ void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request,
AddPlayingTokens(request.get()); AddPlayingTokens(request.get());
AllowOptedOutMessages(request.get());
SendServerRequest(kReportRequestRpcName, SendServerRequest(kReportRequestRpcName,
app_id, app_id,
request.Pass(), request.Pass(),
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using google::protobuf::MessageLite; using google::protobuf::MessageLite;
using google::protobuf::RepeatedPtrField;
namespace copresence { namespace copresence {
...@@ -101,15 +102,26 @@ class RpcHandlerTest : public testing::Test, public CopresenceClientDelegate { ...@@ -101,15 +102,26 @@ class RpcHandlerTest : public testing::Test, public CopresenceClientDelegate {
status_ = status; status_ = status;
} }
inline const ReportRequest* GetReportSent() {
return static_cast<ReportRequest*>(request_proto_.get());
}
// TODO(ckehoe): Fix this on Windows. See rpc_handler.cc. // TODO(ckehoe): Fix this on Windows. See rpc_handler.cc.
#ifndef OS_WIN #ifndef OS_WIN
const TokenTechnology& GetTokenTechnologyFromReport() { const TokenTechnology& GetTokenTechnologyFromReport() {
ReportRequest* report = static_cast<ReportRequest*>(request_proto_.get()); return GetReportSent()->update_signals_request().state().capabilities()
return report->update_signals_request().state().capabilities()
.token_technology(0); .token_technology(0);
} }
#endif #endif
const RepeatedPtrField<PublishedMessage>& GetMessagesPublished() {
return GetReportSent()->manage_messages_request().message_to_publish();
}
const RepeatedPtrField<Subscription>& GetSubscriptionsSent() {
return GetReportSent()->manage_subscriptions_request().subscription();
}
void SetDeviceId(const std::string& device_id) { void SetDeviceId(const std::string& device_id) {
rpc_handler_.device_id_ = device_id; rpc_handler_.device_id_ = device_id;
} }
...@@ -235,6 +247,39 @@ TEST_F(RpcHandlerTest, GetDeviceCapabilities) { ...@@ -235,6 +247,39 @@ TEST_F(RpcHandlerTest, GetDeviceCapabilities) {
} }
#endif #endif
TEST_F(RpcHandlerTest, AllowOptedOutMessages) {
// Request with no filter specified.
scoped_ptr<ReportRequest> report(new ReportRequest);
report->mutable_manage_messages_request()->add_message_to_publish()
->set_id("message");
report->mutable_manage_subscriptions_request()->add_subscription()
->set_id("subscription");
rpc_handler_.SendReportRequest(report.Pass());
const OptInStateFilter& filter =
GetMessagesPublished().Get(0).opt_in_state_filter();
ASSERT_EQ(2, filter.allowed_opt_in_state_size());
EXPECT_EQ(OPTED_IN, filter.allowed_opt_in_state(0));
EXPECT_EQ(OPTED_OUT, filter.allowed_opt_in_state(1));
EXPECT_EQ(2, GetSubscriptionsSent().Get(0).opt_in_state_filter()
.allowed_opt_in_state_size());
// Request with filters already specified.
report.reset(new ReportRequest);
report->mutable_manage_messages_request()->add_message_to_publish()
->mutable_opt_in_state_filter()->add_allowed_opt_in_state(OPTED_IN);
report->mutable_manage_subscriptions_request()->add_subscription()
->mutable_opt_in_state_filter()->add_allowed_opt_in_state(OPTED_OUT);
rpc_handler_.SendReportRequest(report.Pass());
const OptInStateFilter& publish_filter =
GetMessagesPublished().Get(0).opt_in_state_filter();
ASSERT_EQ(1, publish_filter.allowed_opt_in_state_size());
EXPECT_EQ(OPTED_IN, publish_filter.allowed_opt_in_state(0));
const OptInStateFilter& subscription_filter =
GetSubscriptionsSent().Get(0).opt_in_state_filter();
ASSERT_EQ(1, subscription_filter.allowed_opt_in_state_size());
EXPECT_EQ(OPTED_OUT, subscription_filter.allowed_opt_in_state(0));
}
TEST_F(RpcHandlerTest, CreateRequestHeader) { TEST_F(RpcHandlerTest, CreateRequestHeader) {
SetDeviceId("CreateRequestHeader Device ID"); SetDeviceId("CreateRequestHeader Device ID");
rpc_handler_.SendReportRequest(make_scoped_ptr(new ReportRequest), rpc_handler_.SendReportRequest(make_scoped_ptr(new ReportRequest),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment