blob: 82983bd6a6bc04b1b2accb5dcb2934219cc581b6 [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
hkuang96471b82020-06-08 11:12:46 -070067 Status onTranscodingStarted(int32_t /*in_jobId*/) override { return Status::ok(); }
68
69 Status onTranscodingPaused(int32_t /*in_jobId*/) override { return Status::ok(); }
70
71 Status onTranscodingResumed(int32_t /*in_jobId*/) override { return Status::ok(); }
72
Chong Zhang6d58e4b2020-03-31 09:41:10 -070073 Status onTranscodingFinished(int32_t in_jobId,
74 const TranscodingResultParcel& in_result) override {
75 EXPECT_EQ(in_jobId, in_result.jobId);
76 mEventQueue.push_back(Finished(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080077 return Status::ok();
78 }
79
Chong Zhang6d58e4b2020-03-31 09:41:10 -070080 Status onTranscodingFailed(int32_t in_jobId, TranscodingErrorCode /*in_errorCode */) override {
81 mEventQueue.push_back(Failed(in_jobId));
hkuang26587cb2020-01-16 10:36:08 -080082 return Status::ok();
83 }
84
85 Status onAwaitNumberOfJobsChanged(int32_t /* in_jobId */, int32_t /* in_oldAwaitNumber */,
86 int32_t /* in_newAwaitNumber */) override {
87 return Status::ok();
88 }
89
90 Status onProgressUpdate(int32_t /* in_jobId */, int32_t /* in_progress */) override {
91 return Status::ok();
92 }
93
Chong Zhang6d58e4b2020-03-31 09:41:10 -070094 struct Event {
95 enum {
96 NoEvent,
97 Finished,
98 Failed,
99 } type;
Chong Zhang3fa408f2020-04-30 11:04:28 -0700100 JobIdType jobId;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700101 };
102
103 static constexpr Event NoEvent = {Event::NoEvent, 0};
104#define DECLARE_EVENT(action) \
Chong Zhang3fa408f2020-04-30 11:04:28 -0700105 static Event action(JobIdType jobId) { return {Event::action, jobId}; }
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700106
107 DECLARE_EVENT(Finished);
108 DECLARE_EVENT(Failed);
109
110 const Event& popEvent() {
111 if (mEventQueue.empty()) {
112 mPoppedEvent = NoEvent;
113 } else {
114 mPoppedEvent = *mEventQueue.begin();
115 mEventQueue.pop_front();
116 }
117 return mPoppedEvent;
118 }
hkuang26587cb2020-01-16 10:36:08 -0800119
Chong Zhang8e062632020-03-31 10:56:37 -0700120private:
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700121 Event mPoppedEvent;
122 std::list<Event> mEventQueue;
123
124 TestClientCallback(const TestClientCallback&) = delete;
125 TestClientCallback& operator=(const TestClientCallback&) = delete;
126};
127
128bool operator==(const TestClientCallback::Event& lhs, const TestClientCallback::Event& rhs) {
129 return lhs.type == rhs.type && lhs.jobId == rhs.jobId;
130}
131
132struct TestScheduler : public SchedulerClientInterface {
133 TestScheduler() { ALOGI("TestScheduler Created"); }
134
135 virtual ~TestScheduler() { ALOGI("TestScheduler Destroyed"); }
136
Chong Zhang3fa408f2020-04-30 11:04:28 -0700137 bool submit(ClientIdType clientId, JobIdType jobId, uid_t /*uid*/,
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700138 const TranscodingRequestParcel& request,
139 const std::weak_ptr<ITranscodingClientCallback>& clientCallback) override {
140 JobKeyType jobKey = std::make_pair(clientId, jobId);
141 if (mJobs.count(jobKey) > 0) {
142 return false;
143 }
144
145 // This is the secret name we'll check, to test error propagation from
146 // the scheduler back to client.
hkuang72d105f2020-05-21 10:48:55 -0700147 if (request.sourceFilePath == "bad_source_file") {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700148 return false;
149 }
150
151 mJobs[jobKey].request = request;
152 mJobs[jobKey].callback = clientCallback;
153
154 mLastJob = jobKey;
155 return true;
156 }
157
Chong Zhang3fa408f2020-04-30 11:04:28 -0700158 bool cancel(ClientIdType clientId, JobIdType jobId) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700159 JobKeyType jobKey = std::make_pair(clientId, jobId);
160
161 if (mJobs.count(jobKey) == 0) {
162 return false;
163 }
164 mJobs.erase(jobKey);
165 return true;
166 }
167
Chong Zhang3fa408f2020-04-30 11:04:28 -0700168 bool getJob(ClientIdType clientId, JobIdType jobId,
169 TranscodingRequestParcel* request) override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700170 JobKeyType jobKey = std::make_pair(clientId, jobId);
171 if (mJobs.count(jobKey) == 0) {
172 return false;
173 }
174
175 *(TranscodingRequest*)request = mJobs[jobKey].request;
176 return true;
177 }
178
179 void finishLastJob() {
180 auto it = mJobs.find(mLastJob);
181 if (it == mJobs.end()) {
182 return;
183 }
184 {
185 auto clientCallback = it->second.callback.lock();
186 if (clientCallback != nullptr) {
187 clientCallback->onTranscodingFinished(
188 mLastJob.second, TranscodingResultParcel({mLastJob.second, 0}));
189 }
190 }
191 mJobs.erase(it);
192 }
193
194 void abortLastJob() {
195 auto it = mJobs.find(mLastJob);
196 if (it == mJobs.end()) {
197 return;
198 }
199 {
200 auto clientCallback = it->second.callback.lock();
201 if (clientCallback != nullptr) {
Chong Zhang7ae4e2f2020-04-17 15:24:34 -0700202 clientCallback->onTranscodingFailed(mLastJob.second,
203 TranscodingErrorCode::kUnknown);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700204 }
205 }
206 mJobs.erase(it);
207 }
208
209 struct Job {
210 TranscodingRequest request;
211 std::weak_ptr<ITranscodingClientCallback> callback;
212 };
213
Chong Zhang3fa408f2020-04-30 11:04:28 -0700214 typedef std::pair<ClientIdType, JobIdType> JobKeyType;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700215 std::map<JobKeyType, Job> mJobs;
216 JobKeyType mLastJob;
hkuang26587cb2020-01-16 10:36:08 -0800217};
218
219class TranscodingClientManagerTest : public ::testing::Test {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700220public:
221 TranscodingClientManagerTest()
222 : mScheduler(new TestScheduler()),
223 mClientManager(new TranscodingClientManager(mScheduler)) {
hkuang5172cab2020-01-31 12:40:28 -0800224 ALOGD("TranscodingClientManagerTest created");
225 }
hkuang26587cb2020-01-16 10:36:08 -0800226
227 void SetUp() override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700228 mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>();
229 mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>();
230 mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>();
hkuang26587cb2020-01-16 10:36:08 -0800231 }
232
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700233 void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); }
hkuang26587cb2020-01-16 10:36:08 -0800234
235 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
236
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700237 void addMultipleClients() {
238 EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
239 kClientPackage, &mClient1),
240 OK);
241 EXPECT_NE(mClient1, nullptr);
242
243 EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientPid, kClientUid, kClientName,
244 kClientPackage, &mClient2),
245 OK);
246 EXPECT_NE(mClient2, nullptr);
247
248 EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientPid, kClientUid, kClientName,
249 kClientPackage, &mClient3),
250 OK);
251 EXPECT_NE(mClient3, nullptr);
252
253 EXPECT_EQ(mClientManager->getNumOfClients(), 3);
254 }
255
256 void unregisterMultipleClients() {
257 EXPECT_TRUE(mClient1->unregister().isOk());
258 EXPECT_TRUE(mClient2->unregister().isOk());
259 EXPECT_TRUE(mClient3->unregister().isOk());
260 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
261 }
262
263 std::shared_ptr<TestScheduler> mScheduler;
264 std::shared_ptr<TranscodingClientManager> mClientManager;
265 std::shared_ptr<ITranscodingClient> mClient1;
266 std::shared_ptr<ITranscodingClient> mClient2;
267 std::shared_ptr<ITranscodingClient> mClient3;
268 std::shared_ptr<TestClientCallback> mClientCallback1;
269 std::shared_ptr<TestClientCallback> mClientCallback2;
270 std::shared_ptr<TestClientCallback> mClientCallback3;
hkuang26587cb2020-01-16 10:36:08 -0800271};
272
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700273TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
274 // Add a client with null callback and expect failure.
Chong Zhang8e062632020-03-31 10:56:37 -0700275 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700276 status_t err = mClientManager->addClient(nullptr, kClientPid, kClientUid, kClientName,
277 kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700278 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800279}
280
281TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
Chong Zhang8e062632020-03-31 10:56:37 -0700282 // Add a client with invalid Pid and expect failure.
283 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700284 status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientPid, kClientUid,
285 kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700286 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
Chong Zhang8e062632020-03-31 10:56:37 -0700287}
hkuang26587cb2020-01-16 10:36:08 -0800288
Chong Zhang8e062632020-03-31 10:56:37 -0700289TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
290 // Add a client with invalid name and expect failure.
291 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700292 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid,
293 kInvalidClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700294 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800295}
296
297TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
Chong Zhang8e062632020-03-31 10:56:37 -0700298 // Add a client with invalid packagename and expect failure.
299 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700300 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
301 kInvalidClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700302 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800303}
304
305TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700306 // Add a valid client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700307 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700308 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
309 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700310 EXPECT_EQ(err, OK);
311 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700312 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800313
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700314 // Unregister client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700315 Status status = client->unregister();
316 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700317 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800318}
319
320TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
Chong Zhang8e062632020-03-31 10:56:37 -0700321 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700322 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
323 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700324 EXPECT_EQ(err, OK);
325 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700326 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800327
Chong Zhang8e062632020-03-31 10:56:37 -0700328 std::shared_ptr<ITranscodingClient> dupClient;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700329 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
330 "dupPackage", &dupClient);
Chong Zhang15c192a2020-05-05 16:24:00 -0700331 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
Chong Zhang8e062632020-03-31 10:56:37 -0700332 EXPECT_EQ(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700333 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800334
Chong Zhang8e062632020-03-31 10:56:37 -0700335 Status status = client->unregister();
336 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700337 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800338
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700339 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
340 "dupPackage", &dupClient);
Chong Zhang8e062632020-03-31 10:56:37 -0700341 EXPECT_EQ(err, OK);
342 EXPECT_NE(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700343 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800344
Chong Zhang8e062632020-03-31 10:56:37 -0700345 status = dupClient->unregister();
346 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700347 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800348}
349
350TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700351 addMultipleClients();
352 unregisterMultipleClients();
353}
hkuang26587cb2020-01-16 10:36:08 -0800354
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700355TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetJobs) {
356 addMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800357
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700358 // Test jobId assignment.
359 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700360 request.sourceFilePath = "test_source_file_0";
361 request.destinationFilePath = "test_desintaion_file_0";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700362 TranscodingJobParcel job;
363 bool result;
364 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(0));
hkuang26587cb2020-01-16 10:36:08 -0800367
hkuang72d105f2020-05-21 10:48:55 -0700368 request.sourceFilePath = "test_source_file_1";
369 request.destinationFilePath = "test_desintaion_file_1";
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(1));
hkuang26587cb2020-01-16 10:36:08 -0800373
hkuang72d105f2020-05-21 10:48:55 -0700374 request.sourceFilePath = "test_source_file_2";
375 request.destinationFilePath = "test_desintaion_file_2";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700376 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
377 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700378 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700379
hkuang72d105f2020-05-21 10:48:55 -0700380 // Test submit bad request (no valid sourceFilePath) fails.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700381 TranscodingRequestParcel badRequest;
hkuang72d105f2020-05-21 10:48:55 -0700382 badRequest.sourceFilePath = "bad_source_file";
383 badRequest.destinationFilePath = "bad_destination_file";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700384 EXPECT_TRUE(mClient1->submitRequest(badRequest, &job, &result).isOk());
385 EXPECT_FALSE(result);
386
387 // Test get jobs by id.
Chong Zhang15c192a2020-05-05 16:24:00 -0700388 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
389 EXPECT_EQ(job.jobId, JOB(2));
hkuang72d105f2020-05-21 10:48:55 -0700390 EXPECT_EQ(job.request.sourceFilePath, "test_source_file_2");
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700391 EXPECT_TRUE(result);
392
393 // Test get jobs by invalid id fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700394 EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700395 EXPECT_FALSE(result);
396
397 // Test cancel non-existent job fail.
Chong Zhang15c192a2020-05-05 16:24:00 -0700398 EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700399 EXPECT_FALSE(result);
400
401 // Test cancel valid jobId in arbitrary order.
Chong Zhang15c192a2020-05-05 16:24:00 -0700402 EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700403 EXPECT_TRUE(result);
404
Chong Zhang15c192a2020-05-05 16:24:00 -0700405 EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700406 EXPECT_TRUE(result);
407
Chong Zhang15c192a2020-05-05 16:24:00 -0700408 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700409 EXPECT_TRUE(result);
410
411 // Test cancel job again fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700412 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700413 EXPECT_FALSE(result);
414
415 // Test get job after cancel fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700416 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700417 EXPECT_FALSE(result);
418
419 // Test jobId independence for each client.
420 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
421 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700422 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700423
424 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
425 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700426 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700427
428 unregisterMultipleClients();
429}
430
431TEST_F(TranscodingClientManagerTest, TestClientCallback) {
432 addMultipleClients();
433
434 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700435 request.sourceFilePath = "test_source_file_name";
436 request.destinationFilePath = "test_destination_file_name";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700437 TranscodingJobParcel job;
438 bool result;
439 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
440 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700441 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700442
443 mScheduler->finishLastJob();
444 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(job.jobId));
445
446 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
447 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700448 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700449
450 mScheduler->abortLastJob();
451 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
452
453 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
454 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700455 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700456
457 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
458 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700459 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700460
461 mScheduler->finishLastJob();
462 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
463
464 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800465}
466
Chong Zhang15c192a2020-05-05 16:24:00 -0700467TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
468 // Add a client.
469 std::shared_ptr<ITranscodingClient> client;
470 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
471 kClientPackage, &client);
472 EXPECT_EQ(err, OK);
473 EXPECT_NE(client.get(), nullptr);
474
475 // Submit 2 requests, 1 offline and 1 realtime.
476 TranscodingRequestParcel request;
477 TranscodingJobParcel job;
478 bool result;
479
hkuang72d105f2020-05-21 10:48:55 -0700480 request.sourceFilePath = "test_source_file_0";
481 request.destinationFilePath = "test_destination_file_0";
Chong Zhang15c192a2020-05-05 16:24:00 -0700482 request.priority = TranscodingJobPriority::kUnspecified;
483 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
484 EXPECT_EQ(job.jobId, JOB(0));
485
hkuang72d105f2020-05-21 10:48:55 -0700486 request.sourceFilePath = "test_source_file_1";
487 request.destinationFilePath = "test_destination_file_1";
Chong Zhang15c192a2020-05-05 16:24:00 -0700488 request.priority = TranscodingJobPriority::kNormal;
489 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
490 EXPECT_EQ(job.jobId, JOB(1));
491
492 // Unregister client, should succeed.
493 Status status = client->unregister();
494 EXPECT_TRUE(status.isOk());
495
496 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
hkuang72d105f2020-05-21 10:48:55 -0700497 request.sourceFilePath = "test_source_file_2";
498 request.destinationFilePath = "test_destination_file_2";
Chong Zhang15c192a2020-05-05 16:24:00 -0700499 request.priority = TranscodingJobPriority::kNormal;
500 status = client->submitRequest(request, &job, &result);
501 EXPECT_FALSE(status.isOk());
502 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
503
504 // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
505 // regardless of realtime or offline job, or whether the jobId is valid.
506 status = client->cancelJob(JOB(0), &result);
507 EXPECT_FALSE(status.isOk());
508 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
509
510 status = client->cancelJob(JOB(1), &result);
511 EXPECT_FALSE(status.isOk());
512 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
513
514 status = client->cancelJob(JOB(2), &result);
515 EXPECT_FALSE(status.isOk());
516 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
517
518 // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
519 // or offline job, or whether the jobId is valid.
520 status = client->getJobWithId(JOB(0), &job, &result);
521 EXPECT_FALSE(status.isOk());
522 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
523
524 status = client->getJobWithId(JOB(1), &job, &result);
525 EXPECT_FALSE(status.isOk());
526 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
527
528 status = client->getJobWithId(JOB(2), &job, &result);
529 EXPECT_FALSE(status.isOk());
530 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
531}
532
Chong Zhang8e062632020-03-31 10:56:37 -0700533} // namespace android