diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source_test.cc | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source_test.cc b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source_test.cc new file mode 100644 index 00000000000..297f93e3303 --- /dev/null +++ b/chromium/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source_test.cc @@ -0,0 +1,104 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_underlying_source.h" +#include <memory> + +#include "base/test/mock_callback.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_encoded_audio_frame.h" +#include "third_party/blink/renderer/core/streams/readable_stream.h" +#include "third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h" +#include "third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/webrtc/api/frame_transformer_interface.h" + +namespace blink { + +namespace { +class FakeTransformableFrame : public webrtc::TransformableFrameInterface { + public: + FakeTransformableFrame() = default; + ~FakeTransformableFrame() override = default; + + rtc::ArrayView<const uint8_t> GetData() const override { return nullptr; } + void SetData(rtc::ArrayView<const uint8_t> data) override {} + uint32_t GetTimestamp() const override { return 0; } + uint32_t GetSsrc() const override { return 0; } +}; +} // namespace + +class RTCEncodedAudioUnderlyingSourceTest : public testing::Test { + public: + RTCEncodedAudioUnderlyingSource* CreateSource(ScriptState* script_state, + bool is_receiver = false) { + return MakeGarbageCollected<RTCEncodedAudioUnderlyingSource>( + script_state, WTF::Bind(disconnect_callback_.Get()), is_receiver); + } + + protected: + base::MockOnceClosure disconnect_callback_; +}; + +TEST_F(RTCEncodedAudioUnderlyingSourceTest, + SourceDataFlowsThroughStreamAndCloses) { + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + auto* source = CreateSource(script_state); + auto* stream = + ReadableStream::CreateWithCountQueueingStrategy(script_state, source, 0); + + NonThrowableExceptionState exception_state; + auto* reader = stream->getReader(script_state, exception_state); + + ScriptPromiseTester read_tester(script_state, + reader->read(script_state, exception_state)); + EXPECT_FALSE(read_tester.IsFulfilled()); + source->OnFrameFromSource(std::make_unique<FakeTransformableFrame>()); + read_tester.WaitUntilSettled(); + EXPECT_TRUE(read_tester.IsFulfilled()); + + EXPECT_CALL(disconnect_callback_, Run()); + source->Close(); +} + +TEST_F(RTCEncodedAudioUnderlyingSourceTest, CancelStream) { + V8TestingScope v8_scope; + auto* source = CreateSource(v8_scope.GetScriptState()); + auto* stream = ReadableStream::CreateWithCountQueueingStrategy( + v8_scope.GetScriptState(), source, 0); + + EXPECT_CALL(disconnect_callback_, Run()); + NonThrowableExceptionState exception_state; + stream->cancel(v8_scope.GetScriptState(), exception_state); +} + +TEST_F(RTCEncodedAudioUnderlyingSourceTest, + QueuedFramesAreDroppedWhenOverflow) { + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + auto* source = CreateSource(script_state); + // Create a stream, to ensure there is a controller associated to the source. + ReadableStream::CreateWithCountQueueingStrategy(v8_scope.GetScriptState(), + source, 0); + for (int i = 0; i > RTCEncodedAudioUnderlyingSource::kMinQueueDesiredSize; + --i) { + EXPECT_EQ(source->Controller()->DesiredSize(), i); + source->OnFrameFromSource(std::make_unique<FakeTransformableFrame>()); + } + EXPECT_EQ(source->Controller()->DesiredSize(), + RTCEncodedAudioUnderlyingSource::kMinQueueDesiredSize); + + source->OnFrameFromSource(std::make_unique<FakeTransformableFrame>()); + EXPECT_EQ(source->Controller()->DesiredSize(), + RTCEncodedAudioUnderlyingSource::kMinQueueDesiredSize); + + EXPECT_CALL(disconnect_callback_, Run()); + source->Close(); +} + +} // namespace blink |