blob: d9504ca696bd7fa3ab3d16d16347bd1fad050974 [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
Chong Zhang6d58e4b2020-03-31 09:41:10 -070022#include <aidl/android/media/BnTranscodingClientCallback.h>
hkuang26587cb2020-01-16 10:36:08 -080023#include <aidl/android/media/IMediaTranscodingService.h>
hkuang26587cb2020-01-16 10:36:08 -080024#include <android-base/logging.h>
25#include <android/binder_manager.h>
26#include <android/binder_process.h>
27#include <gtest/gtest.h>
Chong Zhang6d58e4b2020-03-31 09:41:10 -070028#include <media/SchedulerClientInterface.h>
hkuang26587cb2020-01-16 10:36:08 -080029#include <media/TranscodingClientManager.h>
Chong Zhang6d58e4b2020-03-31 09:41:10 -070030#include <media/TranscodingRequest.h>
hkuang26587cb2020-01-16 10:36:08 -080031#include <utils/Log.h>
32
Chong Zhang6d58e4b2020-03-31 09:41:10 -070033#include <list>
34
hkuang26587cb2020-01-16 10:36:08 -080035namespace android {
36
37using Status = ::ndk::ScopedAStatus;
Chong Zhang6d58e4b2020-03-31 09:41:10 -070038using ::aidl::android::media::BnTranscodingClientCallback;
39using ::aidl::android::media::IMediaTranscodingService;
40using ::aidl::android::media::TranscodingErrorCode;
41using ::aidl::android::media::TranscodingJobParcel;
Chong Zhang15c192a2020-05-05 16:24:00 -070042using ::aidl::android::media::TranscodingJobPriority;
Chong Zhang6d58e4b2020-03-31 09:41:10 -070043using ::aidl::android::media::TranscodingRequestParcel;
44using ::aidl::android::media::TranscodingResultParcel;
hkuang26587cb2020-01-16 10:36:08 -080045
Chong Zhang6d58e4b2020-03-31 09:41:10 -070046constexpr pid_t kInvalidClientPid = -1;
Chong Zhang8e062632020-03-31 10:56:37 -070047constexpr const char* kInvalidClientName = "";
48constexpr const char* kInvalidClientPackage = "";
hkuang26587cb2020-01-16 10:36:08 -080049
Chong Zhang6d58e4b2020-03-31 09:41:10 -070050constexpr pid_t kClientPid = 2;
51constexpr uid_t kClientUid = 3;
Chong Zhang8e062632020-03-31 10:56:37 -070052constexpr const char* kClientName = "TestClientName";
53constexpr const char* kClientPackage = "TestClientPackage";
hkuang26587cb2020-01-16 10:36:08 -080054
Chong Zhang15c192a2020-05-05 16:24:00 -070055#define JOB(n) (n)
56
Chong Zhang6d58e4b2020-03-31 09:41:10 -070057struct TestClientCallback : public BnTranscodingClientCallback {
58 TestClientCallback() { ALOGI("TestClientCallback Created"); }
hkuang26587cb2020-01-16 10:36:08 -080059
Chong Zhang6d58e4b2020-03-31 09:41:10 -070060 virtual ~TestClientCallback() { ALOGI("TestClientCallback destroyed"); };
61
62 Status onTranscodingFinished(int32_t in_jobId,
63 const TranscodingResultParcel& in_result) override {
64 EXPECT_EQ(in_jobId, in_result.jobId);
65 mEventQueue.push_back(Finished(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080066 return Status::ok();
67 }
68
Chong Zhang6d58e4b2020-03-31 09:41:10 -070069 Status onTranscodingFailed(int32_t in_jobId, TranscodingErrorCode /*in_errorCode */) override {
70 mEventQueue.push_back(Failed(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080071 return Status::ok();
72 }
73
74 Status onAwaitNumberOfJobsChanged(int32_t /* in_jobId */, int32_t /* in_oldAwaitNumber */,
75 int32_t /* in_newAwaitNumber */) override {
76 return Status::ok();
77 }
78
79 Status onProgressUpdate(int32_t /* in_jobId */, int32_t /* in_progress */) override {
80 return Status::ok();
81 }
82
Chong Zhang6d58e4b2020-03-31 09:41:10 -070083 struct Event {
84 enum {
85 NoEvent,
86 Finished,
87 Failed,
88 } type;
Chong Zhang3fa408f2020-04-30 11:04:28 -070089 JobIdType jobId;
Chong Zhang6d58e4b2020-03-31 09:41:10 -070090 };
91
92 static constexpr Event NoEvent = {Event::NoEvent, 0};
93#define DECLARE_EVENT(action) \
Chong Zhang3fa408f2020-04-30 11:04:28 -070094 static Event action(JobIdType jobId) { return {Event::action, jobId}; }
Chong Zhang6d58e4b2020-03-31 09:41:10 -070095
96 DECLARE_EVENT(Finished);
97 DECLARE_EVENT(Failed);
98
99 const Event& popEvent() {
100 if (mEventQueue.empty()) {
101 mPoppedEvent = NoEvent;
102 } else {
103 mPoppedEvent = *mEventQueue.begin();
104 mEventQueue.pop_front();
105 }
106 return mPoppedEvent;
107 }
hkuang26587cb2020-01-16 10:36:08 -0800108
Chong Zhang8e062632020-03-31 10:56:37 -0700109private:
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700110 Event mPoppedEvent;
111 std::list<Event> mEventQueue;
112
113 TestClientCallback(const TestClientCallback&) = delete;
114 TestClientCallback& operator=(const TestClientCallback&) = delete;
115};
116
117bool operator==(const TestClientCallback::Event& lhs, const TestClientCallback::Event& rhs) {
118 return lhs.type == rhs.type && lhs.jobId == rhs.jobId;
119}
120
121struct TestScheduler : public SchedulerClientInterface {
122 TestScheduler() { ALOGI("TestScheduler Created"); }
123
124 virtual ~TestScheduler() { ALOGI("TestScheduler Destroyed"); }
125
Chong Zhang3fa408f2020-04-30 11:04:28 -0700126 bool submit(ClientIdType clientId, JobIdType jobId, uid_t /*uid*/,
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700127 const TranscodingRequestParcel& request,
128 const std::weak_ptr<ITranscodingClientCallback>& clientCallback) override {
129 JobKeyType jobKey = std::make_pair(clientId, jobId);
130 if (mJobs.count(jobKey) > 0) {
131 return false;
132 }
133
134 // This is the secret name we'll check, to test error propagation from
135 // the scheduler back to client.
136 if (request.fileName == "bad_file") {
137 return false;
138 }
139
140 mJobs[jobKey].request = request;
141 mJobs[jobKey].callback = clientCallback;
142
143 mLastJob = jobKey;
144 return true;
145 }
146
Chong Zhang3fa408f2020-04-30 11:04:28 -0700147 bool cancel(ClientIdType clientId, JobIdType jobId) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700148 JobKeyType jobKey = std::make_pair(clientId, jobId);
149
150 if (mJobs.count(jobKey) == 0) {
151 return false;
152 }
153 mJobs.erase(jobKey);
154 return true;
155 }
156
Chong Zhang3fa408f2020-04-30 11:04:28 -0700157 bool getJob(ClientIdType clientId, JobIdType jobId,
158 TranscodingRequestParcel* request) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700159 JobKeyType jobKey = std::make_pair(clientId, jobId);
160 if (mJobs.count(jobKey) == 0) {
161 return false;
162 }
163
164 *(TranscodingRequest*)request = mJobs[jobKey].request;
165 return true;
166 }
167
168 void finishLastJob() {
169 auto it = mJobs.find(mLastJob);
170 if (it == mJobs.end()) {
171 return;
172 }
173 {
174 auto clientCallback = it->second.callback.lock();
175 if (clientCallback != nullptr) {
176 clientCallback->onTranscodingFinished(
177 mLastJob.second, TranscodingResultParcel({mLastJob.second, 0}));
178 }
179 }
180 mJobs.erase(it);
181 }
182
183 void abortLastJob() {
184 auto it = mJobs.find(mLastJob);
185 if (it == mJobs.end()) {
186 return;
187 }
188 {
189 auto clientCallback = it->second.callback.lock();
190 if (clientCallback != nullptr) {
Chong Zhang7ae4e2f2020-04-17 15:24:34 -0700191 clientCallback->onTranscodingFailed(mLastJob.second,
192 TranscodingErrorCode::kUnknown);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700193 }
194 }
195 mJobs.erase(it);
196 }
197
198 struct Job {
199 TranscodingRequest request;
200 std::weak_ptr<ITranscodingClientCallback> callback;
201 };
202
Chong Zhang3fa408f2020-04-30 11:04:28 -0700203 typedef std::pair<ClientIdType, JobIdType> JobKeyType;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700204 std::map<JobKeyType, Job> mJobs;
205 JobKeyType mLastJob;
hkuang26587cb2020-01-16 10:36:08 -0800206};
207
208class TranscodingClientManagerTest : public ::testing::Test {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700209public:
210 TranscodingClientManagerTest()
211 : mScheduler(new TestScheduler()),
212 mClientManager(new TranscodingClientManager(mScheduler)) {
hkuang5172cab2020-01-31 12:40:28 -0800213 ALOGD("TranscodingClientManagerTest created");
214 }
hkuang26587cb2020-01-16 10:36:08 -0800215
216 void SetUp() override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700217 mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>();
218 mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>();
219 mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>();
hkuang26587cb2020-01-16 10:36:08 -0800220 }
221
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700222 void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); }
hkuang26587cb2020-01-16 10:36:08 -0800223
224 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
225
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700226 void addMultipleClients() {
227 EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
228 kClientPackage, &mClient1),
229 OK);
230 EXPECT_NE(mClient1, nullptr);
231
232 EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientPid, kClientUid, kClientName,
233 kClientPackage, &mClient2),
234 OK);
235 EXPECT_NE(mClient2, nullptr);
236
237 EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientPid, kClientUid, kClientName,
238 kClientPackage, &mClient3),
239 OK);
240 EXPECT_NE(mClient3, nullptr);
241
242 EXPECT_EQ(mClientManager->getNumOfClients(), 3);
243 }
244
245 void unregisterMultipleClients() {
246 EXPECT_TRUE(mClient1->unregister().isOk());
247 EXPECT_TRUE(mClient2->unregister().isOk());
248 EXPECT_TRUE(mClient3->unregister().isOk());
249 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
250 }
251
252 std::shared_ptr<TestScheduler> mScheduler;
253 std::shared_ptr<TranscodingClientManager> mClientManager;
254 std::shared_ptr<ITranscodingClient> mClient1;
255 std::shared_ptr<ITranscodingClient> mClient2;
256 std::shared_ptr<ITranscodingClient> mClient3;
257 std::shared_ptr<TestClientCallback> mClientCallback1;
258 std::shared_ptr<TestClientCallback> mClientCallback2;
259 std::shared_ptr<TestClientCallback> mClientCallback3;
hkuang26587cb2020-01-16 10:36:08 -0800260};
261
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700262TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
263 // Add a client with null callback and expect failure.
Chong Zhang8e062632020-03-31 10:56:37 -0700264 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700265 status_t err = mClientManager->addClient(nullptr, kClientPid, kClientUid, kClientName,
266 kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700267 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800268}
269
270TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
Chong Zhang8e062632020-03-31 10:56:37 -0700271 // Add a client with invalid Pid and expect failure.
272 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700273 status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientPid, kClientUid,
274 kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700275 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
Chong Zhang8e062632020-03-31 10:56:37 -0700276}
hkuang26587cb2020-01-16 10:36:08 -0800277
Chong Zhang8e062632020-03-31 10:56:37 -0700278TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
279 // Add a client with invalid name and expect failure.
280 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700281 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid,
282 kInvalidClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700283 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800284}
285
286TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
Chong Zhang8e062632020-03-31 10:56:37 -0700287 // Add a client with invalid packagename and expect failure.
288 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700289 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
290 kInvalidClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700291 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800292}
293
294TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700295 // Add a valid client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700296 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700297 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
298 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700299 EXPECT_EQ(err, OK);
300 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700301 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800302
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700303 // Unregister client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700304 Status status = client->unregister();
305 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700306 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800307}
308
309TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
Chong Zhang8e062632020-03-31 10:56:37 -0700310 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700311 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
312 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700313 EXPECT_EQ(err, OK);
314 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700315 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800316
Chong Zhang8e062632020-03-31 10:56:37 -0700317 std::shared_ptr<ITranscodingClient> dupClient;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700318 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
319 "dupPackage", &dupClient);
Chong Zhang15c192a2020-05-05 16:24:00 -0700320 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
Chong Zhang8e062632020-03-31 10:56:37 -0700321 EXPECT_EQ(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700322 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800323
Chong Zhang8e062632020-03-31 10:56:37 -0700324 Status status = client->unregister();
325 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700326 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800327
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700328 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
329 "dupPackage", &dupClient);
Chong Zhang8e062632020-03-31 10:56:37 -0700330 EXPECT_EQ(err, OK);
331 EXPECT_NE(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700332 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800333
Chong Zhang8e062632020-03-31 10:56:37 -0700334 status = dupClient->unregister();
335 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700336 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800337}
338
339TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700340 addMultipleClients();
341 unregisterMultipleClients();
342}
hkuang26587cb2020-01-16 10:36:08 -0800343
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700344TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetJobs) {
345 addMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800346
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700347 // Test jobId assignment.
348 TranscodingRequestParcel request;
349 request.fileName = "test_file_0";
350 TranscodingJobParcel job;
351 bool result;
352 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
353 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700354 EXPECT_EQ(job.jobId, JOB(0));
hkuang26587cb2020-01-16 10:36:08 -0800355
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700356 request.fileName = "test_file_1";
357 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
358 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700359 EXPECT_EQ(job.jobId, JOB(1));
hkuang26587cb2020-01-16 10:36:08 -0800360
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700361 request.fileName = "test_file_2";
362 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
363 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700364 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700365
366 // Test submit bad request (no valid fileName) fails.
367 TranscodingRequestParcel badRequest;
368 badRequest.fileName = "bad_file";
369 EXPECT_TRUE(mClient1->submitRequest(badRequest, &job, &result).isOk());
370 EXPECT_FALSE(result);
371
372 // Test get jobs by id.
Chong Zhang15c192a2020-05-05 16:24:00 -0700373 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
374 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700375 EXPECT_EQ(job.request.fileName, "test_file_2");
376 EXPECT_TRUE(result);
377
378 // Test get jobs by invalid id fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700379 EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700380 EXPECT_FALSE(result);
381
382 // Test cancel non-existent job fail.
Chong Zhang15c192a2020-05-05 16:24:00 -0700383 EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700384 EXPECT_FALSE(result);
385
386 // Test cancel valid jobId in arbitrary order.
Chong Zhang15c192a2020-05-05 16:24:00 -0700387 EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700388 EXPECT_TRUE(result);
389
Chong Zhang15c192a2020-05-05 16:24:00 -0700390 EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700391 EXPECT_TRUE(result);
392
Chong Zhang15c192a2020-05-05 16:24:00 -0700393 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700394 EXPECT_TRUE(result);
395
396 // Test cancel job again fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700397 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700398 EXPECT_FALSE(result);
399
400 // Test get job after cancel fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700401 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700402 EXPECT_FALSE(result);
403
404 // Test jobId independence for each client.
405 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
406 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700407 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700408
409 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
410 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700411 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700412
413 unregisterMultipleClients();
414}
415
416TEST_F(TranscodingClientManagerTest, TestClientCallback) {
417 addMultipleClients();
418
419 TranscodingRequestParcel request;
420 request.fileName = "test_file_name";
421 TranscodingJobParcel job;
422 bool result;
423 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
424 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700425 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700426
427 mScheduler->finishLastJob();
428 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(job.jobId));
429
430 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
431 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700432 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700433
434 mScheduler->abortLastJob();
435 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
436
437 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
438 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700439 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700440
441 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
442 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700443 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700444
445 mScheduler->finishLastJob();
446 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
447
448 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800449}
450
Chong Zhang15c192a2020-05-05 16:24:00 -0700451TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
452 // Add a client.
453 std::shared_ptr<ITranscodingClient> client;
454 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
455 kClientPackage, &client);
456 EXPECT_EQ(err, OK);
457 EXPECT_NE(client.get(), nullptr);
458
459 // Submit 2 requests, 1 offline and 1 realtime.
460 TranscodingRequestParcel request;
461 TranscodingJobParcel job;
462 bool result;
463
464 request.fileName = "test_file_0";
465 request.priority = TranscodingJobPriority::kUnspecified;
466 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
467 EXPECT_EQ(job.jobId, JOB(0));
468
469 request.fileName = "test_file_1";
470 request.priority = TranscodingJobPriority::kNormal;
471 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
472 EXPECT_EQ(job.jobId, JOB(1));
473
474 // Unregister client, should succeed.
475 Status status = client->unregister();
476 EXPECT_TRUE(status.isOk());
477
478 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
479 request.fileName = "test_file_2";
480 request.priority = TranscodingJobPriority::kNormal;
481 status = client->submitRequest(request, &job, &result);
482 EXPECT_FALSE(status.isOk());
483 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
484
485 // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
486 // regardless of realtime or offline job, or whether the jobId is valid.
487 status = client->cancelJob(JOB(0), &result);
488 EXPECT_FALSE(status.isOk());
489 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
490
491 status = client->cancelJob(JOB(1), &result);
492 EXPECT_FALSE(status.isOk());
493 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
494
495 status = client->cancelJob(JOB(2), &result);
496 EXPECT_FALSE(status.isOk());
497 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
498
499 // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
500 // or offline job, or whether the jobId is valid.
501 status = client->getJobWithId(JOB(0), &job, &result);
502 EXPECT_FALSE(status.isOk());
503 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
504
505 status = client->getJobWithId(JOB(1), &job, &result);
506 EXPECT_FALSE(status.isOk());
507 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
508
509 status = client->getJobWithId(JOB(2), &job, &result);
510 EXPECT_FALSE(status.isOk());
511 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
512}
513
Chong Zhang8e062632020-03-31 10:56:37 -0700514} // namespace android