| Index: webrtc/ortc/srtptransport_unittest.cc
|
| diff --git a/webrtc/ortc/srtptransport_unittest.cc b/webrtc/ortc/srtptransport_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1287a0257c404e21996c90e5b189872316081498
|
| --- /dev/null
|
| +++ b/webrtc/ortc/srtptransport_unittest.cc
|
| @@ -0,0 +1,167 @@
|
| +/*
|
| + * Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include <memory>
|
| +
|
| +#include "webrtc/base/gunit.h"
|
| +#include "webrtc/media/base/fakemediaengine.h"
|
| +#include "webrtc/ortc/ortcfactory.h"
|
| +#include "webrtc/ortc/testrtpparameters.h"
|
| +#include "webrtc/p2p/base/fakepackettransport.h"
|
| +
|
| +namespace webrtc {
|
| +
|
| +static const char kTestSha1KeyParams1[] =
|
| + "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
|
| +static const char kTestSha1KeyParams2[] =
|
| + "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
|
| +static const char kTestGcmKeyParams3[] =
|
| + "inline:e166KFlKzJsGW0d5apX+rrI05vxbrvMJEzFI14aTDCa63IRTlLK4iH66uOI=";
|
| +
|
| +static const cricket::CryptoParams kTestSha1CryptoParams1(
|
| + 1,
|
| + "AES_CM_128_HMAC_SHA1_80",
|
| + kTestSha1KeyParams1,
|
| + "");
|
| +static const cricket::CryptoParams kTestSha1CryptoParams2(
|
| + 1,
|
| + "AES_CM_128_HMAC_SHA1_80",
|
| + kTestSha1KeyParams2,
|
| + "");
|
| +static const cricket::CryptoParams kTestGcmCryptoParams3(1,
|
| + "AEAD_AES_256_GCM",
|
| + kTestGcmKeyParams3,
|
| + "");
|
| +
|
| +// This test uses fake packet transports and a fake media engine, in order to
|
| +// test the SrtpTransport at only an API level. Any end-to-end test should go in
|
| +// ortcfactory_integrationtest.cc instead.
|
| +class SrtpTransportTest : public testing::Test {
|
| + public:
|
| + SrtpTransportTest() {
|
| + fake_media_engine_ = new cricket::FakeMediaEngine();
|
| + // Note: This doesn't need to use fake network classes, since it uses
|
| + // FakePacketTransports.
|
| + auto result = OrtcFactory::Create(
|
| + nullptr, nullptr, nullptr, nullptr, nullptr,
|
| + std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
|
| + ortc_factory_ = result.MoveValue();
|
| + rtp_transport_controller_ =
|
| + ortc_factory_->CreateRtpTransportController().MoveValue();
|
| +
|
| + fake_packet_transport_.reset(new rtc::FakePacketTransport("fake"));
|
| + auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
|
| + rtcp_parameters_, fake_packet_transport_.get(), nullptr,
|
| + rtp_transport_controller_.get());
|
| + srtp_transport_ = srtp_transport_result.MoveValue();
|
| + }
|
| +
|
| + protected:
|
| + // Owned by |ortc_factory_|.
|
| + cricket::FakeMediaEngine* fake_media_engine_;
|
| + std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
|
| + std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
|
| + std::unique_ptr<SrtpTransportInterface> srtp_transport_;
|
| + RtcpParameters rtcp_parameters_;
|
| + std::unique_ptr<rtc::FakePacketTransport> fake_packet_transport_;
|
| +};
|
| +
|
| +// Tests that setting the SRTP send/receive key succeeds.
|
| +TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKey) {
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
| + auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
| + srtp_transport_.get());
|
| + EXPECT_TRUE(sender_result.ok());
|
| + auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
| + cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
| + EXPECT_TRUE(receiver_result.ok());
|
| +}
|
| +
|
| +// Tests that setting the SRTP send/receive key twice is not supported.
|
| +TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyTwice) {
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
| + srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams2).type());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
| + srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams1).type());
|
| + // Ensure that the senders and receivers can be created despite the previous
|
| + // errors.
|
| + auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
| + srtp_transport_.get());
|
| + EXPECT_TRUE(sender_result.ok());
|
| + auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
| + cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
| + EXPECT_TRUE(receiver_result.ok());
|
| +}
|
| +
|
| +// Test that the SRTP send key and receive key must have the same cipher suite.
|
| +TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyDifferentCipherSuite) {
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
|
| + srtp_transport_->SetSrtpReceiveKey(kTestGcmCryptoParams3).type());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
| + // Ensure that the senders and receivers can be created despite the previous
|
| + // error.
|
| + auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
|
| + srtp_transport_.get());
|
| + EXPECT_TRUE(sender_result.ok());
|
| + auto receiver_result = ortc_factory_->CreateRtpReceiver(
|
| + cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
|
| + EXPECT_TRUE(receiver_result.ok());
|
| +}
|
| +
|
| +class SrtpTransportTestWithMediaType
|
| + : public SrtpTransportTest,
|
| + public ::testing::WithParamInterface<cricket::MediaType> {};
|
| +
|
| +// Tests that the senders cannot be created before setting the keys.
|
| +TEST_P(SrtpTransportTestWithMediaType, CreateSenderBeforeSettingKeys) {
|
| + auto sender_result =
|
| + ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
| + sender_result =
|
| + ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
| + // Ensure that after the keys are set, a sender can be created, despite the
|
| + // previous errors.
|
| + sender_result =
|
| + ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
|
| + EXPECT_TRUE(sender_result.ok());
|
| +}
|
| +
|
| +// Tests that the receivers cannot be created before setting the keys.
|
| +TEST_P(SrtpTransportTestWithMediaType, CreateReceiverBeforeSettingKeys) {
|
| + auto receiver_result =
|
| + ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
|
| + receiver_result.error().type());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
|
| + receiver_result =
|
| + ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
| + EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
|
| + receiver_result.error().type());
|
| + EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
|
| + // Ensure that after the keys are set, a receiver can be created, despite the
|
| + // previous errors.
|
| + receiver_result =
|
| + ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
|
| + EXPECT_TRUE(receiver_result.ok());
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(SenderCreatationTest,
|
| + SrtpTransportTestWithMediaType,
|
| + ::testing::Values(cricket::MEDIA_TYPE_AUDIO,
|
| + cricket::MEDIA_TYPE_VIDEO));
|
| +
|
| +} // namespace webrtc
|
|
|