1231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu/*
267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu * Copyright 2015 The Android Open Source Project
3231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *
4231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * Licensed under the Apache License, Version 2.0 (the "License");
5231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * you may not use this file except in compliance with the License.
6231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * You may obtain a copy of the License at
7231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *
8231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *      http://www.apache.org/licenses/LICENSE-2.0
9231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu *
10231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * Unless required by applicable law or agreed to in writing, software
11231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * distributed under the License is distributed on an "AS IS" BASIS,
12231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * See the License for the specific language governing permissions and
14231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu * limitations under the License.
15231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu */
16231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
17231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu//#define LOG_NDEBUG 0
18231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#define LOG_TAG "ResourceManagerService_test"
19231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <utils/Log.h>
20231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
21231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <gtest/gtest.h>
22231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
23231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include "ResourceManagerService.h"
24231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/IResourceManagerService.h>
25231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/MediaResource.h>
26231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/MediaResourcePolicy.h>
27231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/stagefright/foundation/ADebug.h>
28231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <media/stagefright/ProcessInfoInterface.h>
29231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
30231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wunamespace android {
31231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
3237c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wustatic int64_t getId(sp<IResourceManagerClient> client) {
3337c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu    return (int64_t) client.get();
3437c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu}
3537c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu
36231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustruct TestProcessInfo : public ProcessInfoInterface {
37231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    TestProcessInfo() {}
38231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual ~TestProcessInfo() {}
39231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
40231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual bool getPriority(int pid, int *priority) {
41231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // For testing, use pid as priority.
42231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // Lower the value higher the priority.
43231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        *priority = pid;
44231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        return true;
45231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
46231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
47d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu    virtual bool isValidPid(int /* pid */) {
48d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu        return true;
49d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu    }
50d11c43a12917e017d715db88c13e4e7550eb9151Ronghua Wu
51231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuprivate:
52231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    DISALLOW_EVIL_CONSTRUCTORS(TestProcessInfo);
53231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu};
54231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
55231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustruct TestClient : public BnResourceManagerClient {
5637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu    TestClient(int pid, sp<ResourceManagerService> service)
5737c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        : mReclaimed(false), mPid(pid), mService(service) {}
58231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
59231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual bool reclaimResource() {
60231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        sp<IResourceManagerClient> client(this);
6137c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->removeResource(mPid, (int64_t) client.get());
62231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        mReclaimed = true;
63231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        return true;
64231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
65231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
668f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu    virtual String8 getName() {
678f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu        return String8("test_client");
688f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu    }
698f9dd872366f54b6260506c75c3d0cc3f9f73f81Ronghua Wu
70231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    bool reclaimed() const {
71231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        return mReclaimed;
72231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
73231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
74231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void reset() {
75231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        mReclaimed = false;
76231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
77231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
78231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuprotected:
79231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual ~TestClient() {}
80231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
81231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuprivate:
82231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    bool mReclaimed;
8337c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu    int mPid;
84231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    sp<ResourceManagerService> mService;
85231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    DISALLOW_EVIL_CONSTRUCTORS(TestClient);
86231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu};
87231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
88231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic const int kTestPid1 = 30;
89231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic const int kTestPid2 = 20;
90231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
9105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wustatic const int kLowPriorityPid = 40;
9205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wustatic const int kMidPriorityPid = 25;
9305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wustatic const int kHighPriorityPid = 10;
9405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu
95231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuclass ResourceManagerServiceTest : public ::testing::Test {
96231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wupublic:
97231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    ResourceManagerServiceTest()
98231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        : mService(new ResourceManagerService(new TestProcessInfo)),
9937c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu          mTestClient1(new TestClient(kTestPid1, mService)),
10037c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu          mTestClient2(new TestClient(kTestPid2, mService)),
10137c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu          mTestClient3(new TestClient(kTestPid2, mService)) {
102231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
103231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
104231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuprotected:
105231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    static bool isEqualResources(const Vector<MediaResource> &resources1,
106231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            const Vector<MediaResource> &resources2) {
107231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        if (resources1.size() != resources2.size()) {
108231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return false;
109231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
110231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        for (size_t i = 0; i < resources1.size(); ++i) {
111231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            if (resources1[i] != resources2[i]) {
112231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu                return false;
113231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            }
114231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
115231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        return true;
116231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
117231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
118231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    static void expectEqResourceInfo(const ResourceInfo &info, sp<IResourceManagerClient> client,
119231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            const Vector<MediaResource> &resources) {
120231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(client, info.client);
121231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(isEqualResources(resources, info.resources));
122231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
123231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
124231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void verifyClients(bool c1, bool c2, bool c3) {
125231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        TestClient *client1 = static_cast<TestClient*>(mTestClient1.get());
126231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        TestClient *client2 = static_cast<TestClient*>(mTestClient2.get());
127231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        TestClient *client3 = static_cast<TestClient*>(mTestClient3.get());
128231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
129231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(c1, client1->reclaimed());
130231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(c2, client2->reclaimed());
131231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(c3, client3->reclaimed());
132231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
133231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        client1->reset();
134231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        client2->reset();
135231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        client3->reset();
136231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
137231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
13867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // test set up
13967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // ---------------------------------------------------------------------------------
14067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //   pid                priority         client           type               number
14167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // ---------------------------------------------------------------------------------
14267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //   kTestPid1(30)      30               mTestClient1     secure codec       1
14367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                                        graphic memory     200
14467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                                        graphic memory     200
14567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // ---------------------------------------------------------------------------------
14667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //   kTestPid2(20)      20               mTestClient2     non-secure codec   1
14767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                                        graphic memory     300
14867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                       -------------------------------------------
14967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                       mTestClient3     secure codec       1
15067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    //                                                        graphic memory     100
15167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // ---------------------------------------------------------------------------------
152231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void addResource() {
153231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // kTestPid1 mTestClient1
154231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources1;
155ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources1.push_back(MediaResource(MediaResource::kSecureCodec, 1));
15637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->addResource(kTestPid1, getId(mTestClient1), mTestClient1, resources1);
157ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources1.push_back(MediaResource(MediaResource::kGraphicMemory, 200));
158231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources11;
159ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources11.push_back(MediaResource(MediaResource::kGraphicMemory, 200));
16037c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->addResource(kTestPid1, getId(mTestClient1), mTestClient1, resources11);
161231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
162231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // kTestPid2 mTestClient2
163231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources2;
164ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources2.push_back(MediaResource(MediaResource::kNonSecureCodec, 1));
165ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources2.push_back(MediaResource(MediaResource::kGraphicMemory, 300));
16637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->addResource(kTestPid2, getId(mTestClient2), mTestClient2, resources2);
167231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
168231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // kTestPid2 mTestClient3
169231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources3;
17037c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->addResource(kTestPid2, getId(mTestClient3), mTestClient3, resources3);
171ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources3.push_back(MediaResource(MediaResource::kSecureCodec, 1));
172ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources3.push_back(MediaResource(MediaResource::kGraphicMemory, 100));
17337c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->addResource(kTestPid2, getId(mTestClient3), mTestClient3, resources3);
174231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
175231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const PidResourceInfosMap &map = mService->mMap;
176231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(2u, map.size());
177231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        ssize_t index1 = map.indexOfKey(kTestPid1);
178231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        ASSERT_GE(index1, 0);
179231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const ResourceInfos &infos1 = map[index1];
180231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(1u, infos1.size());
181231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        expectEqResourceInfo(infos1[0], mTestClient1, resources1);
182231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
183231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        ssize_t index2 = map.indexOfKey(kTestPid2);
184231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        ASSERT_GE(index2, 0);
185231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const ResourceInfos &infos2 = map[index2];
186231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(2u, infos2.size());
187231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        expectEqResourceInfo(infos2[0], mTestClient2, resources2);
188231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        expectEqResourceInfo(infos2[1], mTestClient3, resources3);
189231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
190231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
191231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testConfig() {
192231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
193231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
194231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
195231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResourcePolicy> policies1;
196231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        policies1.push_back(
1979ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                MediaResourcePolicy(
1989ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8(kPolicySupportsMultipleSecureCodecs),
1999ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8("true")));
2009ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu        policies1.push_back(
2019ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                MediaResourcePolicy(
2029ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8(kPolicySupportsSecureWithNonSecureCodec),
2039ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8("false")));
204231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        mService->config(policies1);
205231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->mSupportsMultipleSecureCodecs);
206231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->mSupportsSecureWithNonSecureCodec);
207231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
208231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResourcePolicy> policies2;
209231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        policies2.push_back(
2109ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                MediaResourcePolicy(
2119ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8(kPolicySupportsMultipleSecureCodecs),
2129ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8("false")));
2139ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu        policies2.push_back(
2149ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                MediaResourcePolicy(
2159ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8(kPolicySupportsSecureWithNonSecureCodec),
2169ba21b9418d10ddcc39f08901e24fbf43d82b2bcRonghua Wu                        String8("true")));
217231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        mService->config(policies2);
218231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->mSupportsMultipleSecureCodecs);
219231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->mSupportsSecureWithNonSecureCodec);
220231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
221231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
222231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testRemoveResource() {
223231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        addResource();
224231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
22537c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        mService->removeResource(kTestPid2, getId(mTestClient2));
226231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
227231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const PidResourceInfosMap &map = mService->mMap;
228231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(2u, map.size());
229231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const ResourceInfos &infos1 = map.valueFor(kTestPid1);
230231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        const ResourceInfos &infos2 = map.valueFor(kTestPid2);
231231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(1u, infos1.size());
232231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(1u, infos2.size());
233231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // mTestClient2 has been removed.
234231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(mTestClient3, infos2[0].client);
235231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
236231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
237231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testGetAllClients() {
238231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        addResource();
239231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
240ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        MediaResource::Type type = MediaResource::kSecureCodec;
241231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<sp<IResourceManagerClient> > clients;
24205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_FALSE(mService->getAllClients_l(kLowPriorityPid, type, &clients));
24367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // some higher priority process (e.g. kTestPid2) owns the resource, so getAllClients_l
24467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // will fail.
24505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_FALSE(mService->getAllClients_l(kMidPriorityPid, type, &clients));
24605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_TRUE(mService->getAllClients_l(kHighPriorityPid, type, &clients));
247231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
248231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(2u, clients.size());
249231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(mTestClient3, clients[0]);
250231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(mTestClient1, clients[1]);
251231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
252231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
253231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testReclaimResourceSecure() {
254231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources;
255ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources.push_back(MediaResource(MediaResource::kSecureCodec, 1));
256ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources.push_back(MediaResource(MediaResource::kGraphicMemory, 150));
257231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
258231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codec can't coexist and secure codec can coexist with non-secure codec ###
259231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
260231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
261231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsMultipleSecureCodecs = false;
262231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = true;
263231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
264231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
26505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
26605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kMidPriorityPid, resources));
267231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
268231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // reclaim all secure codecs
26905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
27005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
271231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
272231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim one largest graphic memory from lowest process
27305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
27405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
275231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
276231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
27705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
278231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
279231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
280231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codecs can't coexist and secure codec can't coexist with non-secure codec ###
281231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
282231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
283231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsMultipleSecureCodecs = false;
284231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = false;
285231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
286231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
28705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
28805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kMidPriorityPid, resources));
289231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
290231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // reclaim all secure and non-secure codecs
29105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
29205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, true /* c2 */, true /* c3 */);
293231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
294231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
29505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
296231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
297231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
298231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
299231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codecs can coexist but secure codec can't coexist with non-secure codec ###
300231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
301231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
302231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsMultipleSecureCodecs = true;
303231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = false;
304231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
305231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
30605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
30705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kMidPriorityPid, resources));
308231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
309231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // reclaim all non-secure codecs
31005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
31105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
312231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
313231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim one largest graphic memory from lowest process
31405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
31505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
316231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
317231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim another largest graphic memory from lowest process
31805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
31905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
320231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
321231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
32205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
323231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
324231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
325231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
326231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
327231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
328231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsMultipleSecureCodecs = true;
329231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = true;
330231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
331231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
33205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
333231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
33405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
335231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // one largest graphic memory from lowest process got reclaimed
33605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
337231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
338231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim another graphic memory from lowest process
33905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
34005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
341231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
342231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim another graphic memory from lowest process
34305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
34405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
345231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
346231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
34705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
348231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
34967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
35067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // ### secure codecs can coexist and secure codec can coexist with non-secure codec ###
35167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        {
35267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            addResource();
35367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            mService->mSupportsMultipleSecureCodecs = true;
35467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            mService->mSupportsSecureWithNonSecureCodec = true;
35567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
35667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            Vector<MediaResource> resources;
357ea15fd29af81490311af9e12949b43524c39400eRonghua Wu            resources.push_back(MediaResource(MediaResource::kSecureCodec, 1));
35867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
35905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
36067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            // secure codec from lowest process got reclaimed
36105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
36267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
36367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            // call again should reclaim another secure codec from lowest process
36405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
36505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
36667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
36705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            // no more secure codec, non-secure codec will be reclaimed.
36805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
36905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
37067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        }
371231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
372231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
373231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testReclaimResourceNonSecure() {
374231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Vector<MediaResource> resources;
375ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources.push_back(MediaResource(MediaResource::kNonSecureCodec, 1));
376ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        resources.push_back(MediaResource(MediaResource::kGraphicMemory, 150));
377231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
378231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codec can't coexist with non-secure codec ###
379231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
380231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
381231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = false;
382231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
383231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
38405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
38505d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kMidPriorityPid, resources));
386231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
387231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // reclaim all secure codecs
38805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
38905d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, true /* c3 */);
390231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
391231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim one graphic memory from lowest process
39205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
39305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
394231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
395231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
39605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
397231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
398231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
399231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
400231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        // ### secure codec can coexist with non-secure codec ###
401231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        {
402231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource();
403231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            mService->mSupportsSecureWithNonSecureCodec = true;
404231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
405231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // priority too low
40605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kLowPriorityPid, resources));
407231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
40805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
409231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // one largest graphic memory from lowest process got reclaimed
41005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
411231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
412231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim another graphic memory from lowest process
41305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
41405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
415231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
416231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // call again should reclaim another graphic memory from lowest process
41705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
41805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, false /* c2 */, true /* c3 */);
419231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
420231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            // nothing left
42105d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_FALSE(mService->reclaimResource(kHighPriorityPid, resources));
422231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
42367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
42467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // ### secure codec can coexist with non-secure codec ###
42567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        {
42667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            addResource();
42767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            mService->mSupportsSecureWithNonSecureCodec = true;
42867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
42967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            Vector<MediaResource> resources;
430ea15fd29af81490311af9e12949b43524c39400eRonghua Wu            resources.push_back(MediaResource(MediaResource::kNonSecureCodec, 1));
43167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
43205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
43367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu            // one non secure codec from lowest process got reclaimed
43405d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(false /* c1 */, true /* c2 */, false /* c3 */);
43567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
43605d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            // no more non-secure codec, secure codec from lowest priority process will be reclaimed
43705d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            EXPECT_TRUE(mService->reclaimResource(kHighPriorityPid, resources));
43805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            verifyClients(true /* c1 */, false /* c2 */, false /* c3 */);
43967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
44005d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu            // clean up client 3 which still left
44137c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu            mService->removeResource(kTestPid2, getId(mTestClient3));
44267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        }
443231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
444231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
445231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testGetLowestPriorityBiggestClient() {
446ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        MediaResource::Type type = MediaResource::kGraphicMemory;
447231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        sp<IResourceManagerClient> client;
44805d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
449231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
450231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        addResource();
451231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
45205d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_FALSE(mService->getLowestPriorityBiggestClient_l(kLowPriorityPid, type, &client));
45305d89f1c6452b2fce0b9f1315240f8cace69a88dRonghua Wu        EXPECT_TRUE(mService->getLowestPriorityBiggestClient_l(kHighPriorityPid, type, &client));
454231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
455ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        // kTestPid1 is the lowest priority process with MediaResource::kGraphicMemory.
456ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        // mTestClient1 has the largest MediaResource::kGraphicMemory within kTestPid1.
457231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(mTestClient1, client);
458231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
459231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
460231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testGetLowestPriorityPid() {
461231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        int pid;
462231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        int priority;
463231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        TestProcessInfo processInfo;
464231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
465ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        MediaResource::Type type = MediaResource::kGraphicMemory;
466231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->getLowestPriorityPid_l(type, &pid, &priority));
467231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
468231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        addResource();
469231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
470231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
471231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(kTestPid1, pid);
472231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        int priority1;
473231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        processInfo.getPriority(kTestPid1, &priority1);
474231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(priority1, priority);
475231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
476ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        type = MediaResource::kNonSecureCodec;
477231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->getLowestPriorityPid_l(type, &pid, &priority));
478231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(kTestPid2, pid);
479231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        int priority2;
480231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        processInfo.getPriority(kTestPid2, &priority2);
481231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(priority2, priority);
482231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
483231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
484231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testGetBiggestClient() {
485ea15fd29af81490311af9e12949b43524c39400eRonghua Wu        MediaResource::Type type = MediaResource::kGraphicMemory;
486231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        sp<IResourceManagerClient> client;
487231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->getBiggestClient_l(kTestPid2, type, &client));
488231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
489231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        addResource();
490231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
491231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->getBiggestClient_l(kTestPid2, type, &client));
492231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_EQ(mTestClient2, client);
493231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
494231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
495231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    void testIsCallingPriorityHigher() {
496231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->isCallingPriorityHigher_l(101, 100));
497231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_FALSE(mService->isCallingPriorityHigher_l(100, 100));
498231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        EXPECT_TRUE(mService->isCallingPriorityHigher_l(99, 100));
499231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
500231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
501231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    sp<ResourceManagerService> mService;
502231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    sp<IResourceManagerClient> mTestClient1;
503231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    sp<IResourceManagerClient> mTestClient2;
504231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    sp<IResourceManagerClient> mTestClient3;
505231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu};
506231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
507231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, config) {
508231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testConfig();
509231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
510231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
511231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, addResource) {
512231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    addResource();
513231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
514231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
515231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, removeResource) {
516231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testRemoveResource();
517231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
518231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
519231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, reclaimResource) {
520231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testReclaimResourceSecure();
521231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testReclaimResourceNonSecure();
522231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
523231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
524231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, getAllClients_l) {
525231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testGetAllClients();
526231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
527231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
528231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, getLowestPriorityBiggestClient_l) {
529231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testGetLowestPriorityBiggestClient();
530231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
531231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
532231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, getLowestPriorityPid_l) {
533231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testGetLowestPriorityPid();
534231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
535231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
536231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, getBiggestClient_l) {
537231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testGetBiggestClient();
538231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
539231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
540231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuTEST_F(ResourceManagerServiceTest, isCallingPriorityHigher_l) {
541231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    testIsCallingPriorityHigher();
542231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
543231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
544231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu} // namespace android
545