mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 07:36:10 -04:00
Move outgoing connection management into OutgoingShareSession.
PiperOrigin-RevId: 686671335
This commit is contained in:
committed by
Copybara-Service
parent
a094817c68
commit
2183467f14
@@ -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_
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)));
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user