Surface_test.cpp revision fc850124b35abd00a31e9bcf57e14e0fa74f4cd7
1134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis/*
2134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Copyright (C) 2011 The Android Open Source Project
3134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
4134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
5134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * you may not use this file except in compliance with the License.
6134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * You may obtain a copy of the License at
7134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
8134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
9134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis *
10134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Unless required by applicable law or agreed to in writing, software
11134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
12134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * See the License for the specific language governing permissions and
14134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * limitations under the License.
15134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis */
16134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
17134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h>
187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis#include <binder/IMemory.h>
20134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h>
21134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/Surface.h>
22134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/SurfaceComposerClient.h>
23134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/String8.h>
24134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
25134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
26134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
27134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test {
28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        mComposerClient = new SurfaceComposerClient;
31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
33fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis        mSurfaceControl = mComposerClient->createSurface(
34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                String8("Test Surface"), 0, 32, 32, PIXEL_FORMAT_RGB_888, 0);
35134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
36134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl != NULL);
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl->isValid());
38134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->openTransaction());
40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(30000));
41134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
42134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->closeTransaction());
43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
44134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSurface = mSurfaceControl->getSurface();
45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurface != NULL);
46134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
47134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
48134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
49134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mComposerClient->dispose();
50134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
51134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
52134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<Surface> mSurface;
53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceComposerClient> mComposerClient;
54134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceControl> mSurfaceControl;
55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    mSurfaceControl.clear();
68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
777a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here.
787a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersFail) {
797a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ANativeWindow> anw(mSurface);
807a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
817a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Verify the screenshot works with no protected buffers.
827a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<IMemoryHeap> heap;
837a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    uint32_t w=0, h=0;
847a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    PixelFormat fmt=0;
857a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
867a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0,
877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            40000));
887a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_TRUE(heap != NULL);
897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
907a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Set the PROTECTED usage bit and verify that the screenshot fails.  Note
917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // that we need to dequeue a buffer in order for it to actually get
927a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // allocated in SurfaceFlinger.
937a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(),
947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            GRALLOC_USAGE_PROTECTED));
957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    android_native_buffer_t* buf = 0;
977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    for (int i = 0; i < 4; i++) {
987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        // Loop to make sure SurfaceFlinger has retired a protected buffer.
997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf));
1007a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf));
1017a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf));
1027a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    }
1037a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    heap = 0;
1047a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    w = h = fmt = 0;
1057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(INVALID_OPERATION, sf->captureScreen(0, &heap, &w, &h, &fmt,
1067a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            64, 64, 0, 40000));
1077a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_TRUE(heap == NULL);
1087a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
1097a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // XXX: This should not be needed, but it seems that the new buffers don't
1107a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // correctly show up after the upcoming dequeue/lock/queue loop without it.
1117a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // We should look into this at some point.
1127a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
1137a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
1147a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Un-set the PROTECTED usage bit and verify that the screenshot works
1157a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // again.  Note that we have to change the buffers geometry to ensure that
1167a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // the buffers get reallocated, as the new usage bits are a subset of the
1177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // old.
1187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0));
1197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(anw.get(), 32, 32, 0));
1207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    for (int i = 0; i < 4; i++) {
1217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        // Loop to make sure SurfaceFlinger has retired a protected buffer.
1227a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf));
1237a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf));
1247a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf));
1257a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    }
1267a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    heap = 0;
1277a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    w = h = fmt = 0;
1287a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0,
1297a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            40000));
1307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_TRUE(heap != NULL);
1317a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1327a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) {
134391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    sp<ANativeWindow> anw(mSurface);
135391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
136391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
137391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
138391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
139391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
140391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
142