Skip to content

Commit 9a98e8d

Browse files
ftsuicopybara-github
authored andcommitted
Fix updating OutgoingShareSession for dedup.
PiperOrigin-RevId: 725347879
1 parent 6eb9675 commit 9a98e8d

File tree

6 files changed

+82
-26
lines changed

6 files changed

+82
-26
lines changed

sharing/outgoing_share_session.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <utility>
2626
#include <vector>
2727

28+
#include "absl/functional/any_invocable.h"
2829
#include "absl/strings/string_view.h"
2930
#include "absl/time/time.h"
3031
#include "internal/platform/clock.h"
@@ -116,7 +117,7 @@ OutgoingShareSession::OutgoingShareSession(
116117
NearbyConnectionsManager* connections_manager,
117118
analytics::AnalyticsRecorder& analytics_recorder, std::string endpoint_id,
118119
const ShareTarget& share_target,
119-
std::function<void(OutgoingShareSession&, const TransferMetadata&)>
120+
absl::AnyInvocable<void(OutgoingShareSession&, const TransferMetadata&)>
120121
transfer_update_callback)
121122
: ShareSession(clock, service_thread, connections_manager,
122123
analytics_recorder, std::move(endpoint_id), share_target),
@@ -489,18 +490,23 @@ void OutgoingShareSession::DelayComplete(
489490
});
490491
}
491492

492-
void OutgoingShareSession::UpdateSessionForDedup(
493+
bool OutgoingShareSession::UpdateSessionForDedup(
493494
const ShareTarget& share_target,
494495
std::optional<NearbyShareDecryptedPublicCertificate> certificate,
495496
absl::string_view endpoint_id) {
496-
if (IsConnected()) return;
497+
LOG_IF(DFATAL, share_target.id != this->share_target().id)
498+
<< "Share target id cannot be changed during deduplication.";
497499
set_share_target(share_target);
500+
if (IsConnected()) {
501+
return false;
502+
}
498503
set_endpoint_id(endpoint_id);
499504
if (certificate.has_value()) {
500505
set_certificate(std::move(certificate.value()));
501506
} else {
502507
clear_certificate();
503508
}
509+
return true;
504510
}
505511

506512
void OutgoingShareSession::Connect(

sharing/outgoing_share_session.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <utility>
2525
#include <vector>
2626

27+
#include "absl/functional/any_invocable.h"
2728
#include "absl/strings/string_view.h"
2829
#include "absl/time/time.h"
2930
#include "internal/platform/clock.h"
@@ -53,7 +54,7 @@ class OutgoingShareSession : public ShareSession {
5354
NearbyConnectionsManager* connections_manager,
5455
analytics::AnalyticsRecorder& analytics_recorder, std::string endpoint_id,
5556
const ShareTarget& share_target,
56-
std::function<void(OutgoingShareSession&, const TransferMetadata&)>
57+
absl::AnyInvocable<void(OutgoingShareSession&, const TransferMetadata&)>
5758
transfer_update_callback);
5859
OutgoingShareSession(OutgoingShareSession&&);
5960
~OutgoingShareSession() override;
@@ -137,8 +138,11 @@ class OutgoingShareSession : public ShareSession {
137138
// A 1 min timer is setup so that if we do not receive disconnect from
138139
// receiver, we assume the transfer has failed.
139140
void DelayComplete(const TransferMetadata& complete_metadata);
140-
// Used only for OutgoingShareSession De-duplication.
141-
void UpdateSessionForDedup(
141+
// Updates the share target in the session to `share_target`.
142+
// If the session is not connected, also updates the `certificate` and
143+
// `endpoint_id`.
144+
// Returns true if the session is not connected and updated successfully.
145+
bool UpdateSessionForDedup(
142146
const ShareTarget& share_target,
143147
std::optional<NearbyShareDecryptedPublicCertificate> certificate,
144148
absl::string_view endpoint_id);
@@ -177,7 +181,7 @@ class OutgoingShareSession : public ShareSession {
177181
std::vector<Payload> file_payloads_;
178182
std::vector<Payload> wifi_credentials_payloads_;
179183
Status connection_layer_status_ = Status::kUnknown;
180-
std::function<void(OutgoingShareSession&, const TransferMetadata&)>
184+
absl::AnyInvocable<void(OutgoingShareSession&, const TransferMetadata&)>
181185
transfer_update_callback_;
182186
bool ready_for_accept_ = false;
183187
// This alarm is used to disconnect the sharing connection if both sides do

sharing/outgoing_share_session_test.cc

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ using ::testing::IsFalse;
7878
using ::testing::IsTrue;
7979
using ::testing::Matcher;
8080
using ::testing::MockFunction;
81+
using ::testing::Not;
8182
using ::testing::Property;
8283
using ::testing::SizeIs;
8384
using ::testing::StrictMock;
@@ -876,45 +877,67 @@ TEST_F(OutgoingShareSessionTest, DelayCompleteDisconnectTimeout) {
876877

877878
TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupWithCertificate) {
878879
EXPECT_FALSE(session_.certificate().has_value());
879-
EXPECT_FALSE(session_.self_share());
880-
ShareTarget share_target2{
881-
"test_update_name", ::nearby::network::Url(), ShareTargetType::kPhone,
882-
/* is_incoming */ true, "test_update_full_name",
883-
/* is_known */ true, "test_update_device_id", true};
880+
ShareTarget share_target2{"test_update_name", ::nearby::network::Url(),
881+
ShareTargetType::kPhone,
882+
/* is_incoming */ true, "test_update_full_name",
883+
/* is_known */ true, "test_update_device_id",
884+
/*for_self_share=*/true};
885+
share_target2.id = session_.share_target().id;
886+
EXPECT_THAT(session_.share_target(), Not(Eq(share_target2)));
887+
884888
session_.UpdateSessionForDedup(share_target2,
885889
GetNearbyShareTestDecryptedPublicCertificate(),
886890
"test_update_endpoint_id");
887-
EXPECT_THAT(session_.share_target().ToString(), Eq(share_target2.ToString()));
891+
892+
EXPECT_THAT(session_.share_target(), Eq(share_target2));
888893
EXPECT_TRUE(session_.certificate().has_value());
889894
EXPECT_THAT(session_.endpoint_id(), Eq("test_update_endpoint_id"));
890895
EXPECT_TRUE(session_.self_share());
891896
}
892897

893898
TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupWithoutCertificate) {
894899
session_.set_certificate(GetNearbyShareTestDecryptedPublicCertificate());
895-
ShareTarget share_target2{
896-
"test_update_name", ::nearby::network::Url(), ShareTargetType::kPhone,
897-
/* is_incoming */ true, "test_update_full_name",
898-
/* is_known */ true, "test_update_device_id", true};
900+
EXPECT_TRUE(session_.certificate().has_value());
901+
ShareTarget share_target2{"test_update_name", ::nearby::network::Url(),
902+
ShareTargetType::kPhone,
903+
/* is_incoming */ true, "test_update_full_name",
904+
/* is_known */ true, "test_update_device_id",
905+
/*for_self_share=*/true};
906+
share_target2.id = session_.share_target().id;
907+
EXPECT_THAT(session_.share_target(), Not(Eq(share_target2)));
908+
899909
session_.UpdateSessionForDedup(share_target2, std::nullopt,
900910
"test_update_endpoint_id");
911+
912+
EXPECT_THAT(session_.share_target(), Eq(share_target2));
901913
// Certificate is cleared.
902914
EXPECT_FALSE(session_.certificate().has_value());
915+
EXPECT_THAT(session_.endpoint_id(), Eq("test_update_endpoint_id"));
916+
EXPECT_TRUE(session_.self_share());
903917
}
904918

905-
TEST_F(OutgoingShareSessionTest, UpdateSessionForDedupConnectedIsNoOp) {
906-
auto share_target_org = session_.share_target();
919+
TEST_F(OutgoingShareSessionTest,
920+
UpdateSessionForDedupConnectedDoesNotUpdateCertAndEndpointId) {
921+
auto endpoint_id_org = session_.endpoint_id();
907922
NearbyConnectionImpl connection(device_info_);
908923
session_.set_session_id(1234);
909924
ConnectionSuccess(&connection);
910-
ShareTarget share_target2{
911-
"test_update_name", ::nearby::network::Url(), ShareTargetType::kPhone,
912-
/* is_incoming */ true, "test_update_full_name",
913-
/* is_known */ true, "test_update_device_id", true};
925+
session_.set_certificate(GetNearbyShareTestDecryptedPublicCertificate());
926+
EXPECT_TRUE(session_.certificate().has_value());
927+
ShareTarget share_target2{"test_update_name", ::nearby::network::Url(),
928+
ShareTargetType::kPhone,
929+
/* is_incoming */ true, "test_update_full_name",
930+
/* is_known */ true, "test_update_device_id",
931+
/*for_self_share=*/true};
932+
share_target2.id = session_.share_target().id;
933+
EXPECT_THAT(session_.share_target(), Not(Eq(share_target2)));
934+
914935
session_.UpdateSessionForDedup(share_target2, std::nullopt,
915936
"test_update_endpoint_id");
916-
EXPECT_THAT(session_.share_target().ToString(),
917-
Eq(share_target_org.ToString()));
937+
938+
EXPECT_THAT(session_.share_target(), Eq(share_target2));
939+
EXPECT_TRUE(session_.certificate().has_value());
940+
EXPECT_THAT(session_.endpoint_id(), Eq(endpoint_id_org));
918941
}
919942
} // namespace
920943
} // namespace nearby::sharing

sharing/share_target.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,15 @@ std::string ShareTarget::ToString() const {
8787
return absl::StrCat("ShareTarget<", absl::StrJoin(fmt, ", "), ">");
8888
}
8989

90+
bool ShareTarget::operator==(const ShareTarget& other) const {
91+
return id == other.id && device_name == other.device_name &&
92+
image_url == other.image_url && type == other.type &&
93+
is_incoming == other.is_incoming && full_name == other.full_name &&
94+
is_known == other.is_known && device_id == other.device_id &&
95+
for_self_share == other.for_self_share &&
96+
vendor_id == other.vendor_id &&
97+
receive_disabled == other.receive_disabled;
98+
}
99+
90100
} // namespace sharing
91101
} // namespace nearby

sharing/share_target.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ struct ShareTarget {
4242

4343
std::string ToString() const;
4444

45+
bool operator==(const ShareTarget& other) const;
46+
4547
int64_t id;
4648
std::string device_name;
4749
// Uri that points to an image of the ShareTarget, if one exists.

sharing/share_target_test.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,21 @@ using ShareTargetToStringTest =
6464
testing::TestWithParam<ShareTargetToStringTestData>;
6565

6666
TEST_P(ShareTargetToStringTest, ToStringResultMatches) {
67-
ShareTarget test_share_target = GetParam().share_target;
67+
const ShareTarget& test_share_target = GetParam().share_target;
6868
EXPECT_EQ(GetParam().expected_string_result, test_share_target.ToString());
6969
}
7070

71+
TEST_P(ShareTargetToStringTest, EqualsResultMatches) {
72+
const ShareTarget& test_share_target = GetParam().share_target;
73+
EXPECT_EQ(test_share_target, test_share_target);
74+
}
75+
76+
TEST_P(ShareTargetToStringTest, EqualsCopyConstructionResultMatches) {
77+
const ShareTarget& test_share_target = GetParam().share_target;
78+
ShareTarget copy_share_target = test_share_target;
79+
EXPECT_EQ(test_share_target, copy_share_target);
80+
}
81+
7182
INSTANTIATE_TEST_SUITE_P(ShareTargetToStringTest, ShareTargetToStringTest,
7283
testing::ValuesIn(GetTestData()));
7384

0 commit comments

Comments
 (0)