1 #include <android/dvr/BnVrComposerCallback.h>
2 #include <binder/IServiceManager.h>
3 #include <gtest/gtest.h>
4 #include <sys/eventfd.h>
5 #include <vr_composer.h>
6
7 namespace android {
8 namespace dvr {
9 namespace {
10
11 const char kVrDisplayName[] = "VrDisplay_Test";
12
13 class TestComposerView : public ComposerView {
14 public:
TestComposerView()15 TestComposerView() {}
16 ~TestComposerView() override = default;
17
display_refresh_count() const18 size_t display_refresh_count() const { return display_refresh_count_; }
19
ForceDisplaysRefresh()20 void ForceDisplaysRefresh() override { display_refresh_count_++; }
RegisterObserver(Observer * observer)21 void RegisterObserver(Observer* observer) override {}
UnregisterObserver(Observer * observer)22 void UnregisterObserver(Observer* observer) override {}
23
24 TestComposerView(const TestComposerView&) = delete;
25 void operator=(const TestComposerView&) = delete;
26
27 private:
28 size_t display_refresh_count_ = 0;
29 };
30
31 class TestComposerCallback : public BnVrComposerCallback {
32 public:
TestComposerCallback()33 TestComposerCallback() {}
34 ~TestComposerCallback() override = default;
35
last_frame() const36 ComposerView::Frame last_frame() const { return last_frame_; }
37
onNewFrame(const ParcelableComposerFrame & frame,ParcelableUniqueFd *)38 binder::Status onNewFrame(
39 const ParcelableComposerFrame& frame,
40 ParcelableUniqueFd* /* fence */) override {
41 last_frame_ = frame.frame();
42 return binder::Status::ok();
43 }
44
45 private:
46 ComposerView::Frame last_frame_;
47
48 TestComposerCallback(const TestComposerCallback&) = delete;
49 void operator=(const TestComposerCallback&) = delete;
50 };
51
52 class TestComposerCallbackWithFence : public TestComposerCallback {
53 public:
54 ~TestComposerCallbackWithFence() override = default;
55
onNewFrame(const ParcelableComposerFrame & frame,ParcelableUniqueFd * fence)56 binder::Status onNewFrame(
57 const ParcelableComposerFrame& frame,
58 ParcelableUniqueFd* fence) override {
59 binder::Status status = TestComposerCallback::onNewFrame(frame, fence);
60
61 base::unique_fd fd(eventfd(0, 0));
62 EXPECT_LE(0, fd.get());
63 fence->set_fence(fd);
64
65 return status;
66 }
67 };
68
CreateBuffer()69 sp<GraphicBuffer> CreateBuffer() {
70 return new GraphicBuffer(600, 400, PIXEL_FORMAT_RGBA_8888,
71 GraphicBuffer::USAGE_HW_TEXTURE);
72 }
73
74 } // namespace
75
76 class VrComposerTest : public testing::Test {
77 public:
VrComposerTest()78 VrComposerTest() : composer_(new VrComposer(&composer_view_)) {}
79 ~VrComposerTest() override = default;
80
GetComposerProxy() const81 sp<IVrComposer> GetComposerProxy() const {
82 sp<IServiceManager> sm(defaultServiceManager());
83 return interface_cast<IVrComposer>(sm->getService(String16(kVrDisplayName)));
84 }
85
SetUp()86 void SetUp() override {
87 sp<IServiceManager> sm(defaultServiceManager());
88 EXPECT_EQ(OK,
89 sm->addService(String16(kVrDisplayName), composer_, false));
90 }
91
92 protected:
93 TestComposerView composer_view_;
94 sp<VrComposer> composer_;
95
96 VrComposerTest(const VrComposerTest&) = delete;
97 void operator=(const VrComposerTest&) = delete;
98 };
99
TEST_F(VrComposerTest,TestWithoutObserver)100 TEST_F(VrComposerTest, TestWithoutObserver) {
101 sp<IVrComposer> composer = GetComposerProxy();
102 ComposerView::Frame frame;
103
104 base::unique_fd fence = composer_->OnNewFrame(frame);
105 ASSERT_EQ(-1, fence.get());
106 }
107
TEST_F(VrComposerTest,TestWithObserver)108 TEST_F(VrComposerTest, TestWithObserver) {
109 sp<IVrComposer> composer = GetComposerProxy();
110 sp<TestComposerCallback> callback = new TestComposerCallback();
111 ASSERT_EQ(0, composer_view_.display_refresh_count());
112 ASSERT_TRUE(composer->registerObserver(callback).isOk());
113 ASSERT_EQ(1, composer_view_.display_refresh_count());
114
115 ComposerView::Frame frame;
116 base::unique_fd fence = composer_->OnNewFrame(frame);
117 ASSERT_EQ(-1, fence.get());
118 }
119
TEST_F(VrComposerTest,TestWithOneLayer)120 TEST_F(VrComposerTest, TestWithOneLayer) {
121 sp<IVrComposer> composer = GetComposerProxy();
122 sp<TestComposerCallback> callback = new TestComposerCallbackWithFence();
123 ASSERT_TRUE(composer->registerObserver(callback).isOk());
124
125 ComposerView::Frame frame;
126 frame.display_id = 1;
127 frame.removed = false;
128 frame.display_width = 600;
129 frame.display_height = 400;
130 frame.layers.push_back(ComposerView::ComposerLayer{
131 .id = 1,
132 .buffer = CreateBuffer(),
133 .fence = new Fence(eventfd(0, 0)),
134 .display_frame = {0, 0, 600, 400},
135 .crop = {0.0f, 0.0f, 600.0f, 400.0f},
136 .blend_mode = IComposerClient::BlendMode::NONE,
137 .alpha = 1.0f,
138 .type = 1,
139 .app_id = 1,
140 });
141 base::unique_fd fence = composer_->OnNewFrame(frame);
142 ASSERT_LE(0, fence.get());
143
144 ComposerView::Frame received_frame = callback->last_frame();
145 ASSERT_EQ(frame.display_id, received_frame.display_id);
146 ASSERT_EQ(frame.display_width, received_frame.display_width);
147 ASSERT_EQ(frame.display_height, received_frame.display_height);
148 ASSERT_EQ(frame.removed, received_frame.removed);
149 ASSERT_EQ(1u, received_frame.layers.size());
150 ASSERT_EQ(frame.layers[0].id, received_frame.layers[0].id);
151 ASSERT_NE(nullptr, received_frame.layers[0].buffer.get());
152 ASSERT_TRUE(received_frame.layers[0].fence->isValid());
153 ASSERT_EQ(frame.layers[0].display_frame.left,
154 received_frame.layers[0].display_frame.left);
155 ASSERT_EQ(frame.layers[0].display_frame.top,
156 received_frame.layers[0].display_frame.top);
157 ASSERT_EQ(frame.layers[0].display_frame.right,
158 received_frame.layers[0].display_frame.right);
159 ASSERT_EQ(frame.layers[0].display_frame.bottom,
160 received_frame.layers[0].display_frame.bottom);
161 ASSERT_EQ(frame.layers[0].crop.left, received_frame.layers[0].crop.left);
162 ASSERT_EQ(frame.layers[0].crop.top, received_frame.layers[0].crop.top);
163 ASSERT_EQ(frame.layers[0].crop.right, received_frame.layers[0].crop.right);
164 ASSERT_EQ(frame.layers[0].crop.bottom, received_frame.layers[0].crop.bottom);
165 ASSERT_EQ(frame.layers[0].blend_mode, received_frame.layers[0].blend_mode);
166 ASSERT_EQ(frame.layers[0].alpha, received_frame.layers[0].alpha);
167 ASSERT_EQ(frame.layers[0].type, received_frame.layers[0].type);
168 ASSERT_EQ(frame.layers[0].app_id, received_frame.layers[0].app_id);
169 }
170
171 } // namespace dvr
172 } // namespace android
173