Skip to content

Commit b831eb8

Browse files
TommiWebRTC LUCI CQ
authored andcommitted
Refactor SSL stream adapter tests
This makes it easier to remove use of sigslot for SignalEvent since the tests were written in a way that could set more than one event handlers to the same callback method, which places unnecessary requirements on the definition of the callback object. I.e. the sigslot can't be replaced with a simple (single) std::function - which would be consistent with how the event callback is used elsewhere in the code. Bug: webrtc:11943 Change-Id: I7e596295b1b534d4d49334449b1e01535eedf06d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/344723 Reviewed-by: Harald Alvestrand <[email protected]> Commit-Queue: Tomas Gunnarsson <[email protected]> Cr-Commit-Position: refs/heads/main@{#42072}
1 parent 861e389 commit b831eb8

File tree

1 file changed

+87
-101
lines changed

1 file changed

+87
-101
lines changed

rtc_base/ssl_stream_adapter_unittest.cc

Lines changed: 87 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class SSLDummyStreamBase : public rtc::StreamInterface,
157157
rtc::StreamInterface* in,
158158
rtc::StreamInterface* out)
159159
: test_base_(test), side_(side), in_(in), out_(out), first_packet_(true) {
160+
RTC_DCHECK_NE(in, out);
160161
in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
161162
out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
162163
}
@@ -187,7 +188,7 @@ class SSLDummyStreamBase : public rtc::StreamInterface,
187188
int mask = (rtc::SE_READ | rtc::SE_CLOSE);
188189

189190
if (sig & mask) {
190-
RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
191+
RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEventIn side=" << side_
191192
<< " sig=" << sig << " forwarding upward";
192193
PostEvent(sig & mask, 0);
193194
}
@@ -196,7 +197,7 @@ class SSLDummyStreamBase : public rtc::StreamInterface,
196197
// Catch writeability events on out and pass them up.
197198
void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
198199
if (sig & rtc::SE_WRITE) {
199-
RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
200+
RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEventOut side=" << side_
200201
<< " sig=" << sig << " forwarding upward";
201202

202203
PostEvent(sig & rtc::SE_WRITE, 0);
@@ -327,8 +328,6 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
327328
client_private_key_pem_(client_private_key_pem),
328329
client_key_type_(client_key_type),
329330
server_key_type_(server_key_type),
330-
client_stream_(nullptr),
331-
server_stream_(nullptr),
332331
delay_(0),
333332
mtu_(1460),
334333
loss_(0),
@@ -347,16 +346,7 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
347346
}
348347

349348
void SetUp() override {
350-
CreateStreams();
351-
352-
client_ssl_ =
353-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
354-
server_ssl_ =
355-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
356-
357-
// Set up the slots
358-
client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
359-
server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
349+
InitializeClientAndServerStreams();
360350

361351
std::unique_ptr<rtc::SSLIdentity> client_identity;
362352
if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
@@ -376,21 +366,41 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
376366
server_ssl_.reset(nullptr);
377367
}
378368

379-
virtual void CreateStreams() = 0;
369+
virtual std::unique_ptr<rtc::StreamInterface> CreateClientStream() = 0;
370+
virtual std::unique_ptr<rtc::StreamInterface> CreateServerStream() = 0;
371+
372+
void InitializeClientAndServerStreams(
373+
absl::string_view client_experiment = "",
374+
absl::string_view server_experiment = "") {
375+
// Note: `client_ssl_` and `server_ssl_` may be non-nullptr.
376+
377+
// The legacy TLS protocols flag is read when the OpenSSLStreamAdapter is
378+
// initialized, so we set the field trials while constructing the adapters.
379+
using webrtc::test::ScopedFieldTrials;
380+
{
381+
std::unique_ptr<ScopedFieldTrials> trial(
382+
client_experiment.empty() ? nullptr
383+
: new ScopedFieldTrials(client_experiment));
384+
client_ssl_ = rtc::SSLStreamAdapter::Create(CreateClientStream());
385+
}
386+
{
387+
std::unique_ptr<ScopedFieldTrials> trial(
388+
server_experiment.empty() ? nullptr
389+
: new ScopedFieldTrials(server_experiment));
390+
server_ssl_ = rtc::SSLStreamAdapter::Create(CreateServerStream());
391+
}
392+
393+
client_ssl_->SignalEvent.connect(this,
394+
&SSLStreamAdapterTestBase::OnClientEvent);
395+
server_ssl_->SignalEvent.connect(this,
396+
&SSLStreamAdapterTestBase::OnServerEvent);
397+
}
380398

381399
// Recreate the client/server identities with the specified validity period.
382400
// `not_before` and `not_after` are offsets from the current time in number
383401
// of seconds.
384402
void ResetIdentitiesWithValidity(int not_before, int not_after) {
385-
CreateStreams();
386-
387-
client_ssl_ =
388-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
389-
server_ssl_ =
390-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
391-
392-
client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
393-
server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
403+
InitializeClientAndServerStreams();
394404

395405
time_t now = time(nullptr);
396406

@@ -412,18 +422,6 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
412422
server_ssl_->SetIdentity(std::move(server_identity));
413423
}
414424

415-
virtual void OnEvent(rtc::StreamInterface* stream, int sig, int err) {
416-
RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
417-
418-
if (sig & rtc::SE_READ) {
419-
ReadData(stream);
420-
}
421-
422-
if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
423-
WriteData();
424-
}
425-
}
426-
427425
void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
428426
unsigned char server_digest[20];
429427
size_t server_digest_len;
@@ -755,6 +753,30 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
755753
virtual void ReadData(rtc::StreamInterface* stream) = 0;
756754
virtual void TestTransfer(int size) = 0;
757755

756+
private:
757+
void OnClientEvent(rtc::StreamInterface* stream, int sig, int err) {
758+
RTC_DCHECK_EQ(stream, client_ssl_.get());
759+
RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnClientEvent sig="
760+
<< sig;
761+
762+
if (sig & rtc::SE_READ) {
763+
ReadData(stream);
764+
}
765+
766+
if (sig & rtc::SE_WRITE) {
767+
WriteData();
768+
}
769+
}
770+
771+
void OnServerEvent(rtc::StreamInterface* stream, int sig, int err) {
772+
RTC_DCHECK_EQ(stream, server_ssl_.get());
773+
RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnServerEvent sig="
774+
<< sig;
775+
if (sig & rtc::SE_READ) {
776+
ReadData(stream);
777+
}
778+
}
779+
758780
protected:
759781
rtc::SSLIdentity* client_identity() const {
760782
if (!client_ssl_) {
@@ -774,8 +796,6 @@ class SSLStreamAdapterTestBase : public ::testing::Test,
774796
std::string client_private_key_pem_;
775797
rtc::KeyParams client_key_type_;
776798
rtc::KeyParams server_key_type_;
777-
SSLDummyStreamBase* client_stream_; // freed by client_ssl_ destructor
778-
SSLDummyStreamBase* server_stream_; // freed by server_ssl_ destructor
779799
std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
780800
std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
781801
int delay_;
@@ -801,11 +821,14 @@ class SSLStreamAdapterTestTLS
801821
client_buffer_(kFifoBufferSize),
802822
server_buffer_(kFifoBufferSize) {}
803823

804-
void CreateStreams() override {
805-
client_stream_ =
806-
new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
807-
server_stream_ =
808-
new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
824+
std::unique_ptr<rtc::StreamInterface> CreateClientStream() override final {
825+
return absl::WrapUnique(
826+
new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_));
827+
}
828+
829+
std::unique_ptr<rtc::StreamInterface> CreateServerStream() override final {
830+
return absl::WrapUnique(
831+
new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_));
809832
}
810833

811834
// Test data transfer for TLS
@@ -877,7 +900,7 @@ class SSLStreamAdapterTestTLS
877900
}
878901
}
879902

880-
void ReadData(rtc::StreamInterface* stream) override {
903+
void ReadData(rtc::StreamInterface* stream) override final {
881904
uint8_t buffer[1600];
882905
size_t bread;
883906
int err2;
@@ -930,11 +953,14 @@ class SSLStreamAdapterTestDTLSBase : public SSLStreamAdapterTestBase {
930953
count_(0),
931954
sent_(0) {}
932955

933-
void CreateStreams() override {
934-
client_stream_ =
935-
new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
936-
server_stream_ =
937-
new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
956+
std::unique_ptr<rtc::StreamInterface> CreateClientStream() override final {
957+
return absl::WrapUnique(
958+
new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_));
959+
}
960+
961+
std::unique_ptr<rtc::StreamInterface> CreateServerStream() override final {
962+
return absl::WrapUnique(
963+
new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_));
938964
}
939965

940966
void WriteData() override {
@@ -968,7 +994,7 @@ class SSLStreamAdapterTestDTLSBase : public SSLStreamAdapterTestBase {
968994
delete[] packet;
969995
}
970996

971-
void ReadData(rtc::StreamInterface* stream) override {
997+
void ReadData(rtc::StreamInterface* stream) override final {
972998
uint8_t buffer[2000];
973999
size_t bread;
9741000
int err2;
@@ -1077,20 +1103,7 @@ class SSLStreamAdapterTestDTLSCertChain : public SSLStreamAdapterTestDTLS {
10771103
public:
10781104
SSLStreamAdapterTestDTLSCertChain() : SSLStreamAdapterTestDTLS("", "") {}
10791105
void SetUp() override {
1080-
CreateStreams();
1081-
1082-
client_ssl_ =
1083-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
1084-
server_ssl_ =
1085-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
1086-
1087-
// Set up the slots
1088-
client_ssl_->SignalEvent.connect(
1089-
reinterpret_cast<SSLStreamAdapterTestBase*>(this),
1090-
&SSLStreamAdapterTestBase::OnEvent);
1091-
server_ssl_->SignalEvent.connect(
1092-
reinterpret_cast<SSLStreamAdapterTestBase*>(this),
1093-
&SSLStreamAdapterTestBase::OnEvent);
1106+
InitializeClientAndServerStreams();
10941107

10951108
std::unique_ptr<rtc::SSLIdentity> client_identity;
10961109
if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
@@ -1625,65 +1638,38 @@ class SSLStreamAdapterTestDTLSExtensionPermutation
16251638
rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)) {
16261639
}
16271640

1628-
// Do not use the SetUp version from the parent class.
1629-
void SetUp() override {}
1630-
1631-
// The legacy TLS protocols flag is read when the OpenSSLStreamAdapter is
1632-
// initialized, so we set the experiment while creationg client_ssl_
1633-
// and server_ssl_.
1634-
1635-
void ConfigureClient(absl::string_view experiment) {
1636-
webrtc::test::ScopedFieldTrials trial{std::string(experiment)};
1637-
client_stream_ =
1638-
new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
1639-
client_ssl_ =
1640-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
1641-
client_ssl_->SignalEvent.connect(
1642-
static_cast<SSLStreamAdapterTestBase*>(this),
1643-
&SSLStreamAdapterTestBase::OnEvent);
1644-
auto client_identity = rtc::SSLIdentity::Create("client", client_key_type_);
1645-
client_ssl_->SetIdentity(std::move(client_identity));
1646-
}
1647-
1648-
void ConfigureServer(absl::string_view experiment) {
1649-
webrtc::test::ScopedFieldTrials trial{std::string(experiment)};
1650-
server_stream_ =
1651-
new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
1652-
server_ssl_ =
1653-
rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
1654-
server_ssl_->SignalEvent.connect(
1655-
static_cast<SSLStreamAdapterTestBase*>(this),
1656-
&SSLStreamAdapterTestBase::OnEvent);
1641+
void Initialize(absl::string_view client_experiment,
1642+
absl::string_view server_experiment) {
1643+
InitializeClientAndServerStreams(client_experiment, server_experiment);
1644+
client_ssl_->SetIdentity(
1645+
rtc::SSLIdentity::Create("client", client_key_type_));
16571646
server_ssl_->SetIdentity(
16581647
rtc::SSLIdentity::Create("server", server_key_type_));
16591648
}
16601649
};
16611650

16621651
TEST_F(SSLStreamAdapterTestDTLSExtensionPermutation,
16631652
ClientDefaultServerDefault) {
1664-
ConfigureClient("");
1665-
ConfigureServer("");
1653+
Initialize("", "");
16661654
TestHandshake();
16671655
}
16681656

16691657
TEST_F(SSLStreamAdapterTestDTLSExtensionPermutation,
16701658
ClientDefaultServerPermute) {
1671-
ConfigureClient("");
1672-
ConfigureServer("WebRTC-PermuteTlsClientHello/Enabled/");
1659+
Initialize("", "WebRTC-PermuteTlsClientHello/Enabled/");
16731660
TestHandshake();
16741661
}
16751662

16761663
TEST_F(SSLStreamAdapterTestDTLSExtensionPermutation,
16771664
ClientPermuteServerDefault) {
1678-
ConfigureClient("WebRTC-PermuteTlsClientHello/Enabled/");
1679-
ConfigureServer("");
1665+
Initialize("WebRTC-PermuteTlsClientHello/Enabled/", "");
16801666
TestHandshake();
16811667
}
16821668

16831669
TEST_F(SSLStreamAdapterTestDTLSExtensionPermutation,
16841670
ClientPermuteServerPermute) {
1685-
ConfigureClient("WebRTC-PermuteTlsClientHello/Enabled/");
1686-
ConfigureServer("WebRTC-PermuteTlsClientHello/Enabled/");
1671+
Initialize("WebRTC-PermuteTlsClientHello/Enabled/",
1672+
"WebRTC-PermuteTlsClientHello/Enabled/");
16871673
TestHandshake();
16881674
}
16891675
#endif // OPENSSL_IS_BORINGSSL

0 commit comments

Comments
 (0)