1 /*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #undef LOG_TAG
18 #define LOG_TAG "TunnelModeEnabledReporterTest"
19
20 #include <android/gui/BnTunnelModeEnabledListener.h>
21 #include <gmock/gmock.h>
22 #include <gtest/gtest.h>
23 #include <gui/LayerMetadata.h>
24
25 #include "TestableSurfaceFlinger.h"
26 #include "TunnelModeEnabledReporter.h"
27 #include "mock/DisplayHardware/MockComposer.h"
28
29 namespace android {
30
31 using testing::_;
32 using testing::Mock;
33 using testing::Return;
34
35 using android::Hwc2::IComposer;
36 using android::Hwc2::IComposerClient;
37
38 constexpr int DEFAULT_SIDEBAND_STREAM = 51;
39
40 struct TestableTunnelModeEnabledListener : public gui::BnTunnelModeEnabledListener {
TestableTunnelModeEnabledListenerandroid::TestableTunnelModeEnabledListener41 TestableTunnelModeEnabledListener() {}
42
43 bool mTunnelModeEnabled = false;
44
onTunnelModeEnabledChangedandroid::TestableTunnelModeEnabledListener45 binder::Status onTunnelModeEnabledChanged(bool tunnelModeEnabled) override {
46 mTunnelModeEnabled = tunnelModeEnabled;
47 return binder::Status::ok();
48 }
49 };
50
51 class TunnelModeEnabledReporterTest : public testing::Test {
52 public:
53 TunnelModeEnabledReporterTest();
54 ~TunnelModeEnabledReporterTest() override;
55
56 protected:
57 static constexpr uint32_t WIDTH = 100;
58 static constexpr uint32_t HEIGHT = 100;
59 static constexpr uint32_t LAYER_FLAGS = 0;
60
61 sp<Layer> createBufferStateLayer(LayerMetadata metadata);
62
63 TestableSurfaceFlinger mFlinger;
64 Hwc2::mock::Composer* mComposer = nullptr;
65
66 sp<TestableTunnelModeEnabledListener> mTunnelModeEnabledListener =
67 sp<TestableTunnelModeEnabledListener>::make();
68
69 sp<TunnelModeEnabledReporter> mTunnelModeEnabledReporter =
70 sp<TunnelModeEnabledReporter>::make();
71 };
72
TunnelModeEnabledReporterTest()73 TunnelModeEnabledReporterTest::TunnelModeEnabledReporterTest() {
74 const ::testing::TestInfo* const test_info =
75 ::testing::UnitTest::GetInstance()->current_test_info();
76 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
77
78 mFlinger.setupMockScheduler();
79 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
80 mFlinger.flinger()->mTunnelModeEnabledReporter = mTunnelModeEnabledReporter;
81 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(false);
82 }
83
~TunnelModeEnabledReporterTest()84 TunnelModeEnabledReporterTest::~TunnelModeEnabledReporterTest() {
85 const ::testing::TestInfo* const test_info =
86 ::testing::UnitTest::GetInstance()->current_test_info();
87 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
88 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(false);
89 mTunnelModeEnabledReporter->removeListener(mTunnelModeEnabledListener);
90 }
91
createBufferStateLayer(LayerMetadata metadata={})92 sp<Layer> TunnelModeEnabledReporterTest::createBufferStateLayer(LayerMetadata metadata = {}) {
93 sp<Client> client;
94 LayerCreationArgs args(mFlinger.flinger(), client, "buffer-state-layer", LAYER_FLAGS, metadata);
95 return sp<Layer>::make(args);
96 }
97
98 namespace {
99
TEST_F(TunnelModeEnabledReporterTest,callsAddedListeners)100 TEST_F(TunnelModeEnabledReporterTest, callsAddedListeners) {
101 mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener);
102
103 bool expectedTunnelModeEnabled = false;
104 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(expectedTunnelModeEnabled);
105 EXPECT_EQ(expectedTunnelModeEnabled, mTunnelModeEnabledListener->mTunnelModeEnabled);
106
107 expectedTunnelModeEnabled = true;
108 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(expectedTunnelModeEnabled);
109 EXPECT_EQ(expectedTunnelModeEnabled, mTunnelModeEnabledListener->mTunnelModeEnabled);
110
111 mTunnelModeEnabledReporter->removeListener(mTunnelModeEnabledListener);
112
113 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(false);
114 EXPECT_EQ(expectedTunnelModeEnabled, mTunnelModeEnabledListener->mTunnelModeEnabled);
115 }
116
TEST_F(TunnelModeEnabledReporterTest,callsNewListenerImmediately)117 TEST_F(TunnelModeEnabledReporterTest, callsNewListenerImmediately) {
118 bool expectedTunnelModeEnabled = false;
119 mTunnelModeEnabledReporter->dispatchTunnelModeEnabled(expectedTunnelModeEnabled);
120
121 mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener);
122 EXPECT_EQ(expectedTunnelModeEnabled, mTunnelModeEnabledListener->mTunnelModeEnabled);
123 }
124
TEST_F(TunnelModeEnabledReporterTest,callsNewListenerWithFreshInformation)125 TEST_F(TunnelModeEnabledReporterTest, callsNewListenerWithFreshInformation) {
126 sp<Layer> layer = createBufferStateLayer();
127 sp<NativeHandle> stream =
128 NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM),
129 false);
130 layer->setSidebandStream(stream, FrameTimelineInfo{}, 20, gui::GameMode::Unsupported);
131 mTunnelModeEnabledReporter->updateTunnelModeStatus();
132 mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener);
133 EXPECT_EQ(true, mTunnelModeEnabledListener->mTunnelModeEnabled);
134 mTunnelModeEnabledReporter->removeListener(mTunnelModeEnabledListener);
135 layer = nullptr;
136
137 mTunnelModeEnabledReporter->updateTunnelModeStatus();
138 mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener);
139
140 EXPECT_EQ(false, mTunnelModeEnabledListener->mTunnelModeEnabled);
141 }
142
TEST_F(TunnelModeEnabledReporterTest,layerWithSidebandStreamTriggersUpdate)143 TEST_F(TunnelModeEnabledReporterTest, layerWithSidebandStreamTriggersUpdate) {
144 mTunnelModeEnabledReporter->addListener(mTunnelModeEnabledListener);
145 EXPECT_EQ(false, mTunnelModeEnabledListener->mTunnelModeEnabled);
146
147 sp<Layer> simpleLayer = createBufferStateLayer();
148 sp<Layer> layerWithSidebandStream = createBufferStateLayer();
149 sp<NativeHandle> stream =
150 NativeHandle::create(reinterpret_cast<native_handle_t*>(DEFAULT_SIDEBAND_STREAM),
151 false);
152 layerWithSidebandStream->setSidebandStream(stream, FrameTimelineInfo{}, 20,
153 gui::GameMode::Unsupported);
154
155 mTunnelModeEnabledReporter->updateTunnelModeStatus();
156 EXPECT_EQ(true, mTunnelModeEnabledListener->mTunnelModeEnabled);
157
158 layerWithSidebandStream = nullptr;
159 mTunnelModeEnabledReporter->updateTunnelModeStatus();
160 EXPECT_EQ(false, mTunnelModeEnabledListener->mTunnelModeEnabled);
161 }
162
163 } // namespace
164 } // namespace android
165