blob: 97c89190e9866485192ef4f5ca6a859e3d771dfb [file] [log] [blame]
hkuang26587cb2020-01-16 10:36:08 -08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Unit Test for TranscodingClientManager
18
19// #define LOG_NDEBUG 0
20#define LOG_TAG "TranscodingClientManagerTest"
21
22#include <aidl/android/media/BnTranscodingServiceClient.h>
23#include <aidl/android/media/IMediaTranscodingService.h>
24#include <aidl/android/media/ITranscodingServiceClient.h>
25#include <android-base/logging.h>
26#include <android/binder_manager.h>
27#include <android/binder_process.h>
28#include <gtest/gtest.h>
29#include <media/TranscodingClientManager.h>
30#include <utils/Log.h>
31
32namespace android {
33
34using Status = ::ndk::ScopedAStatus;
35using aidl::android::media::BnTranscodingServiceClient;
36using aidl::android::media::IMediaTranscodingService;
37using aidl::android::media::ITranscodingServiceClient;
38
39constexpr int32_t kInvalidClientId = -1;
40constexpr int32_t kInvalidClientPid = -1;
41constexpr int32_t kInvalidClientUid = -1;
42constexpr const char* kInvalidClientOpPackageName = "";
43
44constexpr int32_t kClientId = 1;
45constexpr int32_t kClientPid = 2;
46constexpr int32_t kClientUid = 3;
47constexpr const char* kClientOpPackageName = "TestClient";
48
49struct TestClient : public BnTranscodingServiceClient {
50 TestClient(const std::shared_ptr<IMediaTranscodingService>& service) : mService(service) {
51 ALOGD("TestClient Created");
52 }
53
54 Status getName(std::string* _aidl_return) override {
55 *_aidl_return = "test_client";
56 return Status::ok();
57 }
58
59 Status onTranscodingFinished(
60 int32_t /* in_jobId */,
61 const ::aidl::android::media::TranscodingResultParcel& /* in_result */) override {
62 return Status::ok();
63 }
64
65 Status onTranscodingFailed(
66 int32_t /* in_jobId */,
67 ::aidl::android::media::TranscodingErrorCode /*in_errorCode */) override {
68 return Status::ok();
69 }
70
71 Status onAwaitNumberOfJobsChanged(int32_t /* in_jobId */, int32_t /* in_oldAwaitNumber */,
72 int32_t /* in_newAwaitNumber */) override {
73 return Status::ok();
74 }
75
76 Status onProgressUpdate(int32_t /* in_jobId */, int32_t /* in_progress */) override {
77 return Status::ok();
78 }
79
80 virtual ~TestClient() { ALOGI("TestClient destroyed"); };
81
82 private:
83 std::shared_ptr<IMediaTranscodingService> mService;
84 TestClient(const TestClient&) = delete;
85 TestClient& operator=(const TestClient&) = delete;
86};
87
88class TranscodingClientManagerTest : public ::testing::Test {
89 public:
90 TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest created"); }
91
92 void SetUp() override {
93 mClientManager = TranscodingClientManager::getInstance();
94 if (mClientManager == nullptr) {
95 ALOGE("Failed to acquire TranscodingClientManager.");
96 return;
97 }
98
99 ::ndk::SpAIBinder binder(AServiceManager_getService("media.transcoding"));
100 mService = IMediaTranscodingService::fromBinder(binder);
101 if (mService == nullptr) {
102 ALOGE("Failed to connect to the media.trascoding service.");
103 return;
104 }
105
106 mTestClient = ::ndk::SharedRefBase::make<TestClient>(mService);
107 }
108
109 void TearDown() override {
110 ALOGI("TranscodingClientManagerTest tear down");
111 mClientManager = nullptr;
112 mService = nullptr;
113 }
114
115 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
116
117 sp<TranscodingClientManager> mClientManager = nullptr;
118 std::shared_ptr<ITranscodingServiceClient> mTestClient = nullptr;
119 std::shared_ptr<IMediaTranscodingService> mService = nullptr;
120};
121
122TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientId) {
123 std::shared_ptr<ITranscodingServiceClient> client =
124 ::ndk::SharedRefBase::make<TestClient>(mService);
125
126 // Create a client with invalid client id.
127 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
128 std::make_unique<TranscodingClientManager::ClientInfo>(
129 client, kInvalidClientId, kClientPid, kClientUid, kClientOpPackageName);
130
131 // Add the client to the manager and expect failure.
132 status_t err = mClientManager->addClient(std::move(clientInfo));
133 EXPECT_TRUE(err != OK);
134}
135
136TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
137 std::shared_ptr<ITranscodingServiceClient> client =
138 ::ndk::SharedRefBase::make<TestClient>(mService);
139
140 // Create a client with invalid Pid.
141 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
142 std::make_unique<TranscodingClientManager::ClientInfo>(
143 client, kClientId, kInvalidClientPid, kClientUid, kClientOpPackageName);
144
145 // Add the client to the manager and expect failure.
146 status_t err = mClientManager->addClient(std::move(clientInfo));
147 EXPECT_TRUE(err != OK);
148}
149
150TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientUid) {
151 std::shared_ptr<ITranscodingServiceClient> client =
152 ::ndk::SharedRefBase::make<TestClient>(mService);
153
154 // Create a client with invalid Uid.
155 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
156 std::make_unique<TranscodingClientManager::ClientInfo>(
157 client, kClientId, kClientPid, kInvalidClientUid, kClientOpPackageName);
158
159 // Add the client to the manager and expect failure.
160 status_t err = mClientManager->addClient(std::move(clientInfo));
161 EXPECT_TRUE(err != OK);
162}
163
164TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
165 std::shared_ptr<ITranscodingServiceClient> client =
166 ::ndk::SharedRefBase::make<TestClient>(mService);
167
168 // Create a client with invalid packagename.
169 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
170 std::make_unique<TranscodingClientManager::ClientInfo>(
171 client, kClientId, kClientPid, kClientUid, kInvalidClientOpPackageName);
172
173 // Add the client to the manager and expect failure.
174 status_t err = mClientManager->addClient(std::move(clientInfo));
175 EXPECT_TRUE(err != OK);
176}
177
178TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
179 std::shared_ptr<ITranscodingServiceClient> client1 =
180 ::ndk::SharedRefBase::make<TestClient>(mService);
181
182 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
183 std::make_unique<TranscodingClientManager::ClientInfo>(
184 client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
185
186 status_t err = mClientManager->addClient(std::move(clientInfo));
187 EXPECT_TRUE(err == OK);
188
189 size_t numOfClients = mClientManager->getNumOfClients();
190 EXPECT_EQ(numOfClients, 1);
191
192 err = mClientManager->removeClient(kClientId);
193 EXPECT_TRUE(err == OK);
194}
195
196TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
197 std::shared_ptr<ITranscodingServiceClient> client1 =
198 ::ndk::SharedRefBase::make<TestClient>(mService);
199
200 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
201 std::make_unique<TranscodingClientManager::ClientInfo>(
202 client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
203
204 status_t err = mClientManager->addClient(std::move(clientInfo));
205 EXPECT_TRUE(err == OK);
206
207 err = mClientManager->addClient(std::move(clientInfo));
208 EXPECT_TRUE(err != OK);
209
210 err = mClientManager->removeClient(kClientId);
211 EXPECT_TRUE(err == OK);
212}
213
214TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
215 std::shared_ptr<ITranscodingServiceClient> client1 =
216 ::ndk::SharedRefBase::make<TestClient>(mService);
217
218 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo1 =
219 std::make_unique<TranscodingClientManager::ClientInfo>(
220 client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
221
222 status_t err = mClientManager->addClient(std::move(clientInfo1));
223 EXPECT_TRUE(err == OK);
224
225 std::shared_ptr<ITranscodingServiceClient> client2 =
226 ::ndk::SharedRefBase::make<TestClient>(mService);
227
228 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo2 =
229 std::make_unique<TranscodingClientManager::ClientInfo>(
230 client2, kClientId + 1, kClientPid, kClientUid, kClientOpPackageName);
231
232 err = mClientManager->addClient(std::move(clientInfo2));
233 EXPECT_TRUE(err == OK);
234
235 std::shared_ptr<ITranscodingServiceClient> client3 =
236 ::ndk::SharedRefBase::make<TestClient>(mService);
237
238 // Create a client with invalid packagename.
239 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo3 =
240 std::make_unique<TranscodingClientManager::ClientInfo>(
241 client3, kClientId + 2, kClientPid, kClientUid, kClientOpPackageName);
242
243 err = mClientManager->addClient(std::move(clientInfo3));
244 EXPECT_TRUE(err == OK);
245
246 size_t numOfClients = mClientManager->getNumOfClients();
247 EXPECT_EQ(numOfClients, 3);
248
249 err = mClientManager->removeClient(kClientId);
250 EXPECT_TRUE(err == OK);
251
252 err = mClientManager->removeClient(kClientId + 1);
253 EXPECT_TRUE(err == OK);
254
255 err = mClientManager->removeClient(kClientId + 2);
256 EXPECT_TRUE(err == OK);
257}
258
259TEST_F(TranscodingClientManagerTest, TestRemovingNonExistClient) {
260 status_t err = mClientManager->removeClient(kInvalidClientId);
261 EXPECT_TRUE(err != OK);
262
263 err = mClientManager->removeClient(1000 /* clientId */);
264 EXPECT_TRUE(err != OK);
265}
266
267TEST_F(TranscodingClientManagerTest, TestCheckClientWithClientId) {
268 std::shared_ptr<ITranscodingServiceClient> client =
269 ::ndk::SharedRefBase::make<TestClient>(mService);
270
271 std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
272 std::make_unique<TranscodingClientManager::ClientInfo>(
273 client, kClientId, kClientPid, kClientUid, kClientOpPackageName);
274
275 status_t err = mClientManager->addClient(std::move(clientInfo));
276 EXPECT_TRUE(err == OK);
277
278 bool res = mClientManager->isClientIdRegistered(kClientId);
279 EXPECT_TRUE(res);
280
281 res = mClientManager->isClientIdRegistered(kInvalidClientId);
282 EXPECT_FALSE(res);
283}
284
285} // namespace android