Remove use of ShareTarget from payload tracker.

PiperOrigin-RevId: 631211496
This commit is contained in:
Francis Tsui
2024-05-06 15:56:37 -07:00
committed by Copybara-Service
parent 7d0312eca6
commit 346999639c
6 changed files with 164 additions and 74 deletions
+73 -63
View File
@@ -2584,9 +2584,8 @@ void NearbySharingServiceImpl::OnPayloadPathsRegistered(
info->set_payload_tracker(std::make_shared<PayloadTracker>(
context_, share_target, attachment_info_map_,
[this](ShareTarget share_target, TransferMetadata transfer_metadata) {
OnPayloadTransferUpdate(share_target, transfer_metadata);
}));
absl::bind_front(&NearbySharingServiceImpl::OnPayloadTransferUpdate,
this)));
// Register status listener for all payloads.
for (int64_t attachment_id : share_target.GetAttachmentIds()) {
@@ -2870,7 +2869,8 @@ void NearbySharingServiceImpl::OnCreatePayloads(
bool success) {
OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id);
bool has_payloads = info && (!info->text_payloads().empty() ||
!info->file_payloads().empty());
!info->file_payloads().empty() ||
!info->wifi_credentials_payloads().empty());
if (!success || !has_payloads) {
NL_LOG(WARNING) << __func__
<< ": Failed to send file to remote ShareTarget. Failed to "
@@ -3703,9 +3703,8 @@ void NearbySharingServiceImpl::OnReceiveConnectionResponse(
info->set_payload_tracker(std::make_unique<PayloadTracker>(
context_, share_target, attachment_info_map_,
[this](ShareTarget share_target, TransferMetadata transfer_metadata) {
OnPayloadTransferUpdate(share_target, transfer_metadata);
}));
absl::bind_front(&NearbySharingServiceImpl::OnPayloadTransferUpdate,
this)));
if (NearbyFlags::GetInstance().GetBoolFlag(
config_package_nearby::nearby_sharing_feature::
@@ -4018,84 +4017,95 @@ std::optional<ShareTarget> NearbySharingServiceImpl::CreateShareTarget(
}
void NearbySharingServiceImpl::OnPayloadTransferUpdate(
ShareTarget share_target, TransferMetadata metadata) {
int64_t share_target_id, TransferMetadata metadata) {
ShareTargetInfo* info = GetShareTargetInfo(share_target_id);
if (!info) {
// ShareTarget already disconnected.
NL_LOG(WARNING)
<< "Received payload update after share target disconnected: "
<< share_target_id;
return;
}
bool is_in_progress =
metadata.status() == TransferMetadata::Status::kInProgress;
if (is_in_progress && share_target.is_incoming &&
is_waiting_to_record_accept_to_transfer_start_metric_) {
is_waiting_to_record_accept_to_transfer_start_metric_ = false;
}
// kInProgress status is logged extensively elsewhere so avoid the spam.
if (!is_in_progress) {
NL_VLOG(1) << __func__ << ": Nearby Share service: "
<< "Payload transfer update for share target with ID "
<< share_target.id << ": "
<< share_target_id << ": "
<< TransferMetadata::StatusToString(metadata.status());
}
// Update file paths during progress. It may impact transfer speed.
// TODO: b/289290115 - Revisit UpdateFilePath to enhance transfer speed for
// MacOS.
if (update_file_paths_in_progress_ && share_target.is_incoming) {
UpdateFilePath(share_target);
}
if (metadata.status() == TransferMetadata::Status::kComplete &&
share_target.is_incoming) {
if (!OnIncomingPayloadsComplete(share_target)) {
metadata = TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kIncompletePayloads)
.build();
// Reset file paths for file attachments.
for (auto& file : share_target.file_attachments)
file.set_file_path(std::nullopt);
// Reset body of text attachments.
for (auto& text : share_target.text_attachments)
text.set_text_body(std::string());
// Reset password of Wi-Fi credentials attachments.
for (auto& wifi_credentials : share_target.wifi_credentials_attachments) {
wifi_credentials.set_password(std::string());
wifi_credentials.set_is_hidden(false);
}
bool payload_incomplete = false;
if (info->IsIncoming()) {
if (is_in_progress &&
is_waiting_to_record_accept_to_transfer_start_metric_) {
is_waiting_to_record_accept_to_transfer_start_metric_ = false;
}
if (IsBackgroundScanningFeatureEnabled()) {
fast_initiation_scanner_cooldown_timer_->Stop();
fast_initiation_scanner_cooldown_timer_->Start(
absl::ToInt64Milliseconds(kFastInitiationScannerCooldown), 0,
[this]() {
fast_initiation_scanner_cooldown_timer_->Stop();
InvalidateFastInitiationScanning();
});
}
} else if (metadata.status() == TransferMetadata::Status::kCancelled &&
share_target.is_incoming) {
NL_VLOG(1) << __func__ << ": Update file paths for cancelled transfer";
if (!update_file_paths_in_progress_) {
ShareTarget share_target = info->share_target();
// Update file paths during progress. It may impact transfer speed.
// TODO: b/289290115 - Revisit UpdateFilePath to enhance transfer speed for
// MacOS.
if (update_file_paths_in_progress_) {
UpdateFilePath(share_target);
}
if (metadata.status() == TransferMetadata::Status::kComplete) {
if (!OnIncomingPayloadsComplete(share_target)) {
payload_incomplete = true;
// Reset file paths for file attachments.
for (auto& file : share_target.file_attachments)
file.set_file_path(std::nullopt);
// Reset body of text attachments.
for (auto& text : share_target.text_attachments)
text.set_text_body(std::string());
// Reset password of Wi-Fi credentials attachments.
for (auto& wifi_credentials :
share_target.wifi_credentials_attachments) {
wifi_credentials.set_password(std::string());
wifi_credentials.set_is_hidden(false);
}
}
if (IsBackgroundScanningFeatureEnabled()) {
fast_initiation_scanner_cooldown_timer_->Stop();
fast_initiation_scanner_cooldown_timer_->Start(
absl::ToInt64Milliseconds(kFastInitiationScannerCooldown), 0,
[this]() {
fast_initiation_scanner_cooldown_timer_->Stop();
InvalidateFastInitiationScanning();
});
}
} else if (metadata.status() == TransferMetadata::Status::kCancelled) {
NL_VLOG(1) << __func__ << ": Update file paths for cancelled transfer";
if (!update_file_paths_in_progress_) {
UpdateFilePath(share_target);
}
}
info->set_share_target(share_target);
}
// Make sure to call this before calling Disconnect, or we risk losing some
// transfer updates in the receive case due to the Disconnect call cleaning up
// share targets.
ShareTargetInfo* info = GetShareTargetInfo(share_target.id);
if (info) {
info->set_share_target(share_target);
info->UpdateTransferMetadata(metadata);
}
info->UpdateTransferMetadata(
payload_incomplete
? TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kIncompletePayloads)
.build()
: metadata);
// Cancellation has its own disconnection strategy, possibly adding a delay
// before disconnection to provide the other party time to process the
// cancellation.
// Cancellation has its own disconnection strategy, possibly adding a
// delay before disconnection to provide the other party time to process
// the cancellation.
if (TransferMetadata::IsFinalStatus(metadata.status()) &&
metadata.status() != TransferMetadata::Status::kCancelled) {
Disconnect(share_target.id, metadata);
Disconnect(share_target_id, metadata);
}
}
+1 -1
View File
@@ -402,7 +402,7 @@ class NearbySharingServiceImpl
std::optional<NearbyShareDecryptedPublicCertificate> certificate,
bool is_incoming);
void OnPayloadTransferUpdate(ShareTarget share_target,
void OnPayloadTransferUpdate(int64_t share_target_id,
TransferMetadata metadata);
bool OnIncomingPayloadsComplete(ShareTarget& share_target);
void RemoveIncomingPayloads(ShareTarget share_target);
@@ -87,6 +87,7 @@
#include "sharing/text_attachment.h"
#include "sharing/transfer_metadata.h"
#include "sharing/transfer_update_callback.h"
#include "sharing/wifi_credentials_attachment.h"
#include "google/protobuf/repeated_ptr_field.h"
namespace nearby {
@@ -345,6 +346,15 @@ std::vector<std::unique_ptr<Attachment>> CreateFileAttachments(
return attachments;
}
std::vector<std::unique_ptr<Attachment>> CreateWifiCredentialAttachments(
std::string ssid, std::string password) {
std::vector<std::unique_ptr<Attachment>> attachments;
attachments.push_back(std::make_unique<WifiCredentialsAttachment>(
std::move(ssid), service::proto::WifiCredentialsMetadata::WPA_PSK,
std::move(password)));
return attachments;
}
class NearbySharingServiceImplTest : public testing::Test {
public:
NearbySharingServiceImplTest() = default;
@@ -3662,6 +3672,76 @@ TEST_F(NearbySharingServiceImplTest, SendFilesSuccess) {
UnregisterSendSurface(&transfer_callback, &discovery_callback);
}
TEST_F(NearbySharingServiceImplTest, SendWifiCredentialsSuccess) {
NearbyFlags::GetInstance().OverrideBoolFlagValue(
config_package_nearby::nearby_sharing_feature::
kEnableTransferCancellationOptimization,
true);
MockTransferUpdateCallback transfer_callback;
MockShareTargetDiscoveredCallback discovery_callback;
ShareTarget target =
SetUpOutgoingShareTarget(transfer_callback, discovery_callback);
absl::Notification introduction_notification;
ExpectTransferUpdates(transfer_callback, target,
{TransferMetadata::Status::kConnecting,
TransferMetadata::Status::kAwaitingLocalConfirmation,
TransferMetadata::Status::kAwaitingRemoteAcceptance},
[&]() { introduction_notification.Notify(); });
EXPECT_EQ(SendAttachments(target, CreateWifiCredentialAttachments(
"GoogleGuest", "password")),
NearbySharingServiceImpl::StatusCodes::kOk);
EXPECT_TRUE(
introduction_notification.WaitForNotificationWithTimeout(kWaitTimeout));
// Verify data sent to the remote device so far.
EXPECT_TRUE(ExpectPairedKeyEncryptionFrame());
EXPECT_TRUE(ExpectPairedKeyResultFrame());
std::optional<IntroductionFrame> intro = ExpectIntroductionFrame();
ASSERT_TRUE(intro.has_value());
ASSERT_EQ(intro->wifi_credentials_metadata_size(), 1);
auto meta = intro->wifi_credentials_metadata(0);
EXPECT_EQ(meta.ssid(), "GoogleGuest");
EXPECT_EQ(meta.security_type(),
service::proto::WifiCredentialsMetadata::WPA_PSK);
// Expect the wifi credential payload to be sent in the end.
absl::Notification payload_notification;
fake_nearby_connections_manager_->set_send_payload_callback(
[&](std::unique_ptr<nearby::sharing::Payload> payload,
std::weak_ptr<NearbyConnectionsManager::PayloadStatusListener>
listener) {
ASSERT_TRUE(payload->content.is_bytes());
std::vector<uint8_t> bytes = payload->content.bytes_payload.bytes;
nearby::sharing::service::proto::WifiCredentials wifi_credentials;
ASSERT_TRUE(
wifi_credentials.ParseFromArray(bytes.data(), bytes.size()));
EXPECT_EQ(wifi_credentials.password(), "password");
EXPECT_FALSE(wifi_credentials.hidden_ssid());
payload_notification.Notify();
});
// We're now waiting for the remote device to respond with the accept
// result.
absl::Notification accept_notification;
ExpectTransferUpdates(transfer_callback, target,
{TransferMetadata::Status::kInProgress},
[&]() { accept_notification.Notify(); });
// Kick off send process by accepting the transfer from the remote device.
SendConnectionResponse(ConnectionResponseFrame::ACCEPT);
EXPECT_TRUE(accept_notification.WaitForNotificationWithTimeout(kWaitTimeout));
EXPECT_TRUE(
payload_notification.WaitForNotificationWithTimeout(kWaitTimeout));
UnregisterSendSurface(&transfer_callback, &discovery_callback);
}
TEST_F(NearbySharingServiceImplTest, CancelSenderInitiator) {
MockTransferUpdateCallback transfer_callback;
MockShareTargetDiscoveredCallback discovery_callback;
+6 -6
View File
@@ -43,9 +43,9 @@ namespace sharing {
PayloadTracker::PayloadTracker(
Context* context, const ShareTarget& share_target,
const absl::flat_hash_map<int64_t, AttachmentInfo>& attachment_info_map,
std::function<void(ShareTarget, TransferMetadata)> update_callback)
std::function<void(int64_t, TransferMetadata)> update_callback)
: context_(context),
share_target_(share_target),
share_target_id_(share_target.id),
update_callback_(std::move(update_callback)) {
total_transfer_size_ = 0;
confirmed_transfer_size_ = 0;
@@ -152,7 +152,7 @@ void PayloadTracker::OnTransferUpdate(const State& state) {
if (IsComplete()) {
NL_VLOG(1) << __func__ << ": All payloads are complete.";
update_callback_(
share_target_,
share_target_id_,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kComplete)
.set_progress(100)
@@ -165,7 +165,7 @@ void PayloadTracker::OnTransferUpdate(const State& state) {
if (IsCancelled(state)) {
NL_VLOG(1) << __func__ << ": Payloads cancelled.";
update_callback_(
share_target_,
share_target_id_,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kCancelled)
.set_total_attachments_count(payload_state_.size())
@@ -177,7 +177,7 @@ void PayloadTracker::OnTransferUpdate(const State& state) {
if (HasFailed(state)) {
NL_VLOG(1) << __func__ << ": Payloads failed.";
update_callback_(
share_target_,
share_target_id_,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kFailed)
.set_total_attachments_count(payload_state_.size())
@@ -240,7 +240,7 @@ void PayloadTracker::OnTransferUpdate(const State& state) {
last_update_timestamp_ = current_time;
update_callback_(
share_target_,
share_target_id_,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kInProgress)
.set_progress(percent)
+3 -3
View File
@@ -42,7 +42,7 @@ class PayloadTracker : public NearbyConnectionsManager::PayloadStatusListener {
PayloadTracker(
Context* context, const ShareTarget& share_target,
const absl::flat_hash_map<int64_t, AttachmentInfo>& attachment_info_map,
std::function<void(ShareTarget, TransferMetadata)> update_callback);
std::function<void(int64_t, TransferMetadata)> update_callback);
~PayloadTracker() override;
// NearbyConnectionsManager::PayloadStatusListener:
@@ -71,8 +71,8 @@ class PayloadTracker : public NearbyConnectionsManager::PayloadStatusListener {
double CalculateProgressPercent(const State& state) const;
Context* context_;
ShareTarget share_target_;
std::function<void(ShareTarget, TransferMetadata)> update_callback_;
const int64_t share_target_id_;
std::function<void(int64_t, TransferMetadata)> update_callback_;
// Map of payload id to state of payload.
std::map<int64_t, State> payload_state_;
+1 -1
View File
@@ -58,7 +58,7 @@ class PayloadTrackerTest : public ::testing::Test {
std::move(attachment_info));
payload_tracker_ = std::make_unique<PayloadTracker>(
context(), share_target_, attachment_info_map_,
[&](ShareTarget share_target, TransferMetadata transfer_metadata) {
[&](int64_t share_target_id, TransferMetadata transfer_metadata) {
current_percentage_ = transfer_metadata.progress();
});
}