blob: 3753d4a424c85938a2769a31f59c655d18867270 [file] [log] [blame]
// Copyright 2019 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 "chrome/browser/sharing/sharing_fcm_sender.h"
#include <memory>
#include "base/base64.h"
#include "base/callback_list.h"
#include "base/memory/ptr_util.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/sharing/features.h"
#include "chrome/browser/sharing/proto/sharing_message.pb.h"
#include "chrome/browser/sharing/sharing_constants.h"
#include "chrome/browser/sharing/sharing_message_bridge.h"
#include "chrome/browser/sharing/sharing_sync_preference.h"
#include "chrome/browser/sharing/sharing_utils.h"
#include "chrome/browser/sharing/vapid_key_manager.h"
#include "chrome/browser/sharing/web_push/web_push_sender.h"
#include "components/gcm_driver/crypto/gcm_encryption_result.h"
#include "components/gcm_driver/fake_gcm_driver.h"
#include "components/sync/driver/test_sync_service.h"
#include "components/sync/model/model_type_controller_delegate.h"
#include "components/sync_device_info/device_info.h"
#include "components/sync_device_info/fake_device_info_sync_service.h"
#include "components/sync_device_info/fake_local_device_info_provider.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "crypto/ec_private_key.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kMessageId[] = "message_id";
const char kVapidFcmToken[] = "vapid_fcm_token";
const char kVapidP256dh[] = "vapid_p256dh";
const char kVapidAuthSecret[] = "vapid_id_auth_secret";
const char kSenderIdFcmToken[] = "sender_id_fcm_token";
const char kSenderIdP256dh[] = "sender_id_p256dh";
const char kSenderIdAuthSecret[] = "sender_id_auth_secret";
const char kAuthorizedEntity[] = "authorized_entity";
const int kTtlSeconds = 10;
const char kServerConfiguration[] = "test_server_configuration";
const char kServerP256dh[] = "test_server_p256_dh";
const char kServerAuthSecret[] = "test_server_auth_secret";
class FakeGCMDriver : public gcm::FakeGCMDriver {
public:
FakeGCMDriver() = default;
~FakeGCMDriver() override = default;
void EncryptMessage(const std::string& app_id,
const std::string& authorized_entity,
const std::string& p256dh,
const std::string& auth_secret,
const std::string& message,
EncryptMessageCallback callback) override {
app_id_ = app_id;
authorized_entity_ = authorized_entity;
p256dh_ = p256dh;
auth_secret_ = auth_secret;
std::move(callback).Run(gcm::GCMEncryptionResult::ENCRYPTED_DRAFT_08,
message);
}
const std::string& app_id() { return app_id_; }
const std::string& authorized_entity() { return authorized_entity_; }
const std::string& p256dh() { return p256dh_; }
const std::string& auth_secret() { return auth_secret_; }
private:
std::string app_id_, authorized_entity_, p256dh_, auth_secret_;
DISALLOW_COPY_AND_ASSIGN(FakeGCMDriver);
};
class FakeWebPushSender : public WebPushSender {
public:
FakeWebPushSender() : WebPushSender(/*url_loader_factory=*/nullptr) {}
~FakeWebPushSender() override = default;
void SendMessage(const std::string& fcm_token,
crypto::ECPrivateKey* vapid_key,
WebPushMessage message,
WebPushCallback callback) override {
fcm_token_ = fcm_token;
vapid_key_ = vapid_key;
message_ = std::move(message);
std::move(callback).Run(result_,
base::make_optional<std::string>(kMessageId));
}
const std::string& fcm_token() { return fcm_token_; }
crypto::ECPrivateKey* vapid_key() { return vapid_key_; }
const base::Optional<WebPushMessage>& message() { return message_; }
void set_result(SendWebPushMessageResult result) { result_ = result; }
private:
std::string fcm_token_;
crypto::ECPrivateKey* vapid_key_;
base::Optional<WebPushMessage> message_;
SendWebPushMessageResult result_;
DISALLOW_COPY_AND_ASSIGN(FakeWebPushSender);
};
class FakeSharingMessageBridge : public SharingMessageBridge {
public:
FakeSharingMessageBridge() = default;
~FakeSharingMessageBridge() override = default;
// SharingMessageBridge:
void SendSharingMessage(
std::unique_ptr<sync_pb::SharingMessageSpecifics> specifics,
CommitFinishedCallback on_commit_callback) override {
specifics_ = std::move(*specifics);
sync_pb::SharingMessageCommitError commit_erorr;
commit_erorr.set_error_code(error_code_);
std::move(on_commit_callback).Run(commit_erorr);
}
// SharingMessageBridge:
base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
override {
return nullptr;
}
const base::Optional<sync_pb::SharingMessageSpecifics>& specifics() {
return specifics_;
}
void set_error_code(
const sync_pb::SharingMessageCommitError::ErrorCode& error_code) {
error_code_ = error_code;
}
private:
base::Optional<sync_pb::SharingMessageSpecifics> specifics_;
sync_pb::SharingMessageCommitError::ErrorCode error_code_;
DISALLOW_COPY_AND_ASSIGN(FakeSharingMessageBridge);
};
class MockVapidKeyManager : public VapidKeyManager {
public:
MockVapidKeyManager()
: VapidKeyManager(/*sharing_sync_preference=*/nullptr,
/*sync_service=*/nullptr) {}
~MockVapidKeyManager() {}
MOCK_METHOD0(GetOrCreateKey, crypto::ECPrivateKey*());
};
class SharingFCMSenderTest : public testing::Test {
public:
void OnMessageSent(SharingSendMessageResult* result_out,
base::Optional<std::string>* message_id_out,
SharingChannelType* channel_type_out,
SharingSendMessageResult result,
base::Optional<std::string> message_id,
SharingChannelType channel_type) {
*result_out = result;
*message_id_out = std::move(message_id);
*channel_type_out = channel_type;
}
protected:
SharingFCMSenderTest()
: fake_web_push_sender_(new FakeWebPushSender()),
sync_prefs_(&prefs_, &fake_device_info_sync_service_),
sharing_fcm_sender_(base::WrapUnique(fake_web_push_sender_),
&fake_sharing_message_bridge_,
&sync_prefs_,
&vapid_key_manager_,
&fake_gcm_driver_,
&fake_local_device_info_provider_,
&test_sync_service_) {
SharingSyncPreference::RegisterProfilePrefs(prefs_.registry());
}
base::test::ScopedFeatureList scoped_feature_list_;
FakeWebPushSender* fake_web_push_sender_;
FakeSharingMessageBridge fake_sharing_message_bridge_;
syncer::FakeDeviceInfoSyncService fake_device_info_sync_service_;
SharingSyncPreference sync_prefs_;
testing::NiceMock<MockVapidKeyManager> vapid_key_manager_;
FakeGCMDriver fake_gcm_driver_;
syncer::FakeLocalDeviceInfoProvider fake_local_device_info_provider_;
syncer::TestSyncService test_sync_service_;
SharingFCMSender sharing_fcm_sender_;
private:
sync_preferences::TestingPrefServiceSyncable prefs_;
}; // namespace
} // namespace
TEST_F(SharingFCMSenderTest, NoFcmRegistration) {
scoped_feature_list_.InitAndDisableFeature(kSharingSendViaSync);
sync_prefs_.ClearFCMRegistration();
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
fcm_channel.set_vapid_fcm_token(kVapidFcmToken);
fcm_channel.set_vapid_p256dh(kVapidP256dh);
fcm_channel.set_vapid_auth_secret(kVapidAuthSecret);
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ack_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kInternalError, result);
EXPECT_FALSE(message_id);
EXPECT_EQ(SharingChannelType::kUnknown, channel_type);
}
TEST_F(SharingFCMSenderTest, NoVapidKey) {
scoped_feature_list_.InitAndDisableFeature(kSharingSendViaSync);
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(nullptr));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
fcm_channel.set_vapid_fcm_token(kVapidFcmToken);
fcm_channel.set_vapid_p256dh(kVapidP256dh);
fcm_channel.set_vapid_auth_secret(kVapidAuthSecret);
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ack_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kInternalError, result);
EXPECT_FALSE(message_id);
EXPECT_EQ(SharingChannelType::kFcmVapid, channel_type);
}
TEST_F(SharingFCMSenderTest, NoChannelsSpecified) {
test_sync_service_.SetActiveDataTypes({syncer::SHARING_MESSAGE});
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
// Don't set any channels.
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ack_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kDeviceNotFound, result);
EXPECT_FALSE(message_id);
EXPECT_EQ(SharingChannelType::kUnknown, channel_type);
}
TEST_F(SharingFCMSenderTest, SendViaSyncDisabled) {
scoped_feature_list_.InitAndDisableFeature(kSharingSendViaSync);
test_sync_service_.SetActiveDataTypes({});
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
// Set only Sender ID channel.
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ack_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kDeviceNotFound, result);
EXPECT_FALSE(message_id);
EXPECT_EQ(SharingChannelType::kUnknown, channel_type);
}
TEST_F(SharingFCMSenderTest, PreferVapid) {
scoped_feature_list_.InitAndEnableFeature(kSharingPreferVapid);
test_sync_service_.SetActiveDataTypes({syncer::SHARING_MESSAGE});
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
fake_web_push_sender_->set_result(SendWebPushMessageResult::kSuccessful);
fake_sharing_message_bridge_.set_error_code(
sync_pb::SharingMessageCommitError::NONE);
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
// Set both VAPID and Sender ID channel.
fcm_channel.set_vapid_fcm_token(kVapidFcmToken);
fcm_channel.set_vapid_p256dh(kVapidP256dh);
fcm_channel.set_vapid_auth_secret(kVapidAuthSecret);
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ping_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kSuccessful, result);
// Ensures that a Ping message is sent through WebPushSender.
chrome_browser_sharing::SharingMessage message_sent;
ASSERT_TRUE(fake_web_push_sender_->message());
message_sent.ParseFromString(fake_web_push_sender_->message()->payload);
EXPECT_TRUE(message_sent.has_ping_message());
// Ensures that no message is sent through SharingMessageBridge.
EXPECT_FALSE(fake_sharing_message_bridge_.specifics());
}
TEST_F(SharingFCMSenderTest, PreferSync) {
scoped_feature_list_.InitAndDisableFeature(kSharingPreferVapid);
test_sync_service_.SetActiveDataTypes({syncer::SHARING_MESSAGE});
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
fake_web_push_sender_->set_result(SendWebPushMessageResult::kSuccessful);
fake_sharing_message_bridge_.set_error_code(
sync_pb::SharingMessageCommitError::NONE);
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
// Set both VAPID and Sender ID channel.
fcm_channel.set_vapid_fcm_token(kVapidFcmToken);
fcm_channel.set_vapid_p256dh(kVapidP256dh);
fcm_channel.set_vapid_auth_secret(kVapidAuthSecret);
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ping_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(SharingSendMessageResult::kSuccessful, result);
// Ensures that a Ping message is sent through SharingMessageBridge.
chrome_browser_sharing::SharingMessage message_sent;
ASSERT_TRUE(fake_sharing_message_bridge_.specifics());
ASSERT_TRUE(fake_sharing_message_bridge_.specifics()->has_payload());
message_sent.ParseFromString(
fake_sharing_message_bridge_.specifics()->payload());
EXPECT_TRUE(message_sent.has_ping_message());
// Ensures that no message is sent through WebPushSender.
EXPECT_FALSE(fake_web_push_sender_->message());
}
struct WebPushResultTestData {
const SendWebPushMessageResult web_push_result;
const SharingSendMessageResult expected_result;
} kWebPushResultTestData[] = {{SendWebPushMessageResult::kSuccessful,
SharingSendMessageResult::kSuccessful},
{SendWebPushMessageResult::kSuccessful,
SharingSendMessageResult::kSuccessful},
{SendWebPushMessageResult::kDeviceGone,
SharingSendMessageResult::kDeviceNotFound},
{SendWebPushMessageResult::kNetworkError,
SharingSendMessageResult::kNetworkError},
{SendWebPushMessageResult::kPayloadTooLarge,
SharingSendMessageResult::kPayloadTooLarge},
{SendWebPushMessageResult::kEncryptionFailed,
SharingSendMessageResult::kInternalError},
{SendWebPushMessageResult::kCreateJWTFailed,
SharingSendMessageResult::kInternalError},
{SendWebPushMessageResult::kServerError,
SharingSendMessageResult::kInternalError},
{SendWebPushMessageResult::kParseResponseFailed,
SharingSendMessageResult::kInternalError},
{SendWebPushMessageResult::kVapidKeyInvalid,
SharingSendMessageResult::kInternalError}};
class SharingFCMSenderWebPushResultTest
: public SharingFCMSenderTest,
public testing::WithParamInterface<WebPushResultTestData> {};
TEST_P(SharingFCMSenderWebPushResultTest, ResultTest) {
sync_prefs_.SetFCMRegistration(SharingSyncPreference::FCMRegistration(
kAuthorizedEntity, base::Time::Now()));
fake_web_push_sender_->set_result(GetParam().web_push_result);
std::unique_ptr<crypto::ECPrivateKey> vapid_key =
crypto::ECPrivateKey::Create();
ON_CALL(vapid_key_manager_, GetOrCreateKey())
.WillByDefault(testing::Return(vapid_key.get()));
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
fcm_channel.set_vapid_fcm_token(kVapidFcmToken);
fcm_channel.set_vapid_p256dh(kVapidP256dh);
fcm_channel.set_vapid_auth_secret(kVapidAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ping_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(kSharingFCMAppID, fake_gcm_driver_.app_id());
EXPECT_EQ(kAuthorizedEntity, fake_gcm_driver_.authorized_entity());
EXPECT_EQ(kVapidP256dh, fake_gcm_driver_.p256dh());
EXPECT_EQ(kVapidAuthSecret, fake_gcm_driver_.auth_secret());
EXPECT_EQ(kVapidFcmToken, fake_web_push_sender_->fcm_token());
EXPECT_EQ(vapid_key.get(), fake_web_push_sender_->vapid_key());
EXPECT_EQ(kTtlSeconds, fake_web_push_sender_->message()->time_to_live);
EXPECT_EQ(WebPushMessage::Urgency::kHigh,
fake_web_push_sender_->message()->urgency);
chrome_browser_sharing::SharingMessage message_sent;
ASSERT_TRUE(fake_web_push_sender_->message());
message_sent.ParseFromString(fake_web_push_sender_->message()->payload);
EXPECT_TRUE(message_sent.has_ping_message());
EXPECT_EQ(GetParam().expected_result, result);
EXPECT_EQ(kMessageId, message_id);
EXPECT_EQ(SharingChannelType::kFcmVapid, channel_type);
}
INSTANTIATE_TEST_SUITE_P(All,
SharingFCMSenderWebPushResultTest,
testing::ValuesIn(kWebPushResultTestData));
struct CommitErrorCodeTestData {
const sync_pb::SharingMessageCommitError::ErrorCode commit_erorr_code;
const SharingSendMessageResult expected_result;
} kCommitErrorCodeTestData[] = {
{sync_pb::SharingMessageCommitError::NONE,
SharingSendMessageResult::kSuccessful},
{sync_pb::SharingMessageCommitError::NOT_FOUND,
SharingSendMessageResult::kDeviceNotFound},
{sync_pb::SharingMessageCommitError::INVALID_ARGUMENT,
SharingSendMessageResult::kPayloadTooLarge},
{sync_pb::SharingMessageCommitError::INTERNAL,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::UNAVAILABLE,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::RESOURCE_EXHAUSTED,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::UNAUTHENTICATED,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::PERMISSION_DENIED,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::SYNC_TURNED_OFF,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::SYNC_NETWORK_ERROR,
SharingSendMessageResult::kNetworkError},
{sync_pb::SharingMessageCommitError::SYNC_SERVER_ERROR,
SharingSendMessageResult::kInternalError},
{sync_pb::SharingMessageCommitError::SYNC_TIMEOUT,
SharingSendMessageResult::kCommitTimeout}};
class SharingFCMSenderCommitErrorCodeTest
: public SharingFCMSenderTest,
public testing::WithParamInterface<CommitErrorCodeTestData> {};
TEST_P(SharingFCMSenderCommitErrorCodeTest, ErrorCodeTest) {
test_sync_service_.SetActiveDataTypes({syncer::SHARING_MESSAGE});
fake_sharing_message_bridge_.set_error_code(GetParam().commit_erorr_code);
chrome_browser_sharing::FCMChannelConfiguration fcm_channel;
fcm_channel.set_sender_id_fcm_token(kSenderIdFcmToken);
fcm_channel.set_sender_id_p256dh(kSenderIdP256dh);
fcm_channel.set_sender_id_auth_secret(kSenderIdAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ping_message();
sharing_fcm_sender_.SendMessageToFcmTarget(
fcm_channel, base::TimeDelta::FromSeconds(kTtlSeconds),
std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(kSharingFCMAppID, fake_gcm_driver_.app_id());
EXPECT_EQ(kSharingSenderID, fake_gcm_driver_.authorized_entity());
EXPECT_EQ(kSenderIdP256dh, fake_gcm_driver_.p256dh());
EXPECT_EQ(kSenderIdAuthSecret, fake_gcm_driver_.auth_secret());
auto specifics = fake_sharing_message_bridge_.specifics();
ASSERT_TRUE(specifics);
ASSERT_TRUE(specifics->has_channel_configuration());
ASSERT_TRUE(specifics->channel_configuration().has_fcm());
auto fcm = specifics->channel_configuration().fcm();
EXPECT_EQ(kSenderIdFcmToken, fcm.token());
EXPECT_EQ(kTtlSeconds, fcm.ttl());
EXPECT_EQ(10, fcm.priority());
chrome_browser_sharing::SharingMessage message_sent;
ASSERT_TRUE(specifics->has_payload());
message_sent.ParseFromString(specifics->payload());
EXPECT_TRUE(message_sent.has_ping_message());
EXPECT_EQ(GetParam().expected_result, result);
EXPECT_TRUE(message_id);
EXPECT_EQ(SharingChannelType::kFcmSenderId, channel_type);
}
INSTANTIATE_TEST_SUITE_P(All,
SharingFCMSenderCommitErrorCodeTest,
testing::ValuesIn(kCommitErrorCodeTestData));
TEST_F(SharingFCMSenderTest, ServerTarget) {
test_sync_service_.SetActiveDataTypes({syncer::SHARING_MESSAGE});
fake_sharing_message_bridge_.set_error_code(
sync_pb::SharingMessageCommitError::NONE);
chrome_browser_sharing::ServerChannelConfiguration server_channel;
server_channel.set_configuration(kServerConfiguration);
server_channel.set_p256dh(kServerP256dh);
server_channel.set_auth_secret(kServerAuthSecret);
SharingSendMessageResult result;
base::Optional<std::string> message_id;
SharingChannelType channel_type;
chrome_browser_sharing::SharingMessage sharing_message;
sharing_message.mutable_ping_message();
sharing_fcm_sender_.SendMessageToServerTarget(
server_channel, std::move(sharing_message),
base::BindOnce(&SharingFCMSenderTest::OnMessageSent,
base::Unretained(this), &result, &message_id,
&channel_type));
EXPECT_EQ(kSharingFCMAppID, fake_gcm_driver_.app_id());
EXPECT_EQ(kSharingSenderID, fake_gcm_driver_.authorized_entity());
EXPECT_EQ(kServerP256dh, fake_gcm_driver_.p256dh());
EXPECT_EQ(kServerAuthSecret, fake_gcm_driver_.auth_secret());
auto specifics = fake_sharing_message_bridge_.specifics();
ASSERT_TRUE(specifics);
ASSERT_TRUE(specifics->has_channel_configuration());
EXPECT_EQ(kServerConfiguration, specifics->channel_configuration().server());
chrome_browser_sharing::SharingMessage message_sent;
ASSERT_TRUE(specifics->has_payload());
message_sent.ParseFromString(specifics->payload());
EXPECT_TRUE(message_sent.has_ping_message());
EXPECT_EQ(SharingSendMessageResult::kSuccessful, result);
EXPECT_TRUE(message_id);
EXPECT_EQ(SharingChannelType::kServer, channel_type);
}