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