
This CL is in preparation for moving Resource to the api/ folder. It does not move it, but makes it such that the moving CL can be a pure move. In order to do this, we must stop depending on rtc_base/rtc::TaskQueue in favor of api/webrtc::TaskQueueBase. There are also other rtc_base/ dependencies that we do not want to expose to the api/ folder, like critical sections and thread annotations which are not publically exposed. To get around this, we make Resource an abstract interface and move all of the base class functionality into a new non-api/ class: VideoStreamEncoderResource. The Resource now has Register/UnregisterAdaptationTaskQueue() methods. By explicitly unregistering, we can ensure validity of the pointer even if the Resource outlives the PeerConnection. While public interface methods are only to be called on the adaptation task queue, posting to the task queue happens off-queue, so a |lock_| is introduced to guard it. Bug: webrtc:11525 Change-Id: I50b3a30960cdec9032016c779b47001c01dad32f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176320 Reviewed-by: Evan Shrubsole <eshr@google.com> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31402}
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
/*
|
|
* Copyright 2020 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 "call/adaptation/resource.h"
|
|
|
|
#include <memory>
|
|
|
|
#include "api/scoped_refptr.h"
|
|
#include "call/adaptation/test/fake_resource.h"
|
|
#include "rtc_base/event.h"
|
|
#include "rtc_base/task_queue_for_test.h"
|
|
#include "test/gmock.h"
|
|
#include "test/gtest.h"
|
|
|
|
namespace webrtc {
|
|
|
|
using ::testing::_;
|
|
using ::testing::StrictMock;
|
|
|
|
class MockResourceListener : public ResourceListener {
|
|
public:
|
|
MOCK_METHOD(void,
|
|
OnResourceUsageStateMeasured,
|
|
(rtc::scoped_refptr<Resource> resource),
|
|
(override));
|
|
};
|
|
|
|
class ResourceTest : public ::testing::Test {
|
|
public:
|
|
ResourceTest()
|
|
: resource_adaptation_queue_("ResourceAdaptationQueue"),
|
|
fake_resource_(FakeResource::Create("FakeResource")) {
|
|
fake_resource_->RegisterAdaptationTaskQueue(
|
|
resource_adaptation_queue_.Get());
|
|
}
|
|
|
|
protected:
|
|
const std::unique_ptr<TaskQueueFactory> task_queue_factory_;
|
|
TaskQueueForTest resource_adaptation_queue_;
|
|
rtc::scoped_refptr<FakeResource> fake_resource_;
|
|
};
|
|
|
|
TEST_F(ResourceTest, RegisteringListenerReceivesCallbacks) {
|
|
resource_adaptation_queue_.SendTask(
|
|
[this] {
|
|
StrictMock<MockResourceListener> resource_listener;
|
|
fake_resource_->SetResourceListener(&resource_listener);
|
|
EXPECT_CALL(resource_listener, OnResourceUsageStateMeasured(_))
|
|
.Times(1)
|
|
.WillOnce([](rtc::scoped_refptr<Resource> resource) {
|
|
EXPECT_EQ(ResourceUsageState::kOveruse, resource->UsageState());
|
|
});
|
|
fake_resource_->set_usage_state(ResourceUsageState::kOveruse);
|
|
fake_resource_->SetResourceListener(nullptr);
|
|
},
|
|
RTC_FROM_HERE);
|
|
}
|
|
|
|
TEST_F(ResourceTest, UnregisteringListenerStopsCallbacks) {
|
|
resource_adaptation_queue_.SendTask(
|
|
[this] {
|
|
StrictMock<MockResourceListener> resource_listener;
|
|
fake_resource_->SetResourceListener(&resource_listener);
|
|
fake_resource_->SetResourceListener(nullptr);
|
|
EXPECT_CALL(resource_listener, OnResourceUsageStateMeasured(_))
|
|
.Times(0);
|
|
fake_resource_->set_usage_state(ResourceUsageState::kOveruse);
|
|
},
|
|
RTC_FROM_HERE);
|
|
}
|
|
|
|
} // namespace webrtc
|