blob: 0ae8035db0ed55b1d1f6a79b571fe402904ce3fa [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.
hkuang72d105f2020-05-21 10:48:55 -0700136 if (request.sourceFilePath == "bad_source_file") {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700137 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;
hkuang72d105f2020-05-21 10:48:55 -0700349 request.sourceFilePath = "test_source_file_0";
350 request.destinationFilePath = "test_desintaion_file_0";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700351 TranscodingJobParcel job;
352 bool result;
353 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
354 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700355 EXPECT_EQ(job.jobId, JOB(0));
hkuang26587cb2020-01-16 10:36:08 -0800356
hkuang72d105f2020-05-21 10:48:55 -0700357 request.sourceFilePath = "test_source_file_1";
358 request.destinationFilePath = "test_desintaion_file_1";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700359 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
360 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700361 EXPECT_EQ(job.jobId, JOB(1));
hkuang26587cb2020-01-16 10:36:08 -0800362
hkuang72d105f2020-05-21 10:48:55 -0700363 request.sourceFilePath = "test_source_file_2";
364 request.destinationFilePath = "test_desintaion_file_2";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700365 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
366 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700367 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700368
hkuang72d105f2020-05-21 10:48:55 -0700369 // Test submit bad request (no valid sourceFilePath) fails.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700370 TranscodingRequestParcel badRequest;
hkuang72d105f2020-05-21 10:48:55 -0700371 badRequest.sourceFilePath = "bad_source_file";
372 badRequest.destinationFilePath = "bad_destination_file";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700373 EXPECT_TRUE(mClient1->submitRequest(badRequest, &job, &result).isOk());
374 EXPECT_FALSE(result);
375
376 // Test get jobs by id.
Chong Zhang15c192a2020-05-05 16:24:00 -0700377 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
378 EXPECT_EQ(job.jobId, JOB(2));
hkuang72d105f2020-05-21 10:48:55 -0700379 EXPECT_EQ(job.request.sourceFilePath, "test_source_file_2");
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700380 EXPECT_TRUE(result);
381
382 // Test get jobs by invalid id fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700383 EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700384 EXPECT_FALSE(result);
385
386 // Test cancel non-existent job fail.
Chong Zhang15c192a2020-05-05 16:24:00 -0700387 EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700388 EXPECT_FALSE(result);
389
390 // Test cancel valid jobId in arbitrary order.
Chong Zhang15c192a2020-05-05 16:24:00 -0700391 EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700392 EXPECT_TRUE(result);
393
Chong Zhang15c192a2020-05-05 16:24:00 -0700394 EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700395 EXPECT_TRUE(result);
396
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_TRUE(result);
399
400 // Test cancel job again fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700401 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700402 EXPECT_FALSE(result);
403
404 // Test get job after cancel fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700405 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700406 EXPECT_FALSE(result);
407
408 // Test jobId independence for each client.
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(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700412
413 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
414 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700415 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700416
417 unregisterMultipleClients();
418}
419
420TEST_F(TranscodingClientManagerTest, TestClientCallback) {
421 addMultipleClients();
422
423 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700424 request.sourceFilePath = "test_source_file_name";
425 request.destinationFilePath = "test_destination_file_name";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700426 TranscodingJobParcel job;
427 bool result;
428 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
429 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700430 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700431
432 mScheduler->finishLastJob();
433 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(job.jobId));
434
435 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
436 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700437 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700438
439 mScheduler->abortLastJob();
440 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
441
442 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
443 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700444 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700445
446 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
447 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700448 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700449
450 mScheduler->finishLastJob();
451 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
452
453 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800454}
455
Chong Zhang15c192a2020-05-05 16:24:00 -0700456TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
457 // Add a client.
458 std::shared_ptr<ITranscodingClient> client;
459 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
460 kClientPackage, &client);
461 EXPECT_EQ(err, OK);
462 EXPECT_NE(client.get(), nullptr);
463
464 // Submit 2 requests, 1 offline and 1 realtime.
465 TranscodingRequestParcel request;
466 TranscodingJobParcel job;
467 bool result;
468
hkuang72d105f2020-05-21 10:48:55 -0700469 request.sourceFilePath = "test_source_file_0";
470 request.destinationFilePath = "test_destination_file_0";
Chong Zhang15c192a2020-05-05 16:24:00 -0700471 request.priority = TranscodingJobPriority::kUnspecified;
472 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
473 EXPECT_EQ(job.jobId, JOB(0));
474
hkuang72d105f2020-05-21 10:48:55 -0700475 request.sourceFilePath = "test_source_file_1";
476 request.destinationFilePath = "test_destination_file_1";
Chong Zhang15c192a2020-05-05 16:24:00 -0700477 request.priority = TranscodingJobPriority::kNormal;
478 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
479 EXPECT_EQ(job.jobId, JOB(1));
480
481 // Unregister client, should succeed.
482 Status status = client->unregister();
483 EXPECT_TRUE(status.isOk());
484
485 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
hkuang72d105f2020-05-21 10:48:55 -0700486 request.sourceFilePath = "test_source_file_2";
487 request.destinationFilePath = "test_destination_file_2";
Chong Zhang15c192a2020-05-05 16:24:00 -0700488 request.priority = TranscodingJobPriority::kNormal;
489 status = client->submitRequest(request, &job, &result);
490 EXPECT_FALSE(status.isOk());
491 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
492
493 // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
494 // regardless of realtime or offline job, or whether the jobId is valid.
495 status = client->cancelJob(JOB(0), &result);
496 EXPECT_FALSE(status.isOk());
497 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
498
499 status = client->cancelJob(JOB(1), &result);
500 EXPECT_FALSE(status.isOk());
501 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
502
503 status = client->cancelJob(JOB(2), &result);
504 EXPECT_FALSE(status.isOk());
505 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
506
507 // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
508 // or offline job, or whether the jobId is valid.
509 status = client->getJobWithId(JOB(0), &job, &result);
510 EXPECT_FALSE(status.isOk());
511 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
512
513 status = client->getJobWithId(JOB(1), &job, &result);
514 EXPECT_FALSE(status.isOk());
515 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
516
517 status = client->getJobWithId(JOB(2), &job, &result);
518 EXPECT_FALSE(status.isOk());
519 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
520}
521
Chong Zhang8e062632020-03-31 10:56:37 -0700522} // namespace android