1d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis/*
2d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Copyright (C) 2011 The Android Open Source Project
3d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis *
4d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
5d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * you may not use this file except in compliance with the License.
6d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * You may obtain a copy of the License at
7d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis *
8d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
9d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis *
10d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Unless required by applicable law or agreed to in writing, software
11d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
12d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * See the License for the specific language governing permissions and
14d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * limitations under the License.
15d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis */
16d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
17d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <gtest/gtest.h>
18f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis
19f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis#include <binder/IMemory.h>
20d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h>
21d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/Surface.h>
22d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/SurfaceComposerClient.h>
23d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <utils/String8.h>
24d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
25d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisnamespace android {
26d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
27d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisclass SurfaceTest : public ::testing::Test {
28d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisprotected:
29d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    virtual void SetUp() {
30f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis        mComposerClient = new SurfaceComposerClient;
31d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
32d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
335dbf2ed575c424a0d65e70458d5a02eb21872b33Jamie Gennis        mSurfaceControl = mComposerClient->createSurface(
34994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian                String8("Test Surface"), 0, 32, 32, PIXEL_FORMAT_RGBA_8888, 0);
35d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
36d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        ASSERT_TRUE(mSurfaceControl != NULL);
37d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        ASSERT_TRUE(mSurfaceControl->isValid());
38d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
39439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian        SurfaceComposerClient::openGlobalTransaction();
40994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff));
41d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
42439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian        SurfaceComposerClient::closeGlobalTransaction();
43d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
44d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        mSurface = mSurfaceControl->getSurface();
45d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        ASSERT_TRUE(mSurface != NULL);
46d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    }
47d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
48d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    virtual void TearDown() {
49d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis        mComposerClient->dispose();
50d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    }
51d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
52d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    sp<Surface> mSurface;
53d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    sp<SurfaceComposerClient> mComposerClient;
54d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    sp<SurfaceControl> mSurfaceControl;
55d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis};
56d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
57d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
58d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    sp<ANativeWindow> anw(mSurface);
59d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    int result = -123;
60d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
61d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis            &result);
62d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
63d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    EXPECT_EQ(1, result);
64d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis}
65d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
66d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
67d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    mSurfaceControl.clear();
68d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
69d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    sp<ANativeWindow> anw(mSurface);
70d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    int result = -123;
71d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
72d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis            &result);
73d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
74d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis    EXPECT_EQ(1, result);
75d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis}
76d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis
77f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis// This test probably doesn't belong here.
7874f7dfa8033732a614ad0a755bc2b917032155d0Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) {
79f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    sp<ANativeWindow> anw(mSurface);
80f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis
81f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    // Verify the screenshot works with no protected buffers.
82f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    sp<IMemoryHeap> heap;
83f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    uint32_t w=0, h=0;
84f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    PixelFormat fmt=0;
85f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
86f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0,
87994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian            0x7fffffff));
88f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    ASSERT_TRUE(heap != NULL);
89f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis
90f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    // Set the PROTECTED usage bit and verify that the screenshot fails.  Note
91f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    // that we need to dequeue a buffer in order for it to actually get
92f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    // allocated in SurfaceFlinger.
93f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(),
94f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis            GRALLOC_USAGE_PROTECTED));
95f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
96b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev    ANativeWindowBuffer* buf = 0;
97994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian
98994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian    status_t err = anw->dequeueBuffer(anw.get(), &buf);
99994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian    if (err) {
100994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        // we could fail if GRALLOC_USAGE_PROTECTED is not supported.
101994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        // that's okay as long as this is the reason for the failure.
102994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        // try again without the GRALLOC_USAGE_PROTECTED bit.
103994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0));
104994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf));
105994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian        return;
106994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian    }
107994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian    ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf));
108994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian
109f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    for (int i = 0; i < 4; i++) {
110f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis        // Loop to make sure SurfaceFlinger has retired a protected buffer.
111f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf));
112f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf));
113f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf));
114f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    }
115f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    heap = 0;
116f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    w = h = fmt = 0;
11774f7dfa8033732a614ad0a755bc2b917032155d0Jamie Gennis    ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt,
118994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian            64, 64, 0, 0x7fffffff));
119f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis    ASSERT_TRUE(heap != NULL);
120f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis}
121f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis
122c4ca7c511499693f13622b135637f600ec913e57Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) {
123c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis    sp<ANativeWindow> anw(mSurface);
124c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis    int result = -123;
125c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
126c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
127c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
128c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis}
129c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis
130d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis}
131