Move outgoing connection management into OutgoingShareSession.

PiperOrigin-RevId: 686671335
This commit is contained in:
Francis Tsui
2024-10-16 15:56:43 -07:00
committed by Copybara-Service
parent a094817c68
commit 2183467f14
15 changed files with 572 additions and 496 deletions
@@ -35,6 +35,14 @@ MATCHER_P(HasSessionId, session_id, "has session id") {
return arg.session_id() == session_id;
}
MATCHER_P(HasDurationMillis, duration_millis, "has duration millis") {
return arg.duration_millis() == duration_millis;
}
MATCHER_P(SharingLogHasStatus, status, "has status") {
return arg.status() == status;
}
} // namespace nearby::analytics
#endif // THIRD_PARTY_NEARBY_INTERNAL_ANALYTICS_SHARING_LOG_MATCHERS_H_
+1
View File
@@ -212,6 +212,7 @@ cc_library(
"//sharing/common:compatible_u8_string",
"//sharing/internal/api:platform",
"//sharing/internal/public:logging",
"//sharing/proto:enums_cc_proto",
"//sharing/proto:wire_format_cc_proto",
"@com_google_absl//absl/container:flat_hash_map",
"@com_google_absl//absl/functional:any_invocable",
+46 -64
View File
@@ -79,11 +79,6 @@ void IncomingShareSession::InvokeTransferUpdateCallback(
transfer_update_callback_(*this, metadata);
}
bool IncomingShareSession::OnNewConnection(NearbyConnection* connection) {
set_disconnect_status(TransferMetadata::Status::kFailed);
return true;
}
std::optional<TransferMetadata::Status>
IncomingShareSession::ProcessIntroduction(
const IntroductionFrame& introduction_frame) {
@@ -91,26 +86,23 @@ IncomingShareSession::ProcessIntroduction(
AttachmentContainer& container = mutable_attachment_container();
for (const auto& file : introduction_frame.file_metadata()) {
if (file.size() <= 0) {
NL_LOG(WARNING)
<< __func__
<< ": Ignore introduction, due to invalid attachment size";
LOG(WARNING) << "Ignore introduction, due to invalid attachment size";
return TransferMetadata::Status::kUnsupportedAttachmentType;
}
NL_VLOG(1) << __func__ << ": Found file attachment: id=" << file.id()
<< ", type= " << file.type() << ", size=" << file.size()
<< ", payload_id=" << file.payload_id()
<< ", parent_folder=" << file.parent_folder()
<< ", mime_type=" << file.mime_type();
VLOG(1) << "Found file attachment: id=" << file.id()
<< ", type= " << file.type() << ", size=" << file.size()
<< ", payload_id=" << file.payload_id()
<< ", parent_folder=" << file.parent_folder()
<< ", mime_type=" << file.mime_type();
container.AddFileAttachment(
FileAttachment(file.id(), file.size(), file.name(), file.mime_type(),
file.type(), file.parent_folder()));
SetAttachmentPayloadId(file.id(), file.payload_id());
if (std::numeric_limits<int64_t>::max() - file.size() < file_size_sum) {
NL_LOG(WARNING) << __func__
<< ": Ignoring introduction, total file size overflowed "
"64 bit integer.";
LOG(WARNING) << "Ignoring introduction, total file size overflowed 64 "
"bit integer.";
container.Clear();
return TransferMetadata::Status::kNotEnoughSpace;
}
@@ -119,15 +111,13 @@ IncomingShareSession::ProcessIntroduction(
for (const auto& text : introduction_frame.text_metadata()) {
if (text.size() <= 0) {
NL_LOG(WARNING)
<< __func__
<< ": Ignore introduction, due to invalid attachment size";
LOG(WARNING) << "Ignore introduction, due to invalid attachment size";
return TransferMetadata::Status::kUnsupportedAttachmentType;
}
NL_VLOG(1) << __func__ << ": Found text attachment: id=" << text.id()
<< ", type= " << text.type() << ", size=" << text.size()
<< ", payload_id=" << text.payload_id();
VLOG(1) << "Found text attachment: id=" << text.id()
<< ", type= " << text.type() << ", size=" << text.size()
<< ", payload_id=" << text.payload_id();
container.AddTextAttachment(
TextAttachment(text.id(), text.type(), text.text_title(), text.size()));
SetAttachmentPayloadId(text.id(), text.payload_id());
@@ -136,10 +126,9 @@ IncomingShareSession::ProcessIntroduction(
if (kSupportReceivingWifiCredentials) {
for (const auto& wifi_credentials :
introduction_frame.wifi_credentials_metadata()) {
NL_VLOG(1) << __func__ << ": Found WiFi credentials attachment: id="
<< wifi_credentials.id()
<< ", ssid= " << wifi_credentials.ssid()
<< ", payload_id=" << wifi_credentials.payload_id();
VLOG(1) << "Found WiFi credentials attachment: id="
<< wifi_credentials.id() << ", ssid= " << wifi_credentials.ssid()
<< ", payload_id=" << wifi_credentials.payload_id();
container.AddWifiCredentialsAttachment(WifiCredentialsAttachment(
wifi_credentials.id(), wifi_credentials.ssid(),
wifi_credentials.security_type()));
@@ -149,9 +138,9 @@ IncomingShareSession::ProcessIntroduction(
}
if (!container.HasAttachments()) {
NL_LOG(WARNING) << __func__
<< ": No attachment is found for this share target. It can "
"be result of unrecognizable attachment type";
LOG(WARNING) << __func__
<< ": No attachment is found for this share target. It can "
"be result of unrecognizable attachment type";
return TransferMetadata::Status::kUnsupportedAttachmentType;
}
return std::nullopt;
@@ -165,8 +154,7 @@ bool IncomingShareSession::ProcessKeyVerificationResult(
if (!HandleKeyVerificationResult(result, share_target_os_type)) {
return false;
}
NL_LOG(INFO) << __func__ << ": Waiting for introduction from "
<< share_target().id;
LOG(INFO) << ":Waiting for introduction from " << share_target().id;
frames_reader()->ReadFrame(
V1Frame::INTRODUCTION,
@@ -186,7 +174,7 @@ bool IncomingShareSession::ReadyForTransfer(
std::function<void()> accept_timeout_callback,
std::function<void(std::optional<V1Frame> frame)> frame_read_callback) {
if (!IsConnected()) {
NL_LOG(WARNING) << __func__ << ": out of order API call.";
LOG(WARNING) << "ReadyForTransfer called when not connected";
return false;
}
ready_for_accept_ = true;
@@ -212,7 +200,7 @@ bool IncomingShareSession::ReadyForTransfer(
bool IncomingShareSession::AcceptTransfer(
std::function<void(int64_t, TransferMetadata)> update_callback) {
if (!ready_for_accept_ || !IsConnected()) {
NL_LOG(WARNING) << __func__ << ": out of order API call.";
LOG(WARNING) << "AcceptTransfer call not expected";
return false;
}
ready_for_accept_ = false;
@@ -224,12 +212,11 @@ bool IncomingShareSession::AcceptTransfer(
// Register status listener for all payloads.
for (auto it = payload_map.begin(); it != payload_map.end(); ++it) {
NL_VLOG(1) << __func__
<< ": Started listening for progress on payload: " << it->second
<< " for attachment: " << it->first;
VLOG(1) << "Started listening for progress on payload: " << it->second
<< " for attachment: " << it->first;
connections_manager().RegisterPayloadStatusListener(it->second,
payload_tracker());
payload_tracker());
NL_VLOG(1) << __func__ << ": Accepted incoming files from share target - "
<< share_target().id;
@@ -251,7 +238,7 @@ bool IncomingShareSession::AcceptTransfer(
// the system or the user has verified the sender's identity; the
// stable identifiers potentially exposed by performing a bandwidth
// upgrade are no longer a concern.
NL_LOG(INFO) << __func__ << ": Upgrade bandwidth when sending accept.";
LOG(INFO) << "Upgrade bandwidth when sending accept.";
}
// Log analytics event of starting to receive payloads.
analytics_recorder().NewReceiveAttachmentsStart(session_id(),
@@ -270,8 +257,7 @@ bool IncomingShareSession::UpdateFilePayloadPaths() {
}
const auto it = attachment_payload_map().find(file.id());
if (it == attachment_payload_map().end()) {
NL_LOG(WARNING) << __func__ << ": No payload id found for file - "
<< file.id();
LOG(WARNING) << "Payload id missing for file attachment: " << file.id();
result = false;
continue;
}
@@ -279,8 +265,7 @@ bool IncomingShareSession::UpdateFilePayloadPaths() {
const Payload* incoming_payload =
connections_manager().GetIncomingPayload(it->second);
if (!incoming_payload || !incoming_payload->content.is_file()) {
NL_LOG(WARNING) << __func__ << ": No payload found for file - "
<< file.id();
LOG(WARNING) << "No payload found for file attachment: " << file.id();
result = false;
continue;
}
@@ -304,24 +289,20 @@ bool IncomingShareSession::UpdatePayloadContents() {
if (it == attachment_payload_map().end()) {
// This should never happen unless IntroductionFrame has not been
// processed.
NL_LOG(WARNING) << __func__ << ": No payload id found for text - "
<< text.id();
LOG(WARNING) << "Payload id missing for text attachment: " << text.id();
return false;
}
const Payload* incoming_payload =
connections_manager().GetIncomingPayload(it->second);
if (!incoming_payload || !incoming_payload->content.is_bytes()) {
NL_LOG(WARNING) << __func__ << ": No payload found for text - "
<< text.id();
LOG(WARNING) << "No payload found for text attachment: " << text.id();
return false;
}
std::vector<uint8_t> bytes = incoming_payload->content.bytes_payload.bytes;
if (bytes.empty()) {
NL_LOG(WARNING)
<< __func__
<< ": Incoming bytes is empty for text payload with payload_id - "
<< it->second;
LOG(WARNING) << "Incoming bytes is empty for text attachment: "
<< text.id() << " with payload_id: " << it->second;
return false;
}
@@ -337,36 +318,32 @@ bool IncomingShareSession::UpdatePayloadContents() {
if (it == attachment_payload_map().end()) {
// This should never happen unless IntroductionFrame has not been
// processed.
NL_LOG(WARNING) << __func__
<< ": No payload id found for WiFi credentials - "
<< wifi_credentials_attachment.id();
LOG(WARNING) << "Payload id missing for WiFi credentials: "
<< wifi_credentials_attachment.id();
return false;
}
const Payload* incoming_payload =
connections_manager().GetIncomingPayload(it->second);
if (!incoming_payload || !incoming_payload->content.is_bytes()) {
NL_LOG(WARNING) << __func__
<< ": No payload found for WiFi credentials - "
<< wifi_credentials_attachment.id();
LOG(WARNING) << "No payload found for WiFi credentials: "
<< wifi_credentials_attachment.id();
return false;
}
std::vector<uint8_t> bytes = incoming_payload->content.bytes_payload.bytes;
if (bytes.empty()) {
NL_LOG(WARNING) << __func__
<< ": Incoming bytes is empty for WiFi credentials "
"payload with payload_id - "
<< it->second;
LOG(WARNING) << "Incoming bytes is empty for WiFi credentials: "
<< wifi_credentials_attachment.id()
<< " with payload_id: " << it->second;
return false;
}
WifiCredentials wifi_credentials;
if (!wifi_credentials.ParseFromArray(bytes.data(), bytes.size())) {
NL_LOG(WARNING) << __func__
<< ": Incoming bytes is invalid for WiFi credentials "
"payload with payload_id - "
<< it->second;
LOG(WARNING) << "Incoming bytes is invalid for WiFi credentials: "
<< wifi_credentials_attachment.id()
<< " with payload_id: " << it->second;
return false;
}
@@ -481,4 +458,9 @@ std::pair<bool, bool> IncomingShareSession::PayloadTransferUpdate(
return std::make_pair(/*completed=*/false, /*success=*/false);
}
void IncomingShareSession::OnConnected(NearbyConnection* connection) {
set_disconnect_status(TransferMetadata::Status::kFailed);
SetConnection(connection);
}
} // namespace nearby::sharing
+3 -1
View File
@@ -107,9 +107,11 @@ class IncomingShareSession : public ShareSession {
std::pair<bool, bool> PayloadTransferUpdate(
bool update_file_paths_in_progress, const TransferMetadata& metadata);
// Called when an incoming connection is established.
void OnConnected(NearbyConnection* connection);
protected:
void InvokeTransferUpdateCallback(const TransferMetadata& metadata) override;
bool OnNewConnection(NearbyConnection* connection) override;
private:
// Update file attachment paths with payload paths.
+27 -27
View File
@@ -184,7 +184,7 @@ class IncomingShareSessionTest : public ::testing::Test {
};
TEST_F(IncomingShareSessionTest, ProcessIntroductionNoSupportedPayload) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
IntroductionFrame frame;
EXPECT_THAT(session_.ProcessIntroduction(frame),
@@ -193,7 +193,7 @@ TEST_F(IncomingShareSessionTest, ProcessIntroductionNoSupportedPayload) {
}
TEST_F(IncomingShareSessionTest, ProcessIntroductionEmptyFile) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
IntroductionFrame frame;
frame.mutable_file_metadata();
@@ -203,7 +203,7 @@ TEST_F(IncomingShareSessionTest, ProcessIntroductionEmptyFile) {
}
TEST_F(IncomingShareSessionTest, ProcessIntroductionFilesTooLarge) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
IntroductionFrame frame;
FileMetadata file1;
FileMetadata file2;
@@ -218,7 +218,7 @@ TEST_F(IncomingShareSessionTest, ProcessIntroductionFilesTooLarge) {
}
TEST_F(IncomingShareSessionTest, ProcessIntroductionEmptyText) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
IntroductionFrame frame;
frame.mutable_text_metadata();
@@ -228,7 +228,7 @@ TEST_F(IncomingShareSessionTest, ProcessIntroductionEmptyText) {
}
TEST_F(IncomingShareSessionTest, ProcessIntroductionSuccess) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
FileMetadata filemeta1 = introduction_frame_.file_metadata(0);
FileAttachment file1(filemeta1.id(), filemeta1.size(), filemeta1.name(),
filemeta1.mime_type(), filemeta1.type(),
@@ -277,7 +277,7 @@ TEST_F(IncomingShareSessionTest, ProcessIntroductionSuccess) {
TEST_F(IncomingShareSessionTest,
PayloadTransferUpdateCompleteWithWrongPayloadType) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
int64_t payload_id1 = introduction_frame_.file_metadata(0).payload_id();
@@ -333,7 +333,7 @@ TEST_F(IncomingShareSessionTest,
TEST_F(IncomingShareSessionTest,
PayloadTransferUpdateCompleteWithMissingFilePayloads) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -406,7 +406,7 @@ TEST_F(IncomingShareSessionTest,
TEST_F(IncomingShareSessionTest,
PayloadTransferUpdateCompleteWithMissingTextPayloads) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -476,7 +476,7 @@ TEST_F(IncomingShareSessionTest,
TEST_F(IncomingShareSessionTest,
PayloadTransferUpdateCompleteWithMissingWifiPayloads) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -544,7 +544,7 @@ TEST_F(IncomingShareSessionTest,
}
TEST_F(IncomingShareSessionTest, GetPayloadFilePaths) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
IntroductionFrame introduction_frame;
FileMetadata file1;
FileMetadata file2;
@@ -583,7 +583,7 @@ TEST_F(IncomingShareSessionTest, GetPayloadFilePaths) {
}
TEST_F(IncomingShareSessionTest, PayloadTransferUpdateCompleteWithSuccess) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -660,7 +660,7 @@ TEST_F(IncomingShareSessionTest, PayloadTransferUpdateCompleteWithSuccess) {
}
TEST_F(IncomingShareSessionTest, PayloadTransferUpdateCancelled) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -715,7 +715,7 @@ TEST_F(IncomingShareSessionTest, PayloadTransferUpdateCancelled) {
}
TEST_F(IncomingShareSessionTest, PayloadTransferUpdateFailed) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -763,7 +763,7 @@ TEST_F(IncomingShareSessionTest, PayloadTransferUpdateFailed) {
}
TEST_F(IncomingShareSessionTest, PayloadTransferUpdateInProgress) {
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
std::filesystem::path file1_path = "/usr/tmp/file1";
@@ -821,7 +821,7 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferNotConnected) {
TEST_F(IncomingShareSessionTest, ReadyForTransferNotSelfShare) {
session_.set_session_id(1234);
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_CALL(
transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation)));
@@ -839,7 +839,7 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferSelfShare) {
share_target,
transfer_metadata_callback_.AsStdFunction());
session.set_session_id(1234);
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection_));
session.OnConnected(&connection_);
EXPECT_CALL(
transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation)))
@@ -852,7 +852,7 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferSelfShare) {
TEST_F(IncomingShareSessionTest, ReadyForTransferTimeout) {
session_.set_session_id(1234);
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_CALL(
transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation)));
@@ -870,7 +870,7 @@ TEST_F(IncomingShareSessionTest, ReadyForTransferTimeout) {
TEST_F(IncomingShareSessionTest, ReadyForTransferTimeoutCancelled) {
session_.set_session_id(1234);
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_CALL(
transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kAwaitingLocalConfirmation)));
@@ -903,7 +903,7 @@ TEST_F(IncomingShareSessionTest, AcceptTransferNotConnected) {
TEST_F(IncomingShareSessionTest, AcceptTransferNotReady) {
session_.set_session_id(1234);
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
@@ -913,7 +913,7 @@ TEST_F(IncomingShareSessionTest, AcceptTransferNotReady) {
TEST_F(IncomingShareSessionTest, AcceptTransferSuccess) {
session_.set_session_id(1234);
EXPECT_TRUE(session_.OnConnected(absl::Now(), &connection_));
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame_),
Eq(std::nullopt));
EXPECT_THAT(
@@ -956,7 +956,7 @@ TEST_F(IncomingShareSessionTest, AcceptTransferSuccess) {
}
TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultSuccess) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
session_.SetTokenForTests("1234");
bool introduction_received = false;
@@ -990,7 +990,7 @@ TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultSuccess) {
}
TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultFail) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
session_.SetTokenForTests("1234");
bool introduction_received = false;
@@ -1023,7 +1023,7 @@ TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultFail) {
}
TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultUnable) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
session_.SetTokenForTests("1234");
bool introduction_received = false;
@@ -1056,7 +1056,7 @@ TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultUnable) {
}
TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultUnknown) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
session_.SetTokenForTests("1234");
bool introduction_received = false;
@@ -1089,7 +1089,7 @@ TEST_F(IncomingShareSessionTest, ProcessKeyVerificationResultUnknown) {
}
TEST_F(IncomingShareSessionTest, TryUpgradeBandwidthNotNeeded) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
EXPECT_THAT(session_.TryUpgradeBandwidth(), IsFalse());
EXPECT_THAT(connections_manager_.DidUpgradeBandwidth(kEndpointId), IsFalse());
@@ -1119,7 +1119,7 @@ TEST_F(IncomingShareSessionTest, TryUpgradeBandwidthNeeded) {
}
)pb",
&introduction_frame));
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
EXPECT_THAT(session_.ProcessIntroduction(introduction_frame),
Eq(std::nullopt));
@@ -1135,7 +1135,7 @@ TEST_F(IncomingShareSessionTest, SendFailureResponseNotConnected) {
}
TEST_F(IncomingShareSessionTest, SendFailureResponseConnected) {
session_.OnConnected(absl::Now(), &connection_);
session_.OnConnected(&connection_);
EXPECT_CALL(transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kNotEnoughSpace)));
+39 -135
View File
@@ -111,8 +111,6 @@ namespace nearby::sharing {
namespace {
using BlockedVendorId = ::nearby::sharing::Advertisement::BlockedVendorId;
using ::location::nearby::proto::sharing::AttachmentTransmissionStatus;
using ::location::nearby::proto::sharing::EstablishConnectionStatus;
using ::location::nearby::proto::sharing::OSType;
using ::location::nearby::proto::sharing::ResponseToIntroduction;
using ::location::nearby::proto::sharing::SessionStatus;
@@ -772,18 +770,9 @@ void NearbySharingServiceImpl::SendAttachments(
return;
}
session->SetAttachmentContainer(std::move(*attachment_container));
session->InitiateSendAttachments(std::move(attachment_container));
app_info_->SetActiveFlag();
// Set session ID.
session->set_session_id(analytics_recorder_.GenerateNextId());
// Log analytics event of sending start.
analytics_recorder_.NewSendStart(
session->session_id(),
/*transfer_position=*/GetConnectedShareTargetPos(),
/*concurrent_connections=*/GetConnectedShareTargetCount(),
session->share_target());
OnTransferStarted(/*is_incoming=*/false);
is_connecting_ = true;
@@ -1066,7 +1055,7 @@ void NearbySharingServiceImpl::OnIncomingConnection(
IncomingShareSession& session = CreateIncomingShareSession(
placeholder_share_target, endpoint_id, /*certificate=*/std::nullopt);
session.set_session_id(analytics_recorder_.GenerateNextId());
session.OnConnected(context_->GetClock()->Now(), connection);
session.OnConnected(connection);
connection->SetDisconnectionListener([this, placeholder_share_target_id]() {
OnConnectionDisconnected(placeholder_share_target_id);
});
@@ -2441,39 +2430,35 @@ void NearbySharingServiceImpl::OnTransferStarted(bool is_incoming) {
}
void NearbySharingServiceImpl::OnOutgoingConnection(
absl::Time connect_start_time, NearbyConnection* connection,
OutgoingShareSession& session) {
int64_t share_target_id = session.share_target().id;
if (!session.OnConnected(connect_start_time, connection)) {
session.Abort(session.disconnect_status());
int64_t share_target_id, NearbyConnection* connection, Status status) {
OutgoingShareSession* session =
GetOutgoingShareSession(share_target_id);
if (session == nullptr) {
LOG(WARNING) << "Nearby connection connected, but share target "
<< share_target_id << " already disconnected.";
if (connection != nullptr) {
connection->Close();
}
return;
}
connection->SetDisconnectionListener(
[this, share_target_id]() { OnConnectionDisconnected(share_target_id); });
// Log analytics event of establishing connection.
analytics_recorder_.NewEstablishConnection(
session.session_id(),
EstablishConnectionStatus::CONNECTION_STATUS_SUCCESS,
session.share_target(),
/*transfer_position=*/GetConnectedShareTargetPos(),
/*concurrent_connections=*/GetConnectedShareTargetCount(),
absl::ToInt64Milliseconds(
(context_->GetClock()->Now() - connect_start_time)),
/*referrer_package=*/std::nullopt);
session.RunPairedKeyVerification(
ToProtoOsType(device_info_.GetOsType()),
{
.visibility = settings_->GetVisibility(),
.last_visibility = settings_->GetLastVisibility(),
.last_visibility_time = settings_->GetLastVisibilityTimestamp(),
},
GetCertificateManager(),
absl::bind_front(
&NearbySharingServiceImpl::OnOutgoingConnectionKeyVerificationDone,
this, share_target_id));
if (connection != nullptr) {
connection->SetDisconnectionListener([this, share_target_id]() {
OnConnectionDisconnected(share_target_id);
});
}
if (session->OnConnectResult(connection, status)) {
session->RunPairedKeyVerification(
ToProtoOsType(device_info_.GetOsType()),
{
.visibility = settings_->GetVisibility(),
.last_visibility = settings_->GetLastVisibility(),
.last_visibility_time = settings_->GetLastVisibilityTimestamp(),
},
GetCertificateManager(),
absl::bind_front(
&NearbySharingServiceImpl::OnOutgoingConnectionKeyVerificationDone,
this, share_target_id));
}
}
void NearbySharingServiceImpl::CreatePayloads(
@@ -2534,42 +2519,13 @@ void NearbySharingServiceImpl::OnCreatePayloads(
all_cancelled_share_target_ids_.clear();
int64_t share_target_id = session.share_target().id;
absl::Time connection_start_time = context_->GetClock()->Now();
// TODO(b/343281329): do not request wifi hotspot medium if
// disable_wifi_hotspot option has been requested and device is currently
// connected to Wifi.
nearby_connections_manager_->Connect(
std::move(endpoint_info), session.endpoint_id(),
std::move(bluetooth_mac_address), settings_->GetDataUsage(),
GetTransportType(session.attachment_container()),
[this, connection_start_time, share_target_id](
NearbyConnection* connection, Status status) {
OutgoingShareSession* session =
GetOutgoingShareSession(share_target_id);
if (session == nullptr) {
NL_LOG(WARNING) << __func__
<< "Nearby connection connected, but share target "
<< share_target_id << " already disconnected.";
return;
}
// Log analytics event of new connection.
session->set_connection_layer_status(status);
if (connection == nullptr) {
analytics_recorder_.NewEstablishConnection(
session->session_id(),
EstablishConnectionStatus::CONNECTION_STATUS_FAILURE,
session->share_target(),
/*transfer_position=*/
GetConnectedShareTargetPos(),
/*concurrent_connections=*/GetConnectedShareTargetCount(),
absl::ToInt64Milliseconds(context_->GetClock()->Now() -
connection_start_time),
std::nullopt);
}
OnOutgoingConnection(connection_start_time, connection, *session);
});
session.Connect(
std::move(endpoint_info), std::move(bluetooth_mac_address),
settings_->GetDataUsage(),
GetDisableWifiHotspotState(),
absl::bind_front(&NearbySharingServiceImpl::OnOutgoingConnection, this,
share_target_id));
}
void NearbySharingServiceImpl::Fail(IncomingShareSession& session,
@@ -2646,11 +2602,10 @@ void NearbySharingServiceImpl::OnIncomingTransferUpdate(
int64_t received_bytes =
session.attachment_container().GetTotalAttachmentsSize() *
metadata.progress() / 100;
AttachmentTransmissionStatus transmission_status =
ConvertToTransmissionStatus(metadata.status());
analytics_recorder_.NewReceiveAttachmentsEnd(
session.session_id(), received_bytes, transmission_status,
session.session_id(), received_bytes,
ShareSession::ConvertToTransmissionStatus(metadata.status()),
/* referrer_package=*/std::nullopt);
OnTransferComplete();
@@ -2691,26 +2646,7 @@ void NearbySharingServiceImpl::OnOutgoingTransferUpdate(
}
if (metadata.is_final_status()) {
// Log analytics event of sending attachment end.
int64_t sent_bytes =
session.attachment_container().GetTotalAttachmentsSize() *
metadata.progress() / 100;
AttachmentTransmissionStatus transmission_status =
ConvertToTransmissionStatus(metadata.status());
analytics_recorder_.NewSendAttachmentsEnd(
session.session_id(), sent_bytes, session.share_target(),
transmission_status,
/*transfer_position=*/GetConnectedShareTargetPos(),
/*concurrent_connections=*/GetConnectedShareTargetCount(),
/*duration_millis=*/
session.connection_start_time().has_value()
? absl::ToInt64Milliseconds(context_->GetClock()->Now() -
*(session.connection_start_time()))
: 0,
/*referrer_package=*/std::nullopt,
ConvertToConnectionLayerStatus(session.connection_layer_status()),
session.os_type());
session.SendAttachmentsCompleted(metadata);
is_connecting_ = false;
OnTransferComplete();
} else if (metadata.status() ==
@@ -2807,7 +2743,7 @@ void NearbySharingServiceImpl::OnIncomingDecryptedCertificate(
*share_target, endpoint_id, std::move(certificate));
// Copy session id from placeholder session to actual session.
session.set_session_id(session_id);
session.OnConnected(context_->GetClock()->Now(), connection);
session.OnConnected(connection);
// Need to rebind the disconnect listener to the new share target id.
connection->SetDisconnectionListener(
[this, share_target_id]() { OnConnectionDisconnected(share_target_id); });
@@ -3474,7 +3410,6 @@ void NearbySharingServiceImpl::CreateOutgoingShareSession(
"should NOT happen";
} else {
auto& session = it_out->second;
session.set_connection_layer_status(Status::kUnknown);
if (certificate.has_value()) {
session.set_certificate(std::move(*certificate));
}
@@ -3814,43 +3749,12 @@ void NearbySharingServiceImpl::RunOnAnyThread(absl::string_view task_name,
});
}
int NearbySharingServiceImpl::GetConnectedShareTargetPos() {
// Returns 1 before group sharing is enabled.
return 1;
}
int NearbySharingServiceImpl::GetConnectedShareTargetCount() {
// Returns 1 before group sharing is enabled.
return 1;
}
::location::nearby::proto::sharing::SharingUseCase
NearbySharingServiceImpl::GetSenderUseCase() {
// Returns unknown before group sharing is enabled.
return ::location::nearby::proto::sharing::SharingUseCase::USE_CASE_UNKNOWN;
}
TransportType NearbySharingServiceImpl::GetTransportType(
const AttachmentContainer& container) const {
if (container.GetTotalAttachmentsSize() >
kAttachmentsSizeThresholdOverHighQualityMedium) {
if (GetDisableWifiHotspotState()) {
LOG(INFO) << "Transport type is kHighQuality|kNonDisruptive";
return TransportType::kHighQualityNonDisruptive;
}
LOG(INFO) << "Transport type is kHighQuality";
return TransportType::kHighQuality;
}
if (container.GetFileAttachments().empty()) {
LOG(INFO) << "Transport type is kNonDisruptive";
return TransportType::kNonDisruptive;
}
NL_LOG(INFO) << __func__ << ": Transport type is kAny";
return TransportType::kAny;
}
void NearbySharingServiceImpl::UpdateFilePathsInProgress(
bool update_file_paths) {
update_file_paths_in_progress_ = update_file_paths;
+6 -16
View File
@@ -311,9 +311,8 @@ class NearbySharingServiceImpl
void OnTransferComplete();
void OnTransferStarted(bool is_incoming);
void OnOutgoingConnection(absl::Time connect_start_time,
NearbyConnection* connection,
OutgoingShareSession& session);
void OnOutgoingConnection(int64_t share_target_id,
NearbyConnection* connection, Status status);
void CreatePayloads(
OutgoingShareSession& session,
@@ -363,10 +362,10 @@ class NearbySharingServiceImpl
const std::optional<NearbyShareDecryptedPublicCertificate>& certificate,
bool is_incoming);
void IncomingPayloadTransferUpdate(
int64_t share_target_id, TransferMetadata metadata);
void OutgoingPayloadTransferUpdate(
int64_t share_target_id, TransferMetadata metadata);
void IncomingPayloadTransferUpdate(int64_t share_target_id,
TransferMetadata metadata);
void OutgoingPayloadTransferUpdate(int64_t share_target_id,
TransferMetadata metadata);
void RemoveIncomingPayloads(const IncomingShareSession& session);
@@ -453,18 +452,9 @@ class NearbySharingServiceImpl
void RunOnAnyThread(absl::string_view task_name,
absl::AnyInvocable<void()> task);
// Returns a 1-based position.It is used by group share feature.
int GetConnectedShareTargetPos();
// Returns the share target count. It is used by group share feature.
int GetConnectedShareTargetCount();
// Returns use case of sender. It is used by group share feature.
::location::nearby::proto::sharing::SharingUseCase GetSenderUseCase();
// Calculates transport type based on attachment size.
TransportType GetTransportType(const AttachmentContainer& container) const;
// Update file path for the file attachment.
void UpdateFilePath(AttachmentContainer& container);
// Returns true if Shutdown() has been called.
+2 -90
View File
@@ -33,16 +33,9 @@
#include "sharing/common/nearby_share_enums.h"
#include "sharing/internal/base/encode.h"
#include "sharing/internal/public/logging.h"
#include "sharing/nearby_connections_types.h"
#include "sharing/nearby_sharing_service.h"
#include "sharing/transfer_metadata.h"
namespace nearby {
namespace sharing {
namespace {
using ::location::nearby::proto::sharing::AttachmentTransmissionStatus;
using ::location::nearby::proto::sharing::ConnectionLayerStatus;
} // namespace
namespace nearby::sharing {
std::string ReceiveSurfaceStateToString(
NearbySharingService::ReceiveSurfaceState state) {
@@ -156,85 +149,4 @@ bool IsOutOfStorage(DeviceInfo& device_info, std::filesystem::path file_path,
return *available_storage <= storage_required;
}
AttachmentTransmissionStatus ConvertToTransmissionStatus(
TransferMetadata::Status status) {
switch (status) {
case TransferMetadata::Status::kComplete:
return AttachmentTransmissionStatus::
COMPLETE_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kCancelled:
return AttachmentTransmissionStatus::
CANCELED_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kFailed:
return AttachmentTransmissionStatus::
FAILED_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kIncompletePayloads:
return AttachmentTransmissionStatus::FAILED_NO_PAYLOAD;
case TransferMetadata::Status::kMediaUnavailable:
return AttachmentTransmissionStatus::MEDIA_UNAVAILABLE_ATTACHMENT;
case TransferMetadata::Status::kDeviceAuthenticationFailed:
return AttachmentTransmissionStatus::FAILED_PAIRED_KEYHANDSHAKE;
case TransferMetadata::Status::kRejected:
return AttachmentTransmissionStatus::REJECTED_ATTACHMENT;
case TransferMetadata::Status::kTimedOut:
return AttachmentTransmissionStatus::TIMED_OUT_ATTACHMENT;
case TransferMetadata::Status::kUnsupportedAttachmentType:
return AttachmentTransmissionStatus::
UNSUPPORTED_ATTACHMENT_TYPE_ATTACHMENT;
default:
return AttachmentTransmissionStatus::
UNKNOWN_ATTACHMENT_TRANSMISSION_STATUS;
}
}
ConnectionLayerStatus ConvertToConnectionLayerStatus(Status status) {
switch (status) {
case Status::kUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_UNKNOWN;
case Status::kSuccess:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_SUCCESS;
case Status::kError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ERROR;
case Status::kOutOfOrderApiCall:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_OUT_OF_ORDER_API_CALL;
case Status::kAlreadyHaveActiveStrategy:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_ALREADY_HAVE_ACTIVE_STRATEGY;
case Status::kAlreadyAdvertising:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_ADVERTISING;
case Status::kAlreadyDiscovering:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_DISCOVERING;
case Status::kAlreadyListening:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_LISTENING;
case Status::kEndpointIOError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_END_POINT_IO_ERROR;
case Status::kEndpointUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_END_POINT_UNKNOWN;
case Status::kConnectionRejected:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_CONNECTION_REJECTED;
case Status::kAlreadyConnectedToEndpoint:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_ALREADY_CONNECTED_TO_END_POINT;
case Status::kNotConnectedToEndpoint:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_NOT_CONNECTED_TO_END_POINT;
case Status::kBluetoothError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_BLUETOOTH_ERROR;
case Status::kBleError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_BLE_ERROR;
case Status::kWifiLanError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_WIFI_LAN_ERROR;
case Status::kPayloadUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_PAYLOAD_UNKNOWN;
case Status::kReset:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_RESET;
case Status::kTimeout:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_TIMEOUT;
default:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_UNKNOWN;
}
}
} // namespace sharing
} // namespace nearby
} // namespace nearby::sharing
+2 -12
View File
@@ -27,12 +27,9 @@
#include "sharing/advertisement.h"
#include "sharing/certificates/nearby_share_decrypted_public_certificate.h"
#include "sharing/common/nearby_share_enums.h"
#include "sharing/nearby_connections_types.h"
#include "sharing/nearby_sharing_service.h"
#include "sharing/transfer_metadata.h"
namespace nearby {
namespace sharing {
namespace nearby::sharing {
// Checks whether having enough disk space for required storage.
//
@@ -67,13 +64,6 @@ std::string GetDeviceId(
absl::string_view endpoint_id,
const std::optional<NearbyShareDecryptedPublicCertificate>& certificate);
::location::nearby::proto::sharing::AttachmentTransmissionStatus
ConvertToTransmissionStatus(TransferMetadata::Status status);
::location::nearby::proto::sharing::ConnectionLayerStatus
ConvertToConnectionLayerStatus(Status status);
} // namespace sharing
} // namespace nearby
} // namespace nearby::sharing
#endif // THIRD_PARTY_NEARBY_SHARING_NEARBY_SHARING_UTIL_H_
+181 -50
View File
@@ -25,6 +25,7 @@
#include <vector>
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "internal/platform/clock.h"
#include "internal/platform/task_runner.h"
#include "sharing/analytics/analytics_recorder.h"
@@ -48,12 +49,67 @@
#include "sharing/wifi_credentials_attachment.h"
namespace nearby::sharing {
namespace {
using ::location::nearby::proto::sharing::ConnectionLayerStatus;
using ::location::nearby::proto::sharing::EstablishConnectionStatus;
using ::nearby::sharing::proto::DataUsage;
using ::nearby::sharing::service::proto::ConnectionResponseFrame;
using ::nearby::sharing::service::proto::Frame;
using ::nearby::sharing::service::proto::IntroductionFrame;
using ::nearby::sharing::service::proto::V1Frame;
ConnectionLayerStatus ConvertToConnectionLayerStatus(Status status) {
switch (status) {
case Status::kUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_UNKNOWN;
case Status::kSuccess:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_SUCCESS;
case Status::kError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ERROR;
case Status::kOutOfOrderApiCall:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_OUT_OF_ORDER_API_CALL;
case Status::kAlreadyHaveActiveStrategy:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_ALREADY_HAVE_ACTIVE_STRATEGY;
case Status::kAlreadyAdvertising:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_ADVERTISING;
case Status::kAlreadyDiscovering:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_DISCOVERING;
case Status::kAlreadyListening:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_ALREADY_LISTENING;
case Status::kEndpointIOError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_END_POINT_IO_ERROR;
case Status::kEndpointUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_END_POINT_UNKNOWN;
case Status::kConnectionRejected:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_CONNECTION_REJECTED;
case Status::kAlreadyConnectedToEndpoint:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_ALREADY_CONNECTED_TO_END_POINT;
case Status::kNotConnectedToEndpoint:
return ConnectionLayerStatus::
CONNECTION_LAYER_STATUS_NOT_CONNECTED_TO_END_POINT;
case Status::kBluetoothError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_BLUETOOTH_ERROR;
case Status::kBleError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_BLE_ERROR;
case Status::kWifiLanError:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_WIFI_LAN_ERROR;
case Status::kPayloadUnknown:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_PAYLOAD_UNKNOWN;
case Status::kReset:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_RESET;
case Status::kTimeout:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_TIMEOUT;
default:
return ConnectionLayerStatus::CONNECTION_LAYER_STATUS_UNKNOWN;
}
}
} // namespace
OutgoingShareSession::OutgoingShareSession(
Clock* clock, TaskRunner& service_thread,
NearbyConnectionsManager* connections_manager,
@@ -74,29 +130,27 @@ void OutgoingShareSession::InvokeTransferUpdateCallback(
transfer_update_callback_(*this, metadata);
}
void OutgoingShareSession::InitiateSendAttachments(
std::unique_ptr<AttachmentContainer> attachment_container) {
SetAttachmentContainer(std::move(*attachment_container));
// Set session ID.
set_session_id(analytics_recorder().GenerateNextId());
// Log analytics event of sending start.
analytics_recorder().NewSendStart(
session_id(),
/*transfer_position=*/1,
/*concurrent_connections=*/1,
share_target());
}
bool OutgoingShareSession::ProcessKeyVerificationResult(
PairedKeyVerificationRunner::PairedKeyVerificationResult result,
location::nearby::proto::sharing::OSType share_target_os_type) {
return HandleKeyVerificationResult(result, share_target_os_type);
}
bool OutgoingShareSession::OnNewConnection(NearbyConnection* connection) {
if (!connection) {
NL_LOG(WARNING) << __func__
<< ": Failed to initiate connection to share target "
<< share_target().id;
if (connection_layer_status_ == Status::kTimeout) {
set_disconnect_status(TransferMetadata::Status::kTimedOut);
connection_layer_status_ = Status::kUnknown;
} else {
set_disconnect_status(TransferMetadata::Status::kFailed);
}
return false;
}
set_disconnect_status(TransferMetadata::Status::kFailed);
return true;
}
void OutgoingShareSession::OnConnectionDisconnected() {
if (pending_complete_metadata_.has_value()) {
UpdateTransferMetadata(*pending_complete_metadata_);
@@ -240,12 +294,11 @@ bool OutgoingShareSession::AcceptTransfer(
std::function<void(std::optional<ConnectionResponseFrame>)>
response_callback) {
if (!IsConnected()) {
NL_LOG(WARNING) << __func__
<< ": Accept invoked for unconnected share target";
LOG(WARNING) << "Accept invoked for unconnected share target";
return false;
}
if (!ready_for_accept_) {
NL_LOG(WARNING) << __func__ << ": out of order API call.";
LOG(WARNING) << "out of order API call.";
return false;
}
ready_for_accept_ = false;
@@ -255,8 +308,7 @@ bool OutgoingShareSession::AcceptTransfer(
.set_token(token())
.set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance)
.build());
NL_VLOG(1) << __func__ << ": Waiting for response frame from "
<< share_target().id;
VLOG(1) << "Waiting for response frame from " << share_target().id;
frames_reader()->ReadFrame(
nearby::sharing::service::proto::V1Frame::RESPONSE,
[callback = std::move(response_callback)](std::optional<V1Frame> frame) {
@@ -277,8 +329,7 @@ void OutgoingShareSession::SendPayloads(
frame_read_callback,
std::function<void(int64_t, TransferMetadata)> update_callback) {
if (!IsConnected()) {
NL_LOG(WARNING) << __func__
<< ": SendPayloads invoked for unconnected share target";
LOG(WARNING) << "SendPayloads invoked for unconnected share target";
return;
}
frames_reader()->ReadFrame(std::move(frame_read_callback));
@@ -288,8 +339,7 @@ void OutgoingShareSession::SendPayloads(
attachment_container(),
/*transfer_position=*/1,
/*concurrent_connections=*/1);
NL_VLOG(1) << __func__
<< ": The connection was accepted. Payloads are now being sent.";
VLOG(1) << "The connection was accepted. Payloads are now being sent.";
if (enable_transfer_cancellation_optimization) {
InitSendPayload(std::move(update_callback));
SendNextPayload();
@@ -327,14 +377,33 @@ void OutgoingShareSession::InitSendPayload(
void OutgoingShareSession::SendNextPayload() {
std::optional<Payload> payload = ExtractNextPayload();
if (payload.has_value()) {
NL_LOG(INFO) << __func__ << ": Send payload " << payload->id;
LOG(INFO) << "Send payload " << payload->id;
connections_manager().Send(
endpoint_id(), std::make_unique<Payload>(*payload), payload_tracker());
} else {
NL_LOG(WARNING) << __func__ << ": There is no paylaods to send.";
LOG(WARNING) << "There is no paylaods to send.";
}
}
void OutgoingShareSession::SendAttachmentsCompleted(
const TransferMetadata& metadata) {
if (!metadata.is_final_status()) {
LOG(DFATAL) << "SendAttachmentsCompleted called with non-final status: "
<< static_cast<int>(metadata.status());
}
int64_t sent_bytes = attachment_container().GetTotalAttachmentsSize() *
metadata.progress() / 100;
analytics_recorder().NewSendAttachmentsEnd(
session_id(), sent_bytes, share_target(),
ConvertToTransmissionStatus(metadata.status()),
/*transfer_position=*/1,
/*concurrent_connections=*/1,
absl::ToInt64Milliseconds(clock().Now() - connection_start_time_),
/*referrer_package=*/std::nullopt,
ConvertToConnectionLayerStatus(connection_layer_status_), os_type());
}
bool OutgoingShareSession::SendIntroduction(
std::function<void()> timeout_callback) {
Frame frame;
@@ -352,7 +421,7 @@ bool OutgoingShareSession::SendIntroduction(
/*transfer_position=*/1,
/*concurrent_connections=*/1,
os_type());
NL_VLOG(1) << __func__ << ": Successfully wrote the introduction frame";
VLOG(1) << "Successfully wrote the introduction frame";
ready_for_accept_ = true;
mutual_acceptance_timeout_ = std::make_unique<ThreadTimer>(
service_thread(), "outgoing_mutual_acceptance_timeout",
@@ -367,14 +436,12 @@ OutgoingShareSession::HandleConnectionResponse(
mutual_acceptance_timeout_.reset();
if (!response.has_value()) {
NL_LOG(WARNING)
<< __func__
<< ": Failed to read a response from the remote device. Disconnecting.";
LOG(WARNING)
<< "Failed to read a response from the remote device. Disconnecting.";
return TransferMetadata::Status::kFailed;
}
NL_VLOG(1) << __func__
<< ": Successfully read the connection response frame.";
VLOG(1) << "Successfully read the connection response frame.";
switch (response->status()) {
case ConnectionResponseFrame::ACCEPT: {
@@ -385,30 +452,25 @@ OutgoingShareSession::HandleConnectionResponse(
return std::nullopt;
}
case ConnectionResponseFrame::REJECT:
NL_VLOG(1)
<< __func__
<< ": The connection was rejected. The connection has been closed.";
VLOG(1)
<< "The connection was rejected. The connection has been closed.";
return TransferMetadata::Status::kRejected;
case ConnectionResponseFrame::NOT_ENOUGH_SPACE:
NL_VLOG(1) << __func__
<< ": The connection was rejected because the remote device "
"does not have enough space for our attachments. The "
"connection has been closed.";
VLOG(1) << "The connection was rejected because the remote device does "
"not have enough space for our attachments. The connection "
"has been closed.";
return TransferMetadata::Status::kNotEnoughSpace;
case ConnectionResponseFrame::UNSUPPORTED_ATTACHMENT_TYPE:
NL_VLOG(1) << __func__
<< ": The connection was rejected because the remote device "
"does not support the attachments we were sending. The "
"connection has been closed.";
VLOG(1) << "The connection was rejected because the remote device does "
"not support the attachments we were sending. The connection "
"has been closed.";
return TransferMetadata::Status::kUnsupportedAttachmentType;
case ConnectionResponseFrame::TIMED_OUT:
NL_VLOG(1) << __func__
<< ": The connection was rejected because the remote device "
"timed out. The connection has been closed.";
VLOG(1) << "The connection was rejected because the remote device timed "
"out. The connection has been closed.";
return TransferMetadata::Status::kTimedOut;
default:
NL_VLOG(1) << __func__
<< ": The connection failed. The connection has been closed.";
VLOG(1) << "The connection failed. The connection has been closed.";
break;
}
return TransferMetadata::Status::kFailed;
@@ -480,4 +542,73 @@ void OutgoingShareSession::UpdateSessionForDedup(
clear_certificate();
}
}
void OutgoingShareSession::Connect(
std::vector<uint8_t> endpoint_info,
std::optional<std::vector<uint8_t>> bluetooth_mac_address,
DataUsage data_usage, bool disable_wifi_hotspot,
std::function<void(NearbyConnection* connection, Status status)> callback) {
connection_start_time_ = clock().Now();
connections_manager().Connect(
std::move(endpoint_info), endpoint_id(), std::move(bluetooth_mac_address),
data_usage, GetTransportType(disable_wifi_hotspot), std::move(callback));
}
bool OutgoingShareSession::OnConnectResult(NearbyConnection* connection,
Status status) {
connection_layer_status_ = status;
if (connection == nullptr) {
analytics_recorder().NewEstablishConnection(
session_id(), EstablishConnectionStatus::CONNECTION_STATUS_FAILURE,
share_target(),
/*transfer_position=*/1,
/*concurrent_connections=*/1,
absl::ToInt64Milliseconds(clock().Now() - connection_start_time_),
std::nullopt);
LOG(WARNING) << "Failed to initiate connection to share target "
<< share_target().id;
if (connection_layer_status_ == Status::kTimeout) {
set_disconnect_status(TransferMetadata::Status::kTimedOut);
connection_layer_status_ = Status::kUnknown;
} else {
set_disconnect_status(TransferMetadata::Status::kFailed);
}
Abort(disconnect_status());
return false;
}
set_disconnect_status(TransferMetadata::Status::kFailed);
SetConnection(connection);
// Log analytics event of establishing connection.
analytics_recorder().NewEstablishConnection(
session_id(), EstablishConnectionStatus::CONNECTION_STATUS_SUCCESS,
share_target(),
/*transfer_position=*/1,
/*concurrent_connections=*/1,
absl::ToInt64Milliseconds((clock().Now() - connection_start_time_)),
/*referrer_package=*/std::nullopt);
return true;
}
TransportType OutgoingShareSession::GetTransportType(
bool disable_wifi_hotspot) const {
if (attachment_container().GetTotalAttachmentsSize() >
kAttachmentsSizeThresholdOverHighQualityMedium) {
if (disable_wifi_hotspot) {
LOG(INFO) << "Transport type is kHighQuality|kNonDisruptive";
return TransportType::kHighQualityNonDisruptive;
}
LOG(INFO) << "Transport type is kHighQuality";
return TransportType::kHighQuality;
}
if (attachment_container().GetFileAttachments().empty()) {
LOG(INFO) << "Transport type is kNonDisruptive";
return TransportType::kNonDisruptive;
}
LOG(INFO) << "Transport type is kAny";
return TransportType::kAny;
}
} // namespace nearby::sharing
+26 -7
View File
@@ -25,15 +25,18 @@
#include <vector>
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "internal/platform/clock.h"
#include "internal/platform/task_runner.h"
#include "sharing/analytics/analytics_recorder.h"
#include "sharing/attachment_container.h"
#include "sharing/certificates/nearby_share_decrypted_public_certificate.h"
#include "sharing/nearby_connection.h"
#include "sharing/nearby_connections_manager.h"
#include "sharing/nearby_connections_types.h"
#include "sharing/nearby_file_handler.h"
#include "sharing/paired_key_verification_runner.h"
#include "sharing/proto/enums.pb.h"
#include "sharing/share_session.h"
#include "sharing/share_target.h"
#include "sharing/thread_timer.h"
@@ -73,11 +76,8 @@ class OutgoingShareSession : public ShareSession {
const std::vector<Payload>& file_payloads() const { return file_payloads_; }
Status connection_layer_status() const { return connection_layer_status_; }
void set_connection_layer_status(Status status) {
connection_layer_status_ = status;
}
void InitiateSendAttachments(
std::unique_ptr<AttachmentContainer> attachment_container);
bool ProcessKeyVerificationResult(
PairedKeyVerificationRunner::PairedKeyVerificationResult result,
@@ -128,6 +128,9 @@ class OutgoingShareSession : public ShareSession {
// Used only if enable_transfer_cancellation_optimization is true.
void SendNextPayload();
// Called when all payloads have been sent.
void SendAttachmentsCompleted(const TransferMetadata& metadata);
// Cache the kComplete metadata in pending_complete_metadata_ and forward a
// modified copy that changes kComplete into kInProgress.
void DelayCompleteMetadata(const TransferMetadata& complete_metadata);
@@ -139,12 +142,27 @@ class OutgoingShareSession : public ShareSession {
std::optional<NearbyShareDecryptedPublicCertificate> certificate,
absl::string_view endpoint_id);
// Establish a connection to the remote device identified by `endpoint_info`.
// `callback` is called when with the connection establishment status..
void Connect(std::vector<uint8_t> endpoint_info,
std::optional<std::vector<uint8_t>> bluetooth_mac_address,
nearby::sharing::proto::DataUsage data_usage,
bool disable_wifi_hotspot,
std::function<void(NearbyConnection* connection, Status status)>
callback);
// Called to process the result of a connection attempt.
// Returns true if the connection was successful.
bool OnConnectResult(NearbyConnection* connection, Status status);
protected:
void InvokeTransferUpdateCallback(const TransferMetadata& metadata) override;
bool OnNewConnection(NearbyConnection* connection) override;
void OnConnectionDisconnected() override;
private:
// Calculates transport type based on attachment size.
TransportType GetTransportType(bool disable_wifi_hotspot) const;
// Create a payload status listener to send status change to
// `update_callback`. Send all payloads to NearbyConnectionManager.
void SendAllPayloads(
@@ -167,7 +185,7 @@ class OutgoingShareSession : public ShareSession {
std::vector<Payload> text_payloads_;
std::vector<Payload> file_payloads_;
std::vector<Payload> wifi_credentials_payloads_;
Status connection_layer_status_;
Status connection_layer_status_ = Status::kUnknown;
std::function<void(OutgoingShareSession&, const TransferMetadata&)>
transfer_update_callback_;
bool ready_for_accept_ = false;
@@ -175,6 +193,7 @@ class OutgoingShareSession : public ShareSession {
// not press accept within the timeout.
std::unique_ptr<ThreadTimer> mutual_acceptance_timeout_;
std::optional<TransferMetadata> pending_complete_metadata_;
absl::Time connection_start_time_;
};
} // namespace nearby::sharing
+173 -32
View File
@@ -25,7 +25,6 @@
#include "protobuf-matchers/protocol-buffer-matchers.h"
#include "gtest/gtest.h"
#include "absl/strings/string_view.h"
#include "absl/time/clock.h"
#include "absl/time/time.h"
#include "internal/analytics/mock_event_logger.h"
#include "internal/analytics/sharing_log_matchers.h"
@@ -53,12 +52,15 @@
namespace nearby::sharing {
namespace {
using ::location::nearby::proto::sharing::EstablishConnectionStatus;
using ::location::nearby::proto::sharing::EventCategory;
using ::location::nearby::proto::sharing::EventType;
using ::location::nearby::proto::sharing::OSType;
using ::nearby::analytics::HasCategory;
using ::nearby::analytics::HasDurationMillis;
using ::nearby::analytics::HasEventType;
using ::nearby::analytics::HasSessionId;
using ::nearby::analytics::SharingLogHasStatus;
using ::nearby::sharing::analytics::proto::SharingLog;
using ::nearby::sharing::service::proto::ConnectionResponseFrame;
using ::nearby::sharing::service::proto::Frame;
@@ -96,11 +98,32 @@ class OutgoingShareSessionTest : public ::testing::Test {
"GoogleGuest",
nearby::sharing::service::proto::WifiCredentialsMetadata::WPA_PSK,
"somepassword", /*is_hidden=*/true) {
AttachmentContainer container(
}
std::unique_ptr<AttachmentContainer> CreateDefaultAttachmentContainer() {
return std::make_unique<AttachmentContainer>(
std::vector<TextAttachment>{text1_, text2_},
std::vector<FileAttachment>{file1_},
std::vector<WifiCredentialsAttachment>{wifi1_});
session_.SetAttachmentContainer(std::move(container));
}
void InitSendAttachments(
std::unique_ptr<AttachmentContainer> attachment_container) {
EXPECT_CALL(
mock_event_logger_,
Log(Matcher<const SharingLog&>(AllOf((
HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::SEND_START))))));
session_.InitiateSendAttachments(std::move(attachment_container));
}
void ConnectionSuccess(FakeNearbyConnection* connection) {
EXPECT_CALL(mock_event_logger_,
Log(Matcher<const SharingLog&>(
AllOf((HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::ESTABLISH_CONNECTION))))));
EXPECT_THAT(session_.OnConnectResult(connection, Status::kSuccess),
IsTrue());
}
protected:
@@ -126,10 +149,11 @@ TEST_F(OutgoingShareSessionTest, GetFilePaths) {
&fake_clock_, fake_task_runner_, &connections_manager_,
analytics_recorder_, std::string(kEndpointId), share_target_,
[](OutgoingShareSession&, const TransferMetadata&) {});
AttachmentContainer container(std::vector<TextAttachment>{},
std::vector<FileAttachment>{file1_, file2_},
std::vector<WifiCredentialsAttachment>{});
session.SetAttachmentContainer(std::move(container));
auto container = std::make_unique<AttachmentContainer>(
std::vector<TextAttachment>{},
std::vector<FileAttachment>{file1_, file2_},
std::vector<WifiCredentialsAttachment>{});
session.InitiateSendAttachments(std::move(container));
auto file_paths = session.GetFilePaths();
@@ -150,6 +174,7 @@ TEST_F(OutgoingShareSessionTest, CreateTextPayloadsWithNoTextAttachments) {
}
TEST_F(OutgoingShareSessionTest, CreateTextPayloads) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.CreateTextPayloads();
const std::vector<Payload>& payloads = session_.text_payloads();
auto& attachment_payload_map = session_.attachment_payload_map();
@@ -186,6 +211,7 @@ TEST_F(OutgoingShareSessionTest, CreateFilePayloadsWithNoFileAttachments) {
}
TEST_F(OutgoingShareSessionTest, CreateFilePayloadsWithWrongFileInfo) {
InitSendAttachments(CreateDefaultAttachmentContainer());
EXPECT_THAT(
session_.CreateFilePayloads(std::vector<NearbyFileHandler::FileInfo>()),
IsFalse());
@@ -195,6 +221,7 @@ TEST_F(OutgoingShareSessionTest, CreateFilePayloadsWithWrongFileInfo) {
}
TEST_F(OutgoingShareSessionTest, CreateFilePayloads) {
InitSendAttachments(CreateDefaultAttachmentContainer());
std::vector<NearbyFileHandler::FileInfo> file_infos;
file_infos.push_back({
.size = 12355L,
@@ -232,6 +259,7 @@ TEST_F(OutgoingShareSessionTest, CreateWifiPayloadsWithNoWifiAttachments) {
}
TEST_F(OutgoingShareSessionTest, CreateWifiCredentialsPayloads) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.CreateWifiCredentialsPayloads();
const std::vector<Payload>& payloads = session_.wifi_credentials_payloads();
auto& attachment_payload_map = session_.attachment_payload_map();
@@ -251,14 +279,117 @@ TEST_F(OutgoingShareSessionTest, CreateWifiCredentialsPayloads) {
EXPECT_THAT(attachment_payload_map.at(wifi1_.id()), Eq(payloads[0].id));
}
TEST_F(OutgoingShareSessionTest, ConnectNoDisableWifiHotspot) {
std::vector<uint8_t> endpoint_info = {1, 2, 3, 4};
std::vector<uint8_t> bluetooth_mac_address = {5, 6, 7, 8};
file1_.set_size(1000000); // 1MB
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.Connect(endpoint_info, bluetooth_mac_address,
nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE,
/*disable_wifi_hotspot=*/false,
[](NearbyConnection* connection, Status status) {});
EXPECT_THAT(connections_manager_.connected_data_usage(),
Eq(nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE));
EXPECT_THAT(connections_manager_.transport_type(),
Eq(TransportType::kHighQuality));
std::optional<std::vector<uint8_t>> actual_endpoint_info =
connections_manager_.connection_endpoint_info(kEndpointId);
ASSERT_THAT(actual_endpoint_info.has_value(), IsTrue());
EXPECT_THAT(actual_endpoint_info.value(), Eq(endpoint_info));
}
TEST_F(OutgoingShareSessionTest, ConnectDisableWifiHotspot) {
std::vector<uint8_t> endpoint_info = {1, 2, 3, 4};
std::vector<uint8_t> bluetooth_mac_address = {5, 6, 7, 8};
file1_.set_size(1000000); // 1MB
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.Connect(endpoint_info, bluetooth_mac_address,
nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE,
/*disable_wifi_hotspot=*/true,
[](NearbyConnection* connection, Status status) {});
EXPECT_THAT(connections_manager_.connected_data_usage(),
Eq(nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE));
EXPECT_THAT(connections_manager_.transport_type(),
Eq(TransportType::kHighQualityNonDisruptive));
std::optional<std::vector<uint8_t>> actual_endpoint_info =
connections_manager_.connection_endpoint_info(kEndpointId);
ASSERT_THAT(actual_endpoint_info.has_value(), IsTrue());
EXPECT_THAT(actual_endpoint_info.value(), Eq(endpoint_info));
}
TEST_F(OutgoingShareSessionTest, OnConnectResultSuccessLogsSessionDuration) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
std::vector<uint8_t> endpoint_info = {1, 2, 3, 4};
std::vector<uint8_t> bluetooth_mac_address = {5, 6, 7, 8};
session_.Connect(endpoint_info, bluetooth_mac_address,
nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE,
/*disable_wifi_hotspot=*/false,
[](NearbyConnection* connection, Status status) {});
fake_clock_.FastForward(absl::Seconds(10));
EXPECT_CALL(
mock_event_logger_,
Log(Matcher<const SharingLog&>(AllOf((
HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::ESTABLISH_CONNECTION),
Property(&SharingLog::establish_connection, HasSessionId(1234)),
Property(&SharingLog::establish_connection, HasDurationMillis(10000)),
Property(
&SharingLog::establish_connection,
SharingLogHasStatus(
EstablishConnectionStatus::CONNECTION_STATUS_SUCCESS)))))));
FakeNearbyConnection connection;
EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess),
IsTrue());
}
TEST_F(OutgoingShareSessionTest, OnConnectResultFailureLogsSessionDuration) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
std::vector<uint8_t> endpoint_info = {1, 2, 3, 4};
std::vector<uint8_t> bluetooth_mac_address = {5, 6, 7, 8};
session_.Connect(endpoint_info, bluetooth_mac_address,
nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE,
/*disable_wifi_hotspot=*/false,
[](NearbyConnection* connection, Status status) {});
fake_clock_.FastForward(absl::Seconds(10));
EXPECT_CALL(
mock_event_logger_,
Log(Matcher<const SharingLog&>(AllOf((
HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::ESTABLISH_CONNECTION),
Property(&SharingLog::establish_connection, HasSessionId(1234)),
Property(&SharingLog::establish_connection, HasDurationMillis(10000)),
Property(
&SharingLog::establish_connection,
SharingLogHasStatus(
EstablishConnectionStatus::CONNECTION_STATUS_FAILURE)))))));
EXPECT_CALL(transfer_metadata_callback_,
Call(_, AllOf(HasStatus(TransferMetadata::Status::kTimedOut),
IsFinalStatus())));
EXPECT_THAT(
session_.OnConnectResult(/*connection=*/nullptr, Status::kTimeout),
IsFalse());
}
TEST_F(OutgoingShareSessionTest, SendIntroductionWithoutPayloads) {
InitSendAttachments(CreateDefaultAttachmentContainer());
EXPECT_THAT(session_.SendIntroduction([]() {}), IsFalse());
}
TEST_F(OutgoingShareSessionTest, SendIntroductionSuccess) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
std::vector<NearbyFileHandler::FileInfo> file_infos;
file_infos.push_back({
.size = 12355L,
@@ -326,11 +457,13 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionSuccess) {
}
TEST_F(OutgoingShareSessionTest, SendIntroductionTimeout) {
AttachmentContainer container(std::vector<TextAttachment>{text1_}, {}, {});
session_.SetAttachmentContainer(std::move(container));
auto container = std::make_unique<AttachmentContainer>(
std::vector<TextAttachment>{text1_}, std::vector<FileAttachment>{},
std::vector<WifiCredentialsAttachment>{});
InitSendAttachments(std::move(container));
session_.set_session_id(1234);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.CreateTextPayloads();
EXPECT_CALL(
mock_event_logger_,
@@ -351,11 +484,13 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionTimeout) {
}
TEST_F(OutgoingShareSessionTest, SendIntroductionTimeoutCancelled) {
AttachmentContainer container(std::vector<TextAttachment>{text1_}, {}, {});
session_.SetAttachmentContainer(std::move(container));
auto container = std::make_unique<AttachmentContainer>(
std::vector<TextAttachment>{text1_}, std::vector<FileAttachment>{},
std::vector<WifiCredentialsAttachment>{});
InitSendAttachments(std::move(container));
session_.set_session_id(1234);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.CreateTextPayloads();
EXPECT_CALL(
mock_event_logger_,
@@ -390,9 +525,8 @@ TEST_F(OutgoingShareSessionTest, AcceptTransferNotConnected) {
}
TEST_F(OutgoingShareSessionTest, AcceptTransferNotReady) {
session_.set_session_id(1234);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
EXPECT_THAT(
session_.AcceptTransfer([](std::optional<ConnectionResponseFrame>) {}),
@@ -400,16 +534,20 @@ TEST_F(OutgoingShareSessionTest, AcceptTransferNotReady) {
}
TEST_F(OutgoingShareSessionTest, AcceptTransferSuccess) {
AttachmentContainer container(std::vector<TextAttachment>{text1_}, {}, {});
session_.SetAttachmentContainer(std::move(container));
auto container = std::make_unique<AttachmentContainer>(
std::vector<TextAttachment>{text1_}, std::vector<FileAttachment>{},
std::vector<WifiCredentialsAttachment>{});
InitSendAttachments(std::move(container));
session_.set_session_id(1234);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.CreateTextPayloads();
EXPECT_CALL(mock_event_logger_,
Log(Matcher<const SharingLog&>(
AllOf((HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::SEND_INTRODUCTION))))));
EXPECT_CALL(
mock_event_logger_,
Log(Matcher<const SharingLog&>(AllOf(
(HasCategory(EventCategory::SENDING_EVENT),
HasEventType(EventType::SEND_INTRODUCTION),
Property(&SharingLog::send_introduction, HasSessionId(1234)))))));
EXPECT_THAT(session_.SendIntroduction([]() {}), IsTrue());
EXPECT_CALL(
transfer_metadata_callback_,
@@ -493,7 +631,7 @@ TEST_F(OutgoingShareSessionTest, HandleConnectionResponseAcceptResponse) {
ConnectionResponseFrame response;
response.set_status(ConnectionResponseFrame::ACCEPT);
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
EXPECT_CALL(transfer_metadata_callback_,
Call(_, HasStatus(TransferMetadata::Status::kInProgress)));
@@ -504,6 +642,7 @@ TEST_F(OutgoingShareSessionTest, HandleConnectionResponseAcceptResponse) {
}
TEST_F(OutgoingShareSessionTest, SendPayloadsDisableCancellationOptimization) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
std::vector<NearbyFileHandler::FileInfo> file_infos;
file_infos.push_back({
@@ -552,7 +691,7 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsDisableCancellationOptimization) {
Property(&SharingLog::send_attachments_start,
HasSessionId(1234)))))));
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.SendPayloads(
/*enable_transfer_cancellation_optimization=*/
@@ -564,6 +703,7 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsDisableCancellationOptimization) {
}
TEST_F(OutgoingShareSessionTest, SendPayloadsEnableCancellationOptimization) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
std::vector<NearbyFileHandler::FileInfo> file_infos;
file_infos.push_back({
@@ -594,7 +734,7 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsEnableCancellationOptimization) {
Property(&SharingLog::send_attachments_start,
HasSessionId(1234)))))));
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.SendPayloads(
/*enable_transfer_cancellation_optimization=*/
@@ -606,6 +746,7 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsEnableCancellationOptimization) {
}
TEST_F(OutgoingShareSessionTest, SendNextPayload) {
InitSendAttachments(CreateDefaultAttachmentContainer());
session_.set_session_id(1234);
std::vector<NearbyFileHandler::FileInfo> file_infos;
file_infos.push_back({
@@ -637,7 +778,7 @@ TEST_F(OutgoingShareSessionTest, SendNextPayload) {
Property(&SharingLog::send_attachments_start,
HasSessionId(1234)))))));
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.SendPayloads(
/*enable_transfer_cancellation_optimization=*/
@@ -674,7 +815,7 @@ TEST_F(OutgoingShareSessionTest, SendNextPayload) {
TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultFail) {
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.SetTokenForTests("1234");
EXPECT_THAT(
@@ -689,7 +830,7 @@ TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultFail) {
TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultSuccess) {
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
session_.SetTokenForTests("1234");
EXPECT_THAT(
@@ -704,7 +845,7 @@ TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultSuccess) {
TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataReceiverDisconnect) {
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
TransferMetadata complete_metadata =
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kComplete)
@@ -721,7 +862,7 @@ TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataReceiverDisconnect) {
TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataDisconnectTimeout) {
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
TransferMetadata complete_metadata =
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kComplete)
@@ -766,7 +907,7 @@ TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupWithoutCertificate) {
TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupConnectedIsNoOp) {
auto share_target_org = session_.share_target();
FakeNearbyConnection connection;
session_.OnConnected(absl::Now(), &connection);
ConnectionSuccess(&connection);
ShareTarget share_target2{
"test_update_name", ::nearby::network::Url(), ShareTargetType::kPhone,
/* is_incoming */ true, "test_update_full_name",
+34 -8
View File
@@ -24,7 +24,6 @@
#include <vector>
#include "absl/strings/str_format.h"
#include "absl/time/time.h"
#include "internal/platform/clock.h"
#include "internal/platform/task_runner.h"
#include "sharing/analytics/analytics_recorder.h"
@@ -43,6 +42,7 @@
namespace nearby::sharing {
namespace {
using ::location::nearby::proto::sharing::AttachmentTransmissionStatus;
using ::location::nearby::proto::sharing::OSType;
using ::nearby::sharing::service::proto::ConnectionResponseFrame;
using ::nearby::sharing::service::proto::Frame;
@@ -67,6 +67,38 @@ std::string TokenToFourDigitString(const std::vector<uint8_t>& bytes) {
} // namespace
/* static */
AttachmentTransmissionStatus ShareSession::ConvertToTransmissionStatus(
TransferMetadata::Status status) {
switch (status) {
case TransferMetadata::Status::kComplete:
return AttachmentTransmissionStatus::
COMPLETE_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kCancelled:
return AttachmentTransmissionStatus::
CANCELED_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kFailed:
return AttachmentTransmissionStatus::
FAILED_ATTACHMENT_TRANSMISSION_STATUS;
case TransferMetadata::Status::kIncompletePayloads:
return AttachmentTransmissionStatus::FAILED_NO_PAYLOAD;
case TransferMetadata::Status::kMediaUnavailable:
return AttachmentTransmissionStatus::MEDIA_UNAVAILABLE_ATTACHMENT;
case TransferMetadata::Status::kDeviceAuthenticationFailed:
return AttachmentTransmissionStatus::FAILED_PAIRED_KEYHANDSHAKE;
case TransferMetadata::Status::kRejected:
return AttachmentTransmissionStatus::REJECTED_ATTACHMENT;
case TransferMetadata::Status::kTimedOut:
return AttachmentTransmissionStatus::TIMED_OUT_ATTACHMENT;
case TransferMetadata::Status::kUnsupportedAttachmentType:
return AttachmentTransmissionStatus::
UNSUPPORTED_ATTACHMENT_TYPE_ATTACHMENT;
default:
return AttachmentTransmissionStatus::
UNKNOWN_ATTACHMENT_TRANSMISSION_STATUS;
}
}
ShareSession::ShareSession(Clock* clock, TaskRunner& service_thread,
NearbyConnectionsManager* connections_manager,
analytics::AnalyticsRecorder& analytics_recorder,
@@ -117,16 +149,10 @@ void ShareSession::set_disconnect_status(
}
}
bool ShareSession::OnConnected(absl::Time connect_start_time,
NearbyConnection* connection) {
if (!OnNewConnection(connection)) {
return false;
}
connection_start_time_ = connect_start_time;
void ShareSession::SetConnection(NearbyConnection* connection) {
connection_ = connection;
frames_reader_ =
std::make_shared<IncomingFramesReader>(service_thread_, connection_);
return true;
}
void ShareSession::Disconnect() {
+7 -15
View File
@@ -21,11 +21,9 @@
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "internal/platform/clock.h"
#include "internal/platform/task_runner.h"
#include "proto/sharing_enums.pb.h"
@@ -48,6 +46,9 @@ namespace nearby::sharing {
// This class is thread-compatible.
class ShareSession {
public:
static location::nearby::proto::sharing::AttachmentTransmissionStatus
ConvertToTransmissionStatus(TransferMetadata::Status status);
ShareSession(Clock* clock, TaskRunner& service_thread,
NearbyConnectionsManager* connections_manager,
analytics::AnalyticsRecorder& analytics_recorder,
@@ -85,10 +86,6 @@ class ShareSession {
void set_session_id(int64_t session_id) { session_id_ = session_id; }
std::optional<absl::Time> connection_start_time() const {
return connection_start_time_;
}
location::nearby::proto::sharing::OSType os_type() const { return os_type_; }
bool self_share() const { return self_share_; }
@@ -103,10 +100,6 @@ class ShareSession {
TransferMetadata::Status disconnect_status() const {
return disconnect_status_;
}
// Notifies the ShareTargetInfo that the connection has been established.
// Returns true if the connection was successfully established.
bool OnConnected(absl::Time connect_start_time,
NearbyConnection* connection);
// Send TransferMetadataUpdate with the final status.
// If connected, also close the connection.
@@ -122,9 +115,6 @@ class ShareSession {
callback);
void OnDisconnect();
void SetAttachmentContainer(AttachmentContainer container) {
attachment_container_ = std::move(container);
}
const AttachmentContainer& attachment_container() const {
return attachment_container_;
}
@@ -147,8 +137,11 @@ class ShareSession {
protected:
virtual void InvokeTransferUpdateCallback(
const TransferMetadata& metadata) = 0;
virtual bool OnNewConnection(NearbyConnection* connection) = 0;
virtual void OnConnectionDisconnected() {}
void SetConnection(NearbyConnection* connection);
void SetAttachmentContainer(AttachmentContainer container) {
attachment_container_ = std::move(container);
}
Clock& clock() const { return clock_; }
@@ -199,7 +192,6 @@ class ShareSession {
std::shared_ptr<PairedKeyVerificationRunner> key_verification_runner_;
std::shared_ptr<PayloadTracker> payload_tracker_;
int64_t session_id_;
std::optional<absl::Time> connection_start_time_;
::location::nearby::proto::sharing::OSType os_type_ =
::location::nearby::proto::sharing::OSType::UNKNOWN_OS_TYPE;
bool self_share_ = false;
+17 -39
View File
@@ -61,10 +61,6 @@ class TestShareSession : public ShareSession {
bool IsIncoming() const override { return is_incoming_; }
void SetOnNewConnectionResult(bool result) {
on_new_connection_result_ = result;
}
void SetAttachmentPayloadId(int64_t attachment_id, int64_t payload_id) {
ShareSession::SetAttachmentPayloadId(attachment_id, payload_id);
}
@@ -80,16 +76,14 @@ class TestShareSession : public ShareSession {
return connections_manager_;
}
void SetNearbyConnection(NearbyConnection* connection) {
SetConnection(connection);
}
MOCK_METHOD(void, InvokeTransferUpdateCallback,
(const TransferMetadata& metadata), (override));
MOCK_METHOD(void, OnConnectionDisconnected, (), (override));
protected:
bool OnNewConnection(NearbyConnection* connection) override {
connection_ = connection;
return on_new_connection_result_;
}
private:
FakeClock fake_clock_;
FakeTaskRunner fake_task_runner_{&fake_clock_, 1};
@@ -98,8 +92,6 @@ class TestShareSession : public ShareSession {
analytics::AnalyticsRecorder analytics_recorder_{/*vendor_id=*/0,
&mock_event_logger_};
const bool is_incoming_;
NearbyConnection* connection_ = nullptr;
bool on_new_connection_result_ = true;
};
TEST(ShareSessionTest, UpdateTransferMetadata) {
@@ -143,24 +135,12 @@ TEST(ShareSessionTest, SetDisconnectStatus) {
EXPECT_EQ(session.disconnect_status(), TransferMetadata::Status::kCancelled);
}
TEST(ShareSessionTest, OnConnectedFails) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
session.SetOnNewConnectionResult(false);
EXPECT_FALSE(session.OnConnected(absl::Now(),
/*connection=*/nullptr));
}
TEST(ShareSessionTest, OnConnectedSucceeds) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
session.SetOnNewConnectionResult(true);
absl::Time connect_start_time = absl::Now();
EXPECT_TRUE(session.OnConnected(connect_start_time, &connection));
EXPECT_EQ(session.connection_start_time(), connect_start_time);
session.SetNearbyConnection(&connection);
EXPECT_EQ(session.connection(), &connection);
}
@@ -172,9 +152,7 @@ TEST(ShareSessionTest, IncomingRunPairedKeyVerificationSuccess) {
share_target.is_incoming = true;
TestShareSession session(std::string(kEndpointId), share_target);
session.connections_manager().SetRawAuthenticationToken(kEndpointId, token);
session.SetOnNewConnectionResult(true);
absl::Time connect_start_time = absl::Now();
EXPECT_TRUE(session.OnConnected(connect_start_time, &connection));
session.SetNearbyConnection(&connection);
absl::Notification notification;
PairedKeyVerificationRunner::PairedKeyVerificationResult verification_result;
@@ -248,7 +226,7 @@ TEST(ShareSessionTest, CancelPayloads) {
FakeNearbyConnection connection;
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetAttachmentPayloadId(1, 2);
session.SetAttachmentPayloadId(3, 4);
@@ -262,7 +240,7 @@ TEST(ShareSessionTest, WriteResponseFrame) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.WriteResponseFrame(ConnectionResponseFrame::REJECT);
@@ -279,7 +257,7 @@ TEST(ShareSessionTest, WriteCancelFrame) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.WriteCancelFrame();
@@ -294,7 +272,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultFail) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_FALSE(session.HandleKeyVerificationResult(
@@ -309,7 +287,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultSelfShareSuccess) {
share_target.for_self_share = true;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_TRUE(session.HandleKeyVerificationResult(
@@ -324,7 +302,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultNotSelfShareSuccess) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_TRUE(session.HandleKeyVerificationResult(
@@ -341,7 +319,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultSelfShareUnable) {
share_target.for_self_share = true;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_TRUE(session.HandleKeyVerificationResult(
@@ -356,7 +334,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultNotSelfShareUnable) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_TRUE(session.HandleKeyVerificationResult(
@@ -371,7 +349,7 @@ TEST(ShareSessionTest, HandleKeyVerificationResultUnknown) {
ShareTarget share_target;
TestShareSession session(std::string(kEndpointId), share_target);
FakeNearbyConnection connection;
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.SetTokenForTests("9876");
EXPECT_FALSE(session.HandleKeyVerificationResult(
@@ -398,7 +376,7 @@ TEST(ShareSessionTest, AbortConnected) {
bool disconnected = false;
connection.SetDisconnectionListener(
[&disconnected]() { disconnected = true; });
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
EXPECT_CALL(session, InvokeTransferUpdateCallback(AllOf(
HasStatus(TransferMetadata::Status::kNotEnoughSpace),
IsFinalStatus())));
@@ -415,7 +393,7 @@ TEST(ShareSessionTest, Disconnect) {
bool disconnected = false;
connection.SetDisconnectionListener(
[&disconnected]() { disconnected = true; });
EXPECT_TRUE(session.OnConnected(absl::Now(), &connection));
session.SetNearbyConnection(&connection);
session.Disconnect();