diff --git a/internal/analytics/sharing_log_matchers.h b/internal/analytics/sharing_log_matchers.h index 5f03017d397..f336f88046f 100644 --- a/internal/analytics/sharing_log_matchers.h +++ b/internal/analytics/sharing_log_matchers.h @@ -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_ diff --git a/sharing/BUILD b/sharing/BUILD index 464580ac7f1..eff7f304e30 100644 --- a/sharing/BUILD +++ b/sharing/BUILD @@ -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", diff --git a/sharing/incoming_share_session.cc b/sharing/incoming_share_session.cc index 425a766d0ab..77b5f30d8fa 100644 --- a/sharing/incoming_share_session.cc +++ b/sharing/incoming_share_session.cc @@ -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 IncomingShareSession::ProcessIntroduction( const IntroductionFrame& introduction_frame) { @@ -481,4 +476,9 @@ std::pair 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 diff --git a/sharing/incoming_share_session.h b/sharing/incoming_share_session.h index 2c9661fa5ad..cf8a81a0012 100644 --- a/sharing/incoming_share_session.h +++ b/sharing/incoming_share_session.h @@ -107,9 +107,11 @@ class IncomingShareSession : public ShareSession { std::pair 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. diff --git a/sharing/incoming_share_session_test.cc b/sharing/incoming_share_session_test.cc index bd0cbb740bf..00571054190 100644 --- a/sharing/incoming_share_session_test.cc +++ b/sharing/incoming_share_session_test.cc @@ -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))); diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index 039127c8207..d986f1313df 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -112,8 +112,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; @@ -774,18 +772,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; @@ -1068,7 +1057,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); }); @@ -2443,39 +2432,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( @@ -2536,42 +2521,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, @@ -2648,11 +2604,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(); @@ -2693,26 +2648,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() == @@ -2809,7 +2745,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); }); @@ -3476,7 +3412,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)); } @@ -3816,43 +3751,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; diff --git a/sharing/nearby_sharing_service_impl.h b/sharing/nearby_sharing_service_impl.h index 463a035e234..918b2af3a18 100644 --- a/sharing/nearby_sharing_service_impl.h +++ b/sharing/nearby_sharing_service_impl.h @@ -312,9 +312,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, @@ -364,10 +363,10 @@ class NearbySharingServiceImpl const std::optional& 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); @@ -454,18 +453,9 @@ class NearbySharingServiceImpl void RunOnAnyThread(absl::string_view task_name, absl::AnyInvocable 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. diff --git a/sharing/nearby_sharing_util.cc b/sharing/nearby_sharing_util.cc index 7f4c1812aa5..49aba148bb0 100644 --- a/sharing/nearby_sharing_util.cc +++ b/sharing/nearby_sharing_util.cc @@ -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 diff --git a/sharing/nearby_sharing_util.h b/sharing/nearby_sharing_util.h index 2fdeeeda393..d5ebbcd4587 100644 --- a/sharing/nearby_sharing_util.h +++ b/sharing/nearby_sharing_util.h @@ -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& 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_ diff --git a/sharing/outgoing_share_session.cc b/sharing/outgoing_share_session.cc index 8524f3d5415..4f72ddba654 100644 --- a/sharing/outgoing_share_session.cc +++ b/sharing/outgoing_share_session.cc @@ -25,6 +25,7 @@ #include #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 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_); @@ -335,6 +389,25 @@ void OutgoingShareSession::SendNextPayload() { } } +void OutgoingShareSession::SendAttachmentsCompleted( + const TransferMetadata& metadata) { + if (!metadata.is_final_status()) { + LOG(DFATAL) << "SendAttachmentsCompleted called with non-final status: " + << static_cast(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 timeout_callback) { Frame frame; @@ -480,4 +553,73 @@ void OutgoingShareSession::UpdateSessionForDedup( clear_certificate(); } } + +void OutgoingShareSession::Connect( + std::vector endpoint_info, + std::optional> bluetooth_mac_address, + DataUsage data_usage, bool disable_wifi_hotspot, + std::function 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 diff --git a/sharing/outgoing_share_session.h b/sharing/outgoing_share_session.h index 5402e893d1a..9778743880f 100644 --- a/sharing/outgoing_share_session.h +++ b/sharing/outgoing_share_session.h @@ -25,15 +25,18 @@ #include #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& 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 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 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 endpoint_info, + std::optional> bluetooth_mac_address, + nearby::sharing::proto::DataUsage data_usage, + bool disable_wifi_hotspot, + std::function + 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 text_payloads_; std::vector file_payloads_; std::vector wifi_credentials_payloads_; - Status connection_layer_status_; + Status connection_layer_status_ = Status::kUnknown; std::function 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 mutual_acceptance_timeout_; std::optional pending_complete_metadata_; + absl::Time connection_start_time_; }; } // namespace nearby::sharing diff --git a/sharing/outgoing_share_session_test.cc b/sharing/outgoing_share_session_test.cc index fd25c289336..a79eb9bfc0c 100644 --- a/sharing/outgoing_share_session_test.cc +++ b/sharing/outgoing_share_session_test.cc @@ -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; @@ -251,6 +253,82 @@ TEST_F(OutgoingShareSessionTest, CreateWifiCredentialsPayloads) { EXPECT_THAT(attachment_payload_map.at(wifi1_.id()), Eq(payloads[0].id)); } +TEST_F(OutgoingShareSessionTest, Connect) { + std::vector endpoint_info = {1, 2, 3, 4}; + std::vector 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) {}); + + 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> 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) { + session_.set_session_id(1234); + std::vector endpoint_info = {1, 2, 3, 4}; + std::vector 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(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) { + session_.set_session_id(1234); + std::vector endpoint_info = {1, 2, 3, 4}; + std::vector 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(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) { EXPECT_THAT(session_.SendIntroduction([]() {}), IsFalse()); } @@ -258,7 +336,8 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionWithoutPayloads) { TEST_F(OutgoingShareSessionTest, SendIntroductionSuccess) { session_.set_session_id(1234); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); std::vector file_infos; file_infos.push_back({ .size = 12355L, @@ -330,7 +409,8 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionTimeout) { session_.SetAttachmentContainer(std::move(container)); session_.set_session_id(1234); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.CreateTextPayloads(); EXPECT_CALL( mock_event_logger_, @@ -355,7 +435,8 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionTimeoutCancelled) { session_.SetAttachmentContainer(std::move(container)); session_.set_session_id(1234); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.CreateTextPayloads(); EXPECT_CALL( mock_event_logger_, @@ -392,7 +473,8 @@ TEST_F(OutgoingShareSessionTest, AcceptTransferNotConnected) { TEST_F(OutgoingShareSessionTest, AcceptTransferNotReady) { session_.set_session_id(1234); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); EXPECT_THAT( session_.AcceptTransfer([](std::optional) {}), @@ -404,7 +486,8 @@ TEST_F(OutgoingShareSessionTest, AcceptTransferSuccess) { session_.SetAttachmentContainer(std::move(container)); session_.set_session_id(1234); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.CreateTextPayloads(); EXPECT_CALL(mock_event_logger_, Log(Matcher( @@ -493,7 +576,8 @@ TEST_F(OutgoingShareSessionTest, HandleConnectionResponseAcceptResponse) { ConnectionResponseFrame response; response.set_status(ConnectionResponseFrame::ACCEPT); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); EXPECT_CALL(transfer_metadata_callback_, Call(_, HasStatus(TransferMetadata::Status::kInProgress))); @@ -545,6 +629,10 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsDisableCancellationOptimization) { std::weak_ptr) { payload->id = session_.attachment_payload_map().at(wifi1_.id()); })); + EXPECT_CALL(mock_event_logger_, + Log(Matcher( + AllOf((HasCategory(EventCategory::SENDING_EVENT), + HasEventType(EventType::ESTABLISH_CONNECTION)))))); EXPECT_CALL(mock_event_logger_, Log(Matcher( AllOf((HasCategory(EventCategory::SENDING_EVENT), @@ -552,7 +640,8 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsDisableCancellationOptimization) { Property(&SharingLog::send_attachments_start, HasSessionId(1234))))))); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.SendPayloads( /*enable_transfer_cancellation_optimization=*/ @@ -587,6 +676,10 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsEnableCancellationOptimization) { std::weak_ptr) { payload->id = session_.attachment_payload_map().at(file1_.id()); })); + EXPECT_CALL(mock_event_logger_, + Log(Matcher( + AllOf((HasCategory(EventCategory::SENDING_EVENT), + HasEventType(EventType::ESTABLISH_CONNECTION)))))); EXPECT_CALL(mock_event_logger_, Log(Matcher( AllOf((HasCategory(EventCategory::SENDING_EVENT), @@ -594,7 +687,8 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsEnableCancellationOptimization) { Property(&SharingLog::send_attachments_start, HasSessionId(1234))))))); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.SendPayloads( /*enable_transfer_cancellation_optimization=*/ @@ -630,6 +724,10 @@ TEST_F(OutgoingShareSessionTest, SendNextPayload) { std::weak_ptr) { payload->id = session_.attachment_payload_map().at(file1_.id()); })); + EXPECT_CALL(mock_event_logger_, + Log(Matcher( + AllOf((HasCategory(EventCategory::SENDING_EVENT), + HasEventType(EventType::ESTABLISH_CONNECTION)))))); EXPECT_CALL(mock_event_logger_, Log(Matcher( AllOf((HasCategory(EventCategory::SENDING_EVENT), @@ -637,7 +735,8 @@ TEST_F(OutgoingShareSessionTest, SendNextPayload) { Property(&SharingLog::send_attachments_start, HasSessionId(1234))))))); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.SendPayloads( /*enable_transfer_cancellation_optimization=*/ @@ -674,7 +773,8 @@ TEST_F(OutgoingShareSessionTest, SendNextPayload) { TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultFail) { FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.SetTokenForTests("1234"); EXPECT_THAT( @@ -689,7 +789,8 @@ TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultFail) { TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultSuccess) { FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); session_.SetTokenForTests("1234"); EXPECT_THAT( @@ -704,7 +805,8 @@ TEST_F(OutgoingShareSessionTest, ProcessKeyVerificationResultSuccess) { TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataReceiverDisconnect) { FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); TransferMetadata complete_metadata = TransferMetadataBuilder() .set_status(TransferMetadata::Status::kComplete) @@ -721,7 +823,8 @@ TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataReceiverDisconnect) { TEST_F(OutgoingShareSessionTest, DelayCompleteMetadataDisconnectTimeout) { FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); TransferMetadata complete_metadata = TransferMetadataBuilder() .set_status(TransferMetadata::Status::kComplete) @@ -766,7 +869,8 @@ TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupWithoutCertificate) { TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupConnectedIsNoOp) { auto share_target_org = session_.share_target(); FakeNearbyConnection connection; - session_.OnConnected(absl::Now(), &connection); + EXPECT_THAT(session_.OnConnectResult(&connection, Status::kSuccess), + IsTrue()); ShareTarget share_target2{ "test_update_name", ::nearby::network::Url(), ShareTargetType::kPhone, /* is_incoming */ true, "test_update_full_name", diff --git a/sharing/share_session.cc b/sharing/share_session.cc index c9562651ad2..0d41ec502bb 100644 --- a/sharing/share_session.cc +++ b/sharing/share_session.cc @@ -24,7 +24,6 @@ #include #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& 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(service_thread_, connection_); - return true; } void ShareSession::Disconnect() { diff --git a/sharing/share_session.h b/sharing/share_session.h index d4e34e1ac40..9d8d88bef62 100644 --- a/sharing/share_session.h +++ b/sharing/share_session.h @@ -21,11 +21,9 @@ #include #include #include -#include #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 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. @@ -147,8 +140,8 @@ class ShareSession { protected: virtual void InvokeTransferUpdateCallback( const TransferMetadata& metadata) = 0; - virtual bool OnNewConnection(NearbyConnection* connection) = 0; virtual void OnConnectionDisconnected() {} + void SetConnection(NearbyConnection* connection); Clock& clock() const { return clock_; } @@ -199,7 +192,6 @@ class ShareSession { std::shared_ptr key_verification_runner_; std::shared_ptr payload_tracker_; int64_t session_id_; - std::optional connection_start_time_; ::location::nearby::proto::sharing::OSType os_type_ = ::location::nearby::proto::sharing::OSType::UNKNOWN_OS_TYPE; bool self_share_ = false; diff --git a/sharing/share_session_test.cc b/sharing/share_session_test.cc index 009488a2273..9cb6e7e19c1 100644 --- a/sharing/share_session_test.cc +++ b/sharing/share_session_test.cc @@ -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();