From 04cbf62afbea89d1f71075858985b1de634bf7d3 Mon Sep 17 00:00:00 2001 From: Francis Tsui Date: Fri, 19 Dec 2025 10:41:54 -0800 Subject: [PATCH] Refactor Attachment processing. PiperOrigin-RevId: 846789473 --- sharing/BUILD | 24 +- sharing/nearby_sharing_service_impl.cc | 94 +++----- sharing/nearby_sharing_service_impl.h | 4 - sharing/nearby_sharing_util.cc | 25 -- sharing/nearby_sharing_util.h | 7 - sharing/outgoing_share_session.cc | 55 ++++- sharing/outgoing_share_session.h | 33 +-- sharing/outgoing_share_session_test.cc | 288 ++++++++++------------- sharing/outgoing_targets_manager_test.cc | 12 +- 9 files changed, 251 insertions(+), 291 deletions(-) diff --git a/sharing/BUILD b/sharing/BUILD index 978c11fc..42baf3f2 100644 --- a/sharing/BUILD +++ b/sharing/BUILD @@ -221,6 +221,7 @@ cc_library( ":attachments", ":connection_types", ":incoming_frame_reader", + ":nearby_sharing_util", ":paired_key_verification_runner", ":thread_timer", ":transfer_metadata", @@ -287,6 +288,25 @@ cc_library( ], ) +cc_library( + name = "nearby_sharing_util", + srcs = ["nearby_sharing_util.cc"], + hdrs = ["nearby_sharing_util.h"], + deps = [ + ":types", + "//internal/base:file_path", + "//internal/platform:types", + "//proto:sharing_enums_cc_proto", + "//sharing/certificates", + "//sharing/common:enum", + "//sharing/internal/base", + "//sharing/internal/public:logging", + "@com_google_absl//absl/hash", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:string_view", + ], +) + cc_library( name = "nearby_sharing_service", srcs = [ @@ -300,7 +320,6 @@ cc_library( "nearby_sharing_service_factory.cc", "nearby_sharing_service_impl.cc", "nearby_sharing_settings.cc", - "nearby_sharing_util.cc", "service_observers.cc", "service_observers.h", "transfer_manager.cc", @@ -319,7 +338,6 @@ cc_library( "nearby_sharing_service_factory.h", "nearby_sharing_service_impl.h", "nearby_sharing_settings.h", - "nearby_sharing_util.h", "payload_listener.h", "share_target_discovered_callback.h", "transfer_manager.h", @@ -341,6 +359,7 @@ cc_library( ":incoming_frame_reader", ":nearby_connection_impl", ":nearby_sharing_decoder", + ":nearby_sharing_util", ":outgoing_targets_manager", ":paired_key_verification_runner", ":share_session", @@ -386,7 +405,6 @@ cc_library( "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/functional:any_invocable", "@com_google_absl//absl/functional:bind_front", - "@com_google_absl//absl/hash", "@com_google_absl//absl/meta:type_traits", "@com_google_absl//absl/random", "@com_google_absl//absl/status:statusor", diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index a184c243..ac3ed1f5 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -204,6 +204,30 @@ std::string GenerateDeviceId() { return id; } +std::string ReceiveSurfaceStateToString( + NearbySharingService::ReceiveSurfaceState state) { + switch (state) { + case NearbySharingService::ReceiveSurfaceState::kForeground: + return "FOREGROUND"; + case NearbySharingService::ReceiveSurfaceState::kBackground: + return "BACKGROUND"; + case NearbySharingService::ReceiveSurfaceState::kUnknown: + return "UNKNOWN"; + } +} + +std::string SendSurfaceStateToString( + NearbySharingService::SendSurfaceState state) { + switch (state) { + case NearbySharingService::SendSurfaceState::kForeground: + return "FOREGROUND"; + case NearbySharingService::SendSurfaceState::kBackground: + return "BACKGROUND"; + case NearbySharingService::SendSurfaceState::kUnknown: + return "UNKNOWN"; + } +} + } // namespace NearbySharingServiceImpl::NearbySharingServiceImpl( @@ -726,16 +750,10 @@ void NearbySharingServiceImpl::SendAttachments( return; } - session->InitiateSendAttachments(std::move(attachment_container)); - app_info_->SetActiveFlag(); - if (!CreatePayloads(*session)) { - session->UpdateTransferMetadata( - TransferMetadataBuilder() - .set_status(TransferMetadata::Status::kMediaUnavailable) - .build()); - } else { + if (session->InitiateSendAttachments( + std::move(attachment_container))) { OutgoingSessionConnect(*session, std::move(*endpoint_info)); } std::move(status_codes_callback)(StatusCodes::kOk); @@ -747,19 +765,11 @@ void NearbySharingServiceImpl::OutgoingSessionConnect( OnTransferStarted(/*is_incoming=*/false); is_connecting_ = true; InvalidateSendSurfaceState(); - // Send process initialized successfully, from now on status updated - // will be sent out via OnOutgoingTransferUpdate(). - session.UpdateTransferMetadata( - TransferMetadataBuilder() - .set_status(TransferMetadata::Status::kConnecting) - .build()); - std::optional> bluetooth_mac_address = - GetBluetoothMacAddressForShareTarget(session); int64_t share_target_id = session.share_target().id; session.Connect( - std::move(endpoint_info), std::move(bluetooth_mac_address), - settings_->GetDataUsage(), GetDisableWifiHotspotState(), + std::move(endpoint_info), settings_->GetDataUsage(), + GetDisableWifiHotspotState(), absl::bind_front(&NearbySharingServiceImpl::OnOutgoingConnection, this, share_target_id)); } @@ -2185,40 +2195,6 @@ void NearbySharingServiceImpl::OnOutgoingConnection( } } -bool NearbySharingServiceImpl::CreatePayloads(OutgoingShareSession& session) { - bool has_payloads = !session.text_payloads().empty() || - !session.file_payloads().empty() || - !session.wifi_credentials_payloads().empty(); - if (has_payloads) { - // We may have already created the payloads in the case of retry. - // Retry is not implemented. So this is an error case. - LOG(WARNING) - << __func__ - << ": Failed to send attachments. Unexpected payloads already exist."; - return false; - } - session.CreateTextPayloads(); - session.CreateWifiCredentialsPayloads(); - bool success = session.CreateFilePayloads(); - if (success) { - has_payloads = !session.text_payloads().empty() || - !session.file_payloads().empty() || - !session.wifi_credentials_payloads().empty(); - if (!has_payloads) { - success = false; - } - } - if (!success) { - LOG(WARNING) << __func__ - << ": Failed to send file to remote ShareTarget. Failed to " - "create payloads."; - return false; - } - // Log analytics event of describing attachments. - analytics_recorder_.NewDescribeAttachments(session.attachment_container()); - return true; -} - void NearbySharingServiceImpl::Fail(IncomingShareSession& session, TransferMetadata::Status status) { RunOnNearbySharingServiceThreadDelayed( @@ -2897,20 +2873,6 @@ IncomingShareSession* NearbySharingServiceImpl::GetIncomingShareSession( return &it->second; } -std::optional> -NearbySharingServiceImpl::GetBluetoothMacAddressForShareTarget( - OutgoingShareSession& session) { - const std::optional& certificate = - session.certificate(); - if (!certificate) { - LOG(ERROR) << __func__ << ": No decrypted public certificate found for " - << "share target id: " << session.share_target().id; - return std::nullopt; - } - - return GetBluetoothMacAddressFromCertificate(*certificate); -} - void NearbySharingServiceImpl::UnregisterShareTarget(int64_t share_target_id) { LOG(INFO) << __func__ << ": Unregister share target " << share_target_id; diff --git a/sharing/nearby_sharing_service_impl.h b/sharing/nearby_sharing_service_impl.h index b20195cd..d2fbec13 100644 --- a/sharing/nearby_sharing_service_impl.h +++ b/sharing/nearby_sharing_service_impl.h @@ -287,7 +287,6 @@ class NearbySharingServiceImpl absl::string_view endpoint_id, NearbyConnection* connection, Status status); - bool CreatePayloads(OutgoingShareSession& session); void OutgoingSessionConnect(OutgoingShareSession& session, std::vector endpoint_info); @@ -345,9 +344,6 @@ class NearbySharingServiceImpl ShareSession* GetShareSession(int64_t share_target_id); IncomingShareSession* GetIncomingShareSession(int64_t share_target_id); - std::optional> GetBluetoothMacAddressForShareTarget( - OutgoingShareSession& session); - void UnregisterShareTarget(int64_t share_target_id); void OnStartAdvertisingResult(bool used_device_name, Status status); diff --git a/sharing/nearby_sharing_util.cc b/sharing/nearby_sharing_util.cc index c92b8428..4d9d236c 100644 --- a/sharing/nearby_sharing_util.cc +++ b/sharing/nearby_sharing_util.cc @@ -33,34 +33,9 @@ #include "sharing/common/nearby_share_enums.h" #include "sharing/internal/base/encode.h" #include "sharing/internal/public/logging.h" -#include "sharing/nearby_sharing_service.h" namespace nearby::sharing { -std::string ReceiveSurfaceStateToString( - NearbySharingService::ReceiveSurfaceState state) { - switch (state) { - case NearbySharingService::ReceiveSurfaceState::kForeground: - return "FOREGROUND"; - case NearbySharingService::ReceiveSurfaceState::kBackground: - return "BACKGROUND"; - case NearbySharingService::ReceiveSurfaceState::kUnknown: - return "UNKNOWN"; - } -} - -std::string SendSurfaceStateToString( - NearbySharingService::SendSurfaceState state) { - switch (state) { - case NearbySharingService::SendSurfaceState::kForeground: - return "FOREGROUND"; - case NearbySharingService::SendSurfaceState::kBackground: - return "BACKGROUND"; - case NearbySharingService::SendSurfaceState::kUnknown: - return "UNKNOWN"; - } -} - std::string PowerLevelToString(PowerLevel level) { switch (level) { case PowerLevel::kLowPower: diff --git a/sharing/nearby_sharing_util.h b/sharing/nearby_sharing_util.h index 5e0e58ef..bcc4c90d 100644 --- a/sharing/nearby_sharing_util.h +++ b/sharing/nearby_sharing_util.h @@ -27,7 +27,6 @@ #include "sharing/advertisement.h" #include "sharing/certificates/nearby_share_decrypted_public_certificate.h" #include "sharing/common/nearby_share_enums.h" -#include "sharing/nearby_sharing_service.h" namespace nearby::sharing { @@ -48,12 +47,6 @@ std::optional GetDeviceName( const Advertisement& advertisement, const std::optional& certificate); -std::string ReceiveSurfaceStateToString( - NearbySharingService::ReceiveSurfaceState state); - -std::string SendSurfaceStateToString( - NearbySharingService::SendSurfaceState state); - std::string PowerLevelToString(PowerLevel level); // Return the most stable device identifier with the following priority: diff --git a/sharing/outgoing_share_session.cc b/sharing/outgoing_share_session.cc index fdbc3e8a..228f8244 100644 --- a/sharing/outgoing_share_session.cc +++ b/sharing/outgoing_share_session.cc @@ -39,6 +39,7 @@ #include "sharing/nearby_connection.h" #include "sharing/nearby_connections_manager.h" #include "sharing/nearby_connections_types.h" +#include "sharing/nearby_sharing_util.h" #include "sharing/paired_key_verification_runner.h" #include "sharing/payload_tracker.h" #include "sharing/share_session.h" @@ -109,6 +110,19 @@ ConnectionLayerStatus ConvertToConnectionLayerStatus(Status status) { } } +std::optional> GetBluetoothMacAddressForShareTarget( + OutgoingShareSession& session) { + const std::optional& certificate = + session.certificate(); + if (!certificate) { + LOG(ERROR) << __func__ << ": No decrypted public certificate found for " + << "share target id: " << session.share_target().id; + return std::nullopt; + } + + return GetBluetoothMacAddressFromCertificate(*certificate); +} + } // namespace OutgoingShareSession::OutgoingShareSession( @@ -134,7 +148,7 @@ void OutgoingShareSession::InvokeTransferUpdateCallback( transfer_update_callback_(*this, metadata); } -void OutgoingShareSession::InitiateSendAttachments( +bool OutgoingShareSession::InitiateSendAttachments( std::unique_ptr attachment_container) { SetAttachmentContainer(std::move(*attachment_container)); is_connecting_ = true; @@ -147,6 +161,31 @@ void OutgoingShareSession::InitiateSendAttachments( /*transfer_position=*/1, /*concurrent_connections=*/1, share_target()); + text_payloads_.clear(); + wifi_credentials_payloads_.clear(); + file_payloads_.clear(); + CreateTextPayloads(); + CreateWifiCredentialsPayloads(); + bool success = CreateFilePayloads(); + // Log analytics event of describing attachments. + analytics_recorder().NewDescribeAttachments(this->attachment_container()); + if (success) { + if (text_payloads_.empty() && wifi_credentials_payloads_.empty() && + file_payloads_.empty()) { + // Fails in no payloads created. + success = false; + } + } + if (!success) { + LOG(WARNING) << __func__ + << ": Failed to send file to remote ShareTarget. Failed to " + "create payloads."; + UpdateTransferMetadata( + TransferMetadataBuilder() + .set_status(TransferMetadata::Status::kMediaUnavailable) + .build()); + } + return success; } bool OutgoingShareSession::ProcessKeyVerificationResult( @@ -169,7 +208,6 @@ void OutgoingShareSession::CreateTextPayloads() { if (attachments.empty()) { return; } - text_payloads_.clear(); text_payloads_.reserve(attachments.size()); for (const TextAttachment& attachment : attachments) { absl::string_view body = attachment.text_body(); @@ -185,7 +223,6 @@ void OutgoingShareSession::CreateWifiCredentialsPayloads() { if (attachments.empty()) { return; } - wifi_credentials_payloads_.clear(); wifi_credentials_payloads_.reserve(attachments.size()); for (const WifiCredentialsAttachment& attachment : attachments) { nearby::sharing::service::proto::WifiCredentials wifi_credentials; @@ -206,7 +243,6 @@ bool OutgoingShareSession::CreateFilePayloads() { return true; } AttachmentContainer& container = mutable_attachment_container(); - file_payloads_.clear(); file_payloads_.reserve(container.GetFileAttachments().size()); for (int i = 0; i < container.GetFileAttachments().size(); ++i) { @@ -506,15 +542,20 @@ bool OutgoingShareSession::UpdateSessionForDedup( void OutgoingShareSession::Connect( std::vector endpoint_info, - std::optional> bluetooth_mac_address, DataUsage data_usage, bool disable_wifi_hotspot, std::function callback) { + // Send process initialized successfully, from now on status updated + // will be sent out via TransferUpdates. + UpdateTransferMetadata(TransferMetadataBuilder() + .set_status(TransferMetadata::Status::kConnecting) + .build()); 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)); + std::move(endpoint_info), endpoint_id(), + GetBluetoothMacAddressForShareTarget(*this), data_usage, + GetTransportType(disable_wifi_hotspot), std::move(callback)); } bool OutgoingShareSession::OnConnectResult(NearbyConnection* connection, diff --git a/sharing/outgoing_share_session.h b/sharing/outgoing_share_session.h index a61080a3..27b7d8e7 100644 --- a/sharing/outgoing_share_session.h +++ b/sharing/outgoing_share_session.h @@ -67,27 +67,15 @@ class OutgoingShareSession : public ShareSession { obfuscated_gaia_id_ = std::move(obfuscated_gaia_id); } - const std::vector& text_payloads() const { return text_payloads_; } - - const std::vector& wifi_credentials_payloads() const { - return wifi_credentials_payloads_; - } - - const std::vector& file_payloads() const { return file_payloads_; } - - void InitiateSendAttachments( + // Returns true if the attachments are valid and payloads are created + // successfully. + bool InitiateSendAttachments( std::unique_ptr attachment_container); bool ProcessKeyVerificationResult( PairedKeyVerificationRunner::PairedKeyVerificationResult result, location::nearby::proto::sharing::OSType share_target_os_type); - void CreateTextPayloads(); - void CreateWifiCredentialsPayloads(); - // Create file payloads and update the file size of all file attachments. - // Returns true if all file payloads are created successfully. - bool CreateFilePayloads(); - // Returns true if the introduction frame is written successfully. // `timeout_callback` is called if accept is not received from both sender and // receiver within the timeout. @@ -143,7 +131,6 @@ class OutgoingShareSession : public ShareSession { // 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& text_payloads() const { return text_payloads_; } + + const std::vector& wifi_credentials_payloads() const { + return wifi_credentials_payloads_; + } + + const std::vector& file_payloads() const { return file_payloads_; } + protected: void InvokeTransferUpdateCallback(const TransferMetadata& metadata) override; void OnConnectionDisconnected() override; @@ -179,6 +174,12 @@ class OutgoingShareSession : public ShareSession { bool FillIntroductionFrame( nearby::sharing::service::proto::IntroductionFrame* introduction) const; + void CreateTextPayloads(); + void CreateWifiCredentialsPayloads(); + // Create file payloads and update the file size of all file attachments. + // Returns true if all file payloads are created successfully. + bool CreateFilePayloads(); + std::optional obfuscated_gaia_id_; // All payloads are in the same order as the attachments in the share target. std::vector text_payloads_; diff --git a/sharing/outgoing_share_session_test.cc b/sharing/outgoing_share_session_test.cc index 542bbd20..e627b12d 100644 --- a/sharing/outgoing_share_session_test.cc +++ b/sharing/outgoing_share_session_test.cc @@ -73,6 +73,7 @@ using ::nearby::sharing::service::proto::WifiCredentials; using ::testing::_; using ::testing::AllOf; using ::testing::Eq; +using ::testing::InSequence; using ::testing::IsEmpty; using ::testing::IsFalse; using ::testing::IsTrue; @@ -85,9 +86,15 @@ using ::testing::proto::ProtoField; constexpr absl::string_view kEndpointId = "ABCD"; constexpr absl::string_view kFile1Name = "someFileName.jpg"; -constexpr absl::string_view kFile2Name = "someFileName2.jpg"; constexpr int kFile1Size = 1234; -constexpr int kFile2Size = 5678; + +void CreateTempFile(absl::string_view file_name, int file_size) { + FilePath file_path = + Files::GetTemporaryDirectory().append(FilePath(file_name)); + std::ofstream file_stream(file_path.GetPath()); + file_stream << std::string(file_size, 'a'); + file_stream.close(); +} class OutgoingShareSessionTest : public ::testing::Test { public: @@ -102,24 +109,11 @@ class OutgoingShareSessionTest : public ::testing::Test { file1_(Files::GetTemporaryDirectory().append(FilePath(kFile1Name)), /*mime_type=*/"", /*parent_folder=*/"/usr/local/parent"), - file2_(Files::GetTemporaryDirectory().append(FilePath(kFile2Name)), - /*mime_type=*/"", - /*parent_folder=*/"/usr/local/parent2"), wifi1_( "GoogleGuest", nearby::sharing::service::proto::WifiCredentialsMetadata::WPA_PSK, "somepassword", /*is_hidden=*/true) { - // Create temp file attachments - FilePath file1_path = - Files::GetTemporaryDirectory().append(FilePath(kFile1Name)); - FilePath file2_path = - Files::GetTemporaryDirectory().append(FilePath(kFile2Name)); - std::ofstream file1_stream(file1_path.GetPath()); - file1_stream << std::string(kFile1Size, 'a'); - file1_stream.close(); - std::ofstream file2_stream(file2_path.GetPath()); - file2_stream << std::string(kFile2Size, 'b'); - file2_stream.close(); + CreateTempFile(kFile1Name, kFile1Size); } std::unique_ptr CreateDefaultAttachmentContainer() { @@ -130,13 +124,18 @@ class OutgoingShareSessionTest : public ::testing::Test { .Build(); } - void InitSendAttachments( + bool InitSendAttachments( std::unique_ptr attachment_container) { + InSequence seq; EXPECT_CALL(mock_event_logger_, Log(Matcher( AllOf((HasCategory(EventCategory::SENDING_EVENT), HasEventType(EventType::SEND_START)))))); - session_.InitiateSendAttachments(std::move(attachment_container)); + EXPECT_CALL(mock_event_logger_, + Log(Matcher( + AllOf((HasCategory(EventCategory::SENDING_EVENT), + HasEventType(EventType::DESCRIBE_ATTACHMENTS)))))); + return session_.InitiateSendAttachments(std::move(attachment_container)); } void ConnectionSuccess(NearbyConnection* connection) { @@ -145,7 +144,10 @@ class OutgoingShareSessionTest : public ::testing::Test { AllOf((HasCategory(EventCategory::SENDING_EVENT), HasEventType(EventType::ESTABLISH_CONNECTION)))))); connections_manager_.set_nearby_connection(connection); - session_.Connect({}, {}, proto::DataUsage::ONLINE_DATA_USAGE, + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); + session_.Connect(/*endpoint_info=*/{}, proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/false, [](absl::string_view endpoint_id, NearbyConnection* connection, Status status) {}); @@ -168,132 +170,108 @@ class OutgoingShareSessionTest : public ::testing::Test { TextAttachment text1_; TextAttachment text2_; FileAttachment file1_; - FileAttachment file2_; WifiCredentialsAttachment wifi1_; }; -TEST_F(OutgoingShareSessionTest, CreateTextPayloadsWithNoTextAttachments) { - OutgoingShareSession session( - &fake_clock_, fake_task_runner_, &connections_manager_, - analytics_recorder_, std::string(kEndpointId), share_target_, - [](OutgoingShareSession&, const TransferMetadata&) {}); - session.CreateTextPayloads(); - const std::vector& payloads = session.text_payloads(); +TEST_F(OutgoingShareSessionTest, InitiateSendAttachmentsWithNoAttachments) { + EXPECT_CALL( + transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kMediaUnavailable), + IsFinalStatus()))); - EXPECT_THAT(payloads, IsEmpty()); + EXPECT_THAT( + InitSendAttachments(AttachmentContainer::Builder({}, {}, {}).Build()), + IsFalse()); + + EXPECT_THAT(session_.text_payloads(), IsEmpty()); + EXPECT_THAT(session_.wifi_credentials_payloads(), IsEmpty()); + EXPECT_THAT(session_.file_payloads(), IsEmpty()); } -TEST_F(OutgoingShareSessionTest, CreateTextPayloads) { - InitSendAttachments(CreateDefaultAttachmentContainer()); - session_.CreateTextPayloads(); - const std::vector& payloads = session_.text_payloads(); - auto& attachment_payload_map = session_.attachment_payload_map(); +TEST_F(OutgoingShareSessionTest, InitiateSendAttachmentsSuccess) { + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); - ASSERT_THAT(payloads, SizeIs(2)); - EXPECT_THAT(payloads[0].content.type, Eq(PayloadContent::Type::kBytes)); - EXPECT_THAT(payloads[1].content.type, Eq(PayloadContent::Type::kBytes)); - EXPECT_THAT(payloads[0].content.bytes_payload.bytes, + const std::vector& text_payloads = session_.text_payloads(); + ASSERT_THAT(text_payloads, SizeIs(2)); + EXPECT_THAT(text_payloads[0].content.type, Eq(PayloadContent::Type::kBytes)); + EXPECT_THAT(text_payloads[1].content.type, Eq(PayloadContent::Type::kBytes)); + EXPECT_THAT(text_payloads[0].content.bytes_payload.bytes, Eq(std::vector(text1_.text_body().begin(), text1_.text_body().end()))); - EXPECT_THAT(payloads[1].content.bytes_payload.bytes, + EXPECT_THAT(text_payloads[1].content.bytes_payload.bytes, Eq(std::vector(text2_.text_body().begin(), text2_.text_body().end()))); - ASSERT_THAT(attachment_payload_map, SizeIs(2)); - ASSERT_THAT(attachment_payload_map.contains(text1_.id()), IsTrue()); - EXPECT_THAT(attachment_payload_map.at(text1_.id()), Eq(payloads[0].id)); - ASSERT_THAT(attachment_payload_map.contains(text2_.id()), IsTrue()); - EXPECT_THAT(attachment_payload_map.at(text2_.id()), Eq(payloads[1].id)); -} + const std::vector& wifi_payloads = + session_.wifi_credentials_payloads(); -TEST_F(OutgoingShareSessionTest, CreateFilePayloadsWithNoFileAttachments) { - OutgoingShareSession session( - &fake_clock_, fake_task_runner_, &connections_manager_, - analytics_recorder_, std::string(kEndpointId), share_target_, - [](OutgoingShareSession&, const TransferMetadata&) {}); - - EXPECT_THAT(session.CreateFilePayloads(), IsTrue()); - const std::vector& payloads = session.file_payloads(); - - EXPECT_THAT(payloads, IsEmpty()); -} - -TEST_F(OutgoingShareSessionTest, - CreateFilePayloadsWithNonexistentFileAttachment) { - InitSendAttachments(CreateDefaultAttachmentContainer()); - // Remove attachment file1. - Files::RemoveFile( - Files::GetTemporaryDirectory().append(FilePath(kFile1Name))); - EXPECT_THAT(session_.CreateFilePayloads(), IsFalse()); - const std::vector& payloads = session_.file_payloads(); - - EXPECT_THAT(payloads, IsEmpty()); -} - -TEST_F(OutgoingShareSessionTest, CreateFilePayloads) { - InitSendAttachments(CreateDefaultAttachmentContainer()); - session_.CreateFilePayloads(); - const std::vector& payloads = session_.file_payloads(); - auto& attachment_payload_map = session_.attachment_payload_map(); - - ASSERT_THAT(payloads, SizeIs(1)); - EXPECT_THAT(payloads[0].content.type, Eq(PayloadContent::Type::kFile)); - EXPECT_THAT(payloads[0].content.file_payload.parent_folder, - Eq(file1_.parent_folder())); - EXPECT_THAT(payloads[0].content.file_payload.file_path, - Eq(file1_.file_path())); - - EXPECT_THAT(attachment_payload_map, SizeIs(1)); - ASSERT_THAT(attachment_payload_map.contains(file1_.id()), IsTrue()); - EXPECT_THAT(attachment_payload_map.at(file1_.id()), Eq(payloads[0].id)); - - EXPECT_THAT(session_.attachment_container().GetFileAttachments()[0].size(), - Eq(kFile1Size)); -} - -TEST_F(OutgoingShareSessionTest, CreateWifiPayloadsWithNoWifiAttachments) { - OutgoingShareSession session( - &fake_clock_, fake_task_runner_, &connections_manager_, - analytics_recorder_, std::string(kEndpointId), share_target_, - [](OutgoingShareSession&, const TransferMetadata&) {}); - session.CreateWifiCredentialsPayloads(); - const std::vector& payloads = session.file_payloads(); - - EXPECT_THAT(payloads, IsEmpty()); -} - -TEST_F(OutgoingShareSessionTest, CreateWifiCredentialsPayloads) { - InitSendAttachments(CreateDefaultAttachmentContainer()); - session_.CreateWifiCredentialsPayloads(); - const std::vector& payloads = session_.wifi_credentials_payloads(); - auto& attachment_payload_map = session_.attachment_payload_map(); - - ASSERT_THAT(payloads, SizeIs(1)); - EXPECT_THAT(payloads[0].content.type, Eq(PayloadContent::Type::kBytes)); + ASSERT_THAT(wifi_payloads, SizeIs(1)); + EXPECT_THAT(wifi_payloads[0].content.type, Eq(PayloadContent::Type::kBytes)); WifiCredentials wifi_credentials; EXPECT_THAT(wifi_credentials.ParseFromArray( - payloads[0].content.bytes_payload.bytes.data(), - payloads[0].content.bytes_payload.bytes.size()), + wifi_payloads[0].content.bytes_payload.bytes.data(), + wifi_payloads[0].content.bytes_payload.bytes.size()), IsTrue()); EXPECT_THAT(wifi_credentials.password(), Eq(wifi1_.password())); EXPECT_THAT(wifi_credentials.has_hidden_ssid(), Eq(wifi1_.is_hidden())); - ASSERT_THAT(attachment_payload_map, SizeIs(1)); + const std::vector& file_payloads = session_.file_payloads(); + ASSERT_THAT(file_payloads, SizeIs(1)); + EXPECT_THAT(file_payloads[0].content.type, Eq(PayloadContent::Type::kFile)); + EXPECT_THAT(file_payloads[0].content.file_payload.parent_folder, + Eq(file1_.parent_folder())); + EXPECT_THAT(file_payloads[0].content.file_payload.file_path, + Eq(file1_.file_path())); + + + EXPECT_THAT(session_.attachment_container().GetFileAttachments()[0].size(), + Eq(kFile1Size)); + + auto& attachment_payload_map = session_.attachment_payload_map(); + + ASSERT_THAT(attachment_payload_map, SizeIs(4)); + ASSERT_THAT(attachment_payload_map.contains(text1_.id()), IsTrue()); + EXPECT_THAT(attachment_payload_map.at(text1_.id()), Eq(text_payloads[0].id)); + ASSERT_THAT(attachment_payload_map.contains(text2_.id()), IsTrue()); + EXPECT_THAT(attachment_payload_map.at(text2_.id()), Eq(text_payloads[1].id)); ASSERT_THAT(attachment_payload_map.contains(wifi1_.id()), IsTrue()); - EXPECT_THAT(attachment_payload_map.at(wifi1_.id()), Eq(payloads[0].id)); + EXPECT_THAT(attachment_payload_map.at(wifi1_.id()), Eq(wifi_payloads[0].id)); + ASSERT_THAT(attachment_payload_map.contains(file1_.id()), IsTrue()); + EXPECT_THAT(attachment_payload_map.at(file1_.id()), Eq(file_payloads[0].id)); +} + +TEST_F(OutgoingShareSessionTest, + InitiateSendAttachmentsWithNonexistentFileAttachment) { + // Remove attachment file1. + Files::RemoveFile( + Files::GetTemporaryDirectory().append(FilePath(kFile1Name))); + EXPECT_CALL( + transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kMediaUnavailable), + IsFinalStatus()))); + + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsFalse()); + const std::vector& payloads = session_.file_payloads(); + + EXPECT_THAT(payloads, IsEmpty()); } TEST_F(OutgoingShareSessionTest, ConnectNoDisableWifiHotspot) { std::vector endpoint_info = {1, 2, 3, 4}; - std::vector bluetooth_mac_address = {5, 6, 7, 8}; - file1_.set_size(1000000); // 1MB - InitSendAttachments(CreateDefaultAttachmentContainer()); + // Set file size to 1MB. + CreateTempFile(kFile1Name, 1000000); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); NearbyConnectionImpl nearby_connection(device_info_); connections_manager_.set_nearby_connection(&nearby_connection); + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); session_.Connect( - endpoint_info, bluetooth_mac_address, - nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, + endpoint_info, nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/false, [&nearby_connection](absl::string_view endpoint_id, NearbyConnection* connection, Status status) { @@ -313,15 +291,18 @@ TEST_F(OutgoingShareSessionTest, ConnectNoDisableWifiHotspot) { TEST_F(OutgoingShareSessionTest, ConnectDisableWifiHotspot) { std::vector endpoint_info = {1, 2, 3, 4}; - std::vector bluetooth_mac_address = {5, 6, 7, 8}; - file1_.set_size(1000000); // 1MB - InitSendAttachments(CreateDefaultAttachmentContainer()); + // Set file size to 1MB. + CreateTempFile(kFile1Name, 1000000); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); NearbyConnectionImpl nearby_connection(device_info_); connections_manager_.set_nearby_connection(&nearby_connection); + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); session_.Connect( - endpoint_info, bluetooth_mac_address, - nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, + endpoint_info, nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/true, [&nearby_connection](absl::string_view endpoint_id, NearbyConnection* connection, Status status) { @@ -340,15 +321,17 @@ TEST_F(OutgoingShareSessionTest, ConnectDisableWifiHotspot) { } TEST_F(OutgoingShareSessionTest, OnConnectResultSuccessLogsSessionDuration) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); session_.set_session_id(1234); std::vector endpoint_info = {1, 2, 3, 4}; - std::vector bluetooth_mac_address = {5, 6, 7, 8}; NearbyConnectionImpl nearby_connection(device_info_); connections_manager_.set_nearby_connection(&nearby_connection); + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); session_.Connect( - endpoint_info, bluetooth_mac_address, - nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, + endpoint_info, nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/false, [&nearby_connection](absl::string_view endpoint_id, NearbyConnection* connection, Status status) { @@ -371,11 +354,14 @@ TEST_F(OutgoingShareSessionTest, OnConnectResultSuccessLogsSessionDuration) { } TEST_F(OutgoingShareSessionTest, OnConnectResultFailureLogsSessionDuration) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); 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, + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); + session_.Connect(endpoint_info, nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/false, [](absl::string_view endpoint_id, @@ -399,19 +385,12 @@ TEST_F(OutgoingShareSessionTest, OnConnectResultFailureLogsSessionDuration) { IsFalse()); } -TEST_F(OutgoingShareSessionTest, SendIntroductionWithoutPayloads) { - InitSendAttachments(CreateDefaultAttachmentContainer()); - EXPECT_THAT(session_.SendIntroduction([]() {}), IsFalse()); -} - TEST_F(OutgoingShareSessionTest, SendIntroductionSuccess) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); session_.set_session_id(1234); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); - session_.CreateFilePayloads(); - session_.CreateTextPayloads(); - session_.CreateWifiCredentialsPayloads(); EXPECT_CALL(mock_event_logger_, Log(Matcher(AllOf( (HasCategory(EventCategory::SENDING_EVENT), @@ -481,11 +460,10 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionTimeout) { std::vector{}, std::vector{}) .Build(); - InitSendAttachments(std::move(container)); + EXPECT_THAT(InitSendAttachments(std::move(container)), IsTrue()); session_.set_session_id(1234); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); - session_.CreateTextPayloads(); EXPECT_CALL(mock_event_logger_, Log(Matcher(AllOf( (HasCategory(EventCategory::SENDING_EVENT), @@ -509,11 +487,10 @@ TEST_F(OutgoingShareSessionTest, SendIntroductionTimeoutCancelled) { std::vector{}, std::vector{}) .Build(); - InitSendAttachments(std::move(container)); + EXPECT_THAT(InitSendAttachments(std::move(container)), IsTrue()); session_.set_session_id(1234); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); - session_.CreateTextPayloads(); EXPECT_CALL(mock_event_logger_, Log(Matcher(AllOf( (HasCategory(EventCategory::SENDING_EVENT), @@ -561,11 +538,10 @@ TEST_F(OutgoingShareSessionTest, AcceptTransferSuccess) { std::vector{}, std::vector{}) .Build(); - InitSendAttachments(std::move(container)); + EXPECT_THAT(InitSendAttachments(std::move(container)), IsTrue()); session_.set_session_id(1234); NearbyConnectionImpl connection(device_info_); ConnectionSuccess(&connection); - session_.CreateTextPayloads(); EXPECT_CALL(mock_event_logger_, Log(Matcher(AllOf( (HasCategory(EventCategory::SENDING_EVENT), @@ -666,11 +642,9 @@ TEST_F(OutgoingShareSessionTest, HandleConnectionResponseAcceptResponse) { } TEST_F(OutgoingShareSessionTest, SendPayloads) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); session_.set_session_id(1234); - session_.CreateFilePayloads(); - session_.CreateTextPayloads(); - session_.CreateWifiCredentialsPayloads(); MockFunction payload_transder_update_callback; StrictMock, @@ -707,11 +681,9 @@ TEST_F(OutgoingShareSessionTest, SendPayloads) { } TEST_F(OutgoingShareSessionTest, SendPayloadsSetsAdvancedProtectionFlags) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); session_.set_session_id(1234); - session_.CreateFilePayloads(); - session_.CreateTextPayloads(); - session_.CreateWifiCredentialsPayloads(); MockFunction payload_transder_update_callback; StrictMock, @@ -750,11 +722,9 @@ TEST_F(OutgoingShareSessionTest, SendPayloadsSetsAdvancedProtectionFlags) { } TEST_F(OutgoingShareSessionTest, SendNextPayload) { - InitSendAttachments(CreateDefaultAttachmentContainer()); + EXPECT_THAT(InitSendAttachments(CreateDefaultAttachmentContainer()), + IsTrue()); session_.set_session_id(1234); - session_.CreateFilePayloads(); - session_.CreateTextPayloads(); - session_.CreateWifiCredentialsPayloads(); MockFunction payload_transder_update_callback; StrictMock, @@ -877,8 +847,10 @@ TEST_F(OutgoingShareSessionTest, DelayCompleteDisconnectTimeout) { NearbyConnectionImpl connection(device_info_); 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, + EXPECT_CALL(transfer_metadata_callback_, + Call(_, AllOf(HasStatus(TransferMetadata::Status::kConnecting), + Not(IsFinalStatus())))); + session_.Connect(endpoint_info, nearby::sharing::proto::DataUsage::ONLINE_DATA_USAGE, /*disable_wifi_hotspot=*/false, [&](absl::string_view endpoint_id, diff --git a/sharing/outgoing_targets_manager_test.cc b/sharing/outgoing_targets_manager_test.cc index 732a8365..60965259 100644 --- a/sharing/outgoing_targets_manager_test.cc +++ b/sharing/outgoing_targets_manager_test.cc @@ -22,18 +22,17 @@ #include "protobuf-matchers/protocol-buffer-matchers.h" #include "gtest/gtest.h" #include "absl/strings/string_view.h" -#include "internal/base/file_path.h" #include "internal/test/fake_clock.h" #include "internal/test/fake_device_info.h" #include "internal/test/fake_task_runner.h" #include "sharing/analytics/analytics_recorder.h" #include "sharing/attachment_container.h" #include "sharing/fake_nearby_connections_manager.h" -#include "sharing/file_attachment.h" #include "sharing/nearby_connection_impl.h" #include "sharing/nearby_connections_types.h" #include "sharing/outgoing_share_session.h" #include "sharing/share_target.h" +#include "sharing/text_attachment.h" #include "sharing/transfer_metadata.h" namespace nearby::sharing { @@ -214,9 +213,12 @@ TEST_F(OutgoingTargetsManagerTest, onShareTargetLostConnectingNotClosed) { outgoing_targets_manager_.GetOutgoingShareSession(kShareTargetId); ASSERT_NE(session, nullptr); // InitiateSendAttachments is called when session starts connecting. - session->InitiateSendAttachments(AttachmentContainer::Builder() - .AddFileAttachment(FileAttachment(FilePath{""})) - .Build()); + session->InitiateSendAttachments( + AttachmentContainer::Builder() + .AddTextAttachment(TextAttachment( + nearby::sharing::service::proto::TextMetadata::ADDRESS, + "A bit of text body 2", "Some text title 2", "text/plain")) + .Build()); outgoing_targets_manager_.OnShareTargetLost(std::string(kEndpointId), Seconds(10));