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