blob: db171ce3b3c06d562a5aa330d4af17c79647106c [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
hkuang19253092020-06-01 09:10:49 -070062 Status openFileDescriptor(const std::string& /*in_fileUri*/, const std::string& /*in_mode*/,
63 ::ndk::ScopedFileDescriptor* /*_aidl_return*/) override {
64 return Status::ok();
65 }
66
Chong Zhang6d58e4b2020-03-31 09:41:10 -070067 Status onTranscodingFinished(int32_t in_jobId,
68 const TranscodingResultParcel& in_result) override {
69 EXPECT_EQ(in_jobId, in_result.jobId);
70 mEventQueue.push_back(Finished(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080071 return Status::ok();
72 }
73
Chong Zhang6d58e4b2020-03-31 09:41:10 -070074 Status onTranscodingFailed(int32_t in_jobId, TranscodingErrorCode /*in_errorCode */) override {
75 mEventQueue.push_back(Failed(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080076 return Status::ok();
77 }
78
79 Status onAwaitNumberOfJobsChanged(int32_t /* in_jobId */, int32_t /* in_oldAwaitNumber */,
80 int32_t /* in_newAwaitNumber */) override {
81 return Status::ok();
82 }
83
84 Status onProgressUpdate(int32_t /* in_jobId */, int32_t /* in_progress */) override {
85 return Status::ok();
86 }
87
Chong Zhang6d58e4b2020-03-31 09:41:10 -070088 struct Event {
89 enum {
90 NoEvent,
91 Finished,
92 Failed,
93 } type;
Chong Zhang3fa408f2020-04-30 11:04:28 -070094 JobIdType jobId;
Chong Zhang6d58e4b2020-03-31 09:41:10 -070095 };
96
97 static constexpr Event NoEvent = {Event::NoEvent, 0};
98#define DECLARE_EVENT(action) \
Chong Zhang3fa408f2020-04-30 11:04:28 -070099 static Event action(JobIdType jobId) { return {Event::action, jobId}; }
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700100
101 DECLARE_EVENT(Finished);
102 DECLARE_EVENT(Failed);
103
104 const Event& popEvent() {
105 if (mEventQueue.empty()) {
106 mPoppedEvent = NoEvent;
107 } else {
108 mPoppedEvent = *mEventQueue.begin();
109 mEventQueue.pop_front();
110 }
111 return mPoppedEvent;
112 }
hkuang26587cb2020-01-16 10:36:08 -0800113
Chong Zhang8e062632020-03-31 10:56:37 -0700114private:
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700115 Event mPoppedEvent;
116 std::list<Event> mEventQueue;
117
118 TestClientCallback(const TestClientCallback&) = delete;
119 TestClientCallback& operator=(const TestClientCallback&) = delete;
120};
121
122bool operator==(const TestClientCallback::Event& lhs, const TestClientCallback::Event& rhs) {
123 return lhs.type == rhs.type && lhs.jobId == rhs.jobId;
124}
125
126struct TestScheduler : public SchedulerClientInterface {
127 TestScheduler() { ALOGI("TestScheduler Created"); }
128
129 virtual ~TestScheduler() { ALOGI("TestScheduler Destroyed"); }
130
Chong Zhang3fa408f2020-04-30 11:04:28 -0700131 bool submit(ClientIdType clientId, JobIdType jobId, uid_t /*uid*/,
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700132 const TranscodingRequestParcel& request,
133 const std::weak_ptr<ITranscodingClientCallback>& clientCallback) override {
134 JobKeyType jobKey = std::make_pair(clientId, jobId);
135 if (mJobs.count(jobKey) > 0) {
136 return false;
137 }
138
139 // This is the secret name we'll check, to test error propagation from
140 // the scheduler back to client.
hkuang72d105f2020-05-21 10:48:55 -0700141 if (request.sourceFilePath == "bad_source_file") {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700142 return false;
143 }
144
145 mJobs[jobKey].request = request;
146 mJobs[jobKey].callback = clientCallback;
147
148 mLastJob = jobKey;
149 return true;
150 }
151
Chong Zhang3fa408f2020-04-30 11:04:28 -0700152 bool cancel(ClientIdType clientId, JobIdType jobId) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700153 JobKeyType jobKey = std::make_pair(clientId, jobId);
154
155 if (mJobs.count(jobKey) == 0) {
156 return false;
157 }
158 mJobs.erase(jobKey);
159 return true;
160 }
161
Chong Zhang3fa408f2020-04-30 11:04:28 -0700162 bool getJob(ClientIdType clientId, JobIdType jobId,
163 TranscodingRequestParcel* request) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700164 JobKeyType jobKey = std::make_pair(clientId, jobId);
165 if (mJobs.count(jobKey) == 0) {
166 return false;
167 }
168
169 *(TranscodingRequest*)request = mJobs[jobKey].request;
170 return true;
171 }
172
173 void finishLastJob() {
174 auto it = mJobs.find(mLastJob);
175 if (it == mJobs.end()) {
176 return;
177 }
178 {
179 auto clientCallback = it->second.callback.lock();
180 if (clientCallback != nullptr) {
181 clientCallback->onTranscodingFinished(
182 mLastJob.second, TranscodingResultParcel({mLastJob.second, 0}));
183 }
184 }
185 mJobs.erase(it);
186 }
187
188 void abortLastJob() {
189 auto it = mJobs.find(mLastJob);
190 if (it == mJobs.end()) {
191 return;
192 }
193 {
194 auto clientCallback = it->second.callback.lock();
195 if (clientCallback != nullptr) {
Chong Zhang7ae4e2f2020-04-17 15:24:34 -0700196 clientCallback->onTranscodingFailed(mLastJob.second,
197 TranscodingErrorCode::kUnknown);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700198 }
199 }
200 mJobs.erase(it);
201 }
202
203 struct Job {
204 TranscodingRequest request;
205 std::weak_ptr<ITranscodingClientCallback> callback;
206 };
207
Chong Zhang3fa408f2020-04-30 11:04:28 -0700208 typedef std::pair<ClientIdType, JobIdType> JobKeyType;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700209 std::map<JobKeyType, Job> mJobs;
210 JobKeyType mLastJob;
hkuang26587cb2020-01-16 10:36:08 -0800211};
212
213class TranscodingClientManagerTest : public ::testing::Test {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700214public:
215 TranscodingClientManagerTest()
216 : mScheduler(new TestScheduler()),
217 mClientManager(new TranscodingClientManager(mScheduler)) {
hkuang5172cab2020-01-31 12:40:28 -0800218 ALOGD("TranscodingClientManagerTest created");
219 }
hkuang26587cb2020-01-16 10:36:08 -0800220
221 void SetUp() override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700222 mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>();
223 mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>();
224 mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>();
hkuang26587cb2020-01-16 10:36:08 -0800225 }
226
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700227 void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); }
hkuang26587cb2020-01-16 10:36:08 -0800228
229 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
230
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700231 void addMultipleClients() {
232 EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
233 kClientPackage, &mClient1),
234 OK);
235 EXPECT_NE(mClient1, nullptr);
236
237 EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientPid, kClientUid, kClientName,
238 kClientPackage, &mClient2),
239 OK);
240 EXPECT_NE(mClient2, nullptr);
241
242 EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientPid, kClientUid, kClientName,
243 kClientPackage, &mClient3),
244 OK);
245 EXPECT_NE(mClient3, nullptr);
246
247 EXPECT_EQ(mClientManager->getNumOfClients(), 3);
248 }
249
250 void unregisterMultipleClients() {
251 EXPECT_TRUE(mClient1->unregister().isOk());
252 EXPECT_TRUE(mClient2->unregister().isOk());
253 EXPECT_TRUE(mClient3->unregister().isOk());
254 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
255 }
256
257 std::shared_ptr<TestScheduler> mScheduler;
258 std::shared_ptr<TranscodingClientManager> mClientManager;
259 std::shared_ptr<ITranscodingClient> mClient1;
260 std::shared_ptr<ITranscodingClient> mClient2;
261 std::shared_ptr<ITranscodingClient> mClient3;
262 std::shared_ptr<TestClientCallback> mClientCallback1;
263 std::shared_ptr<TestClientCallback> mClientCallback2;
264 std::shared_ptr<TestClientCallback> mClientCallback3;
hkuang26587cb2020-01-16 10:36:08 -0800265};
266
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700267TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
268 // Add a client with null callback and expect failure.
Chong Zhang8e062632020-03-31 10:56:37 -0700269 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700270 status_t err = mClientManager->addClient(nullptr, kClientPid, kClientUid, kClientName,
271 kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700272 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800273}
274
275TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
Chong Zhang8e062632020-03-31 10:56:37 -0700276 // Add a client with invalid Pid and expect failure.
277 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700278 status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientPid, kClientUid,
279 kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700280 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
Chong Zhang8e062632020-03-31 10:56:37 -0700281}
hkuang26587cb2020-01-16 10:36:08 -0800282
Chong Zhang8e062632020-03-31 10:56:37 -0700283TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
284 // Add a client with invalid name and expect failure.
285 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700286 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid,
287 kInvalidClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700288 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800289}
290
291TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
Chong Zhang8e062632020-03-31 10:56:37 -0700292 // Add a client with invalid packagename and expect failure.
293 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700294 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
295 kInvalidClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700296 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800297}
298
299TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700300 // Add a valid client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700301 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700302 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
303 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700304 EXPECT_EQ(err, OK);
305 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700306 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800307
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700308 // Unregister client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700309 Status status = client->unregister();
310 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700311 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800312}
313
314TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
Chong Zhang8e062632020-03-31 10:56:37 -0700315 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700316 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
317 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700318 EXPECT_EQ(err, OK);
319 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700320 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800321
Chong Zhang8e062632020-03-31 10:56:37 -0700322 std::shared_ptr<ITranscodingClient> dupClient;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700323 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
324 "dupPackage", &dupClient);
Chong Zhang15c192a2020-05-05 16:24:00 -0700325 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
Chong Zhang8e062632020-03-31 10:56:37 -0700326 EXPECT_EQ(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700327 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800328
Chong Zhang8e062632020-03-31 10:56:37 -0700329 Status status = client->unregister();
330 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700331 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800332
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700333 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
334 "dupPackage", &dupClient);
Chong Zhang8e062632020-03-31 10:56:37 -0700335 EXPECT_EQ(err, OK);
336 EXPECT_NE(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700337 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800338
Chong Zhang8e062632020-03-31 10:56:37 -0700339 status = dupClient->unregister();
340 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700341 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800342}
343
344TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700345 addMultipleClients();
346 unregisterMultipleClients();
347}
hkuang26587cb2020-01-16 10:36:08 -0800348
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700349TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetJobs) {
350 addMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800351
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700352 // Test jobId assignment.
353 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700354 request.sourceFilePath = "test_source_file_0";
355 request.destinationFilePath = "test_desintaion_file_0";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700356 TranscodingJobParcel job;
357 bool result;
358 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
359 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700360 EXPECT_EQ(job.jobId, JOB(0));
hkuang26587cb2020-01-16 10:36:08 -0800361
hkuang72d105f2020-05-21 10:48:55 -0700362 request.sourceFilePath = "test_source_file_1";
363 request.destinationFilePath = "test_desintaion_file_1";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700364 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
365 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700366 EXPECT_EQ(job.jobId, JOB(1));
hkuang26587cb2020-01-16 10:36:08 -0800367
hkuang72d105f2020-05-21 10:48:55 -0700368 request.sourceFilePath = "test_source_file_2";
369 request.destinationFilePath = "test_desintaion_file_2";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700370 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
371 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700372 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700373
hkuang72d105f2020-05-21 10:48:55 -0700374 // Test submit bad request (no valid sourceFilePath) fails.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700375 TranscodingRequestParcel badRequest;
hkuang72d105f2020-05-21 10:48:55 -0700376 badRequest.sourceFilePath = "bad_source_file";
377 badRequest.destinationFilePath = "bad_destination_file";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700378 EXPECT_TRUE(mClient1->submitRequest(badRequest, &job, &result).isOk());
379 EXPECT_FALSE(result);
380
381 // Test get jobs by id.
Chong Zhang15c192a2020-05-05 16:24:00 -0700382 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
383 EXPECT_EQ(job.jobId, JOB(2));
hkuang72d105f2020-05-21 10:48:55 -0700384 EXPECT_EQ(job.request.sourceFilePath, "test_source_file_2");
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700385 EXPECT_TRUE(result);
386
387 // Test get jobs by invalid id fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700388 EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700389 EXPECT_FALSE(result);
390
391 // Test cancel non-existent job fail.
Chong Zhang15c192a2020-05-05 16:24:00 -0700392 EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700393 EXPECT_FALSE(result);
394
395 // Test cancel valid jobId in arbitrary order.
Chong Zhang15c192a2020-05-05 16:24:00 -0700396 EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700397 EXPECT_TRUE(result);
398
Chong Zhang15c192a2020-05-05 16:24:00 -0700399 EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700400 EXPECT_TRUE(result);
401
Chong Zhang15c192a2020-05-05 16:24:00 -0700402 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700403 EXPECT_TRUE(result);
404
405 // Test cancel job again fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700406 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700407 EXPECT_FALSE(result);
408
409 // Test get job after cancel fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700410 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700411 EXPECT_FALSE(result);
412
413 // Test jobId independence for each client.
414 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
415 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700416 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700417
418 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
419 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700420 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700421
422 unregisterMultipleClients();
423}
424
425TEST_F(TranscodingClientManagerTest, TestClientCallback) {
426 addMultipleClients();
427
428 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700429 request.sourceFilePath = "test_source_file_name";
430 request.destinationFilePath = "test_destination_file_name";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700431 TranscodingJobParcel job;
432 bool result;
433 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
434 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700435 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700436
437 mScheduler->finishLastJob();
438 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(job.jobId));
439
440 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
441 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700442 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700443
444 mScheduler->abortLastJob();
445 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
446
447 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
448 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700449 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700450
451 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
452 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700453 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700454
455 mScheduler->finishLastJob();
456 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
457
458 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800459}
460
Chong Zhang15c192a2020-05-05 16:24:00 -0700461TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
462 // Add a client.
463 std::shared_ptr<ITranscodingClient> client;
464 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
465 kClientPackage, &client);
466 EXPECT_EQ(err, OK);
467 EXPECT_NE(client.get(), nullptr);
468
469 // Submit 2 requests, 1 offline and 1 realtime.
470 TranscodingRequestParcel request;
471 TranscodingJobParcel job;
472 bool result;
473
hkuang72d105f2020-05-21 10:48:55 -0700474 request.sourceFilePath = "test_source_file_0";
475 request.destinationFilePath = "test_destination_file_0";
Chong Zhang15c192a2020-05-05 16:24:00 -0700476 request.priority = TranscodingJobPriority::kUnspecified;
477 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
478 EXPECT_EQ(job.jobId, JOB(0));
479
hkuang72d105f2020-05-21 10:48:55 -0700480 request.sourceFilePath = "test_source_file_1";
481 request.destinationFilePath = "test_destination_file_1";
Chong Zhang15c192a2020-05-05 16:24:00 -0700482 request.priority = TranscodingJobPriority::kNormal;
483 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
484 EXPECT_EQ(job.jobId, JOB(1));
485
486 // Unregister client, should succeed.
487 Status status = client->unregister();
488 EXPECT_TRUE(status.isOk());
489
490 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
hkuang72d105f2020-05-21 10:48:55 -0700491 request.sourceFilePath = "test_source_file_2";
492 request.destinationFilePath = "test_destination_file_2";
Chong Zhang15c192a2020-05-05 16:24:00 -0700493 request.priority = TranscodingJobPriority::kNormal;
494 status = client->submitRequest(request, &job, &result);
495 EXPECT_FALSE(status.isOk());
496 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
497
498 // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
499 // regardless of realtime or offline job, or whether the jobId is valid.
500 status = client->cancelJob(JOB(0), &result);
501 EXPECT_FALSE(status.isOk());
502 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
503
504 status = client->cancelJob(JOB(1), &result);
505 EXPECT_FALSE(status.isOk());
506 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
507
508 status = client->cancelJob(JOB(2), &result);
509 EXPECT_FALSE(status.isOk());
510 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
511
512 // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
513 // or offline job, or whether the jobId is valid.
514 status = client->getJobWithId(JOB(0), &job, &result);
515 EXPECT_FALSE(status.isOk());
516 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
517
518 status = client->getJobWithId(JOB(1), &job, &result);
519 EXPECT_FALSE(status.isOk());
520 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
521
522 status = client->getJobWithId(JOB(2), &job, &result);
523 EXPECT_FALSE(status.isOk());
524 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
525}
526
Chong Zhang8e062632020-03-31 10:56:37 -0700527} // namespace android