blob: 1583325bd1821c5979a6e448e4b2eb558619131d [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(
hkuang0bd73742020-06-24 12:57:09 -0700188 mLastJob.second,
189 TranscodingResultParcel({mLastJob.second, 0, std::nullopt}));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700190 }
191 }
192 mJobs.erase(it);
193 }
194
195 void abortLastJob() {
196 auto it = mJobs.find(mLastJob);
197 if (it == mJobs.end()) {
198 return;
199 }
200 {
201 auto clientCallback = it->second.callback.lock();
202 if (clientCallback != nullptr) {
Chong Zhang7ae4e2f2020-04-17 15:24:34 -0700203 clientCallback->onTranscodingFailed(mLastJob.second,
204 TranscodingErrorCode::kUnknown);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700205 }
206 }
207 mJobs.erase(it);
208 }
209
210 struct Job {
211 TranscodingRequest request;
212 std::weak_ptr<ITranscodingClientCallback> callback;
213 };
214
Chong Zhang3fa408f2020-04-30 11:04:28 -0700215 typedef std::pair<ClientIdType, JobIdType> JobKeyType;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700216 std::map<JobKeyType, Job> mJobs;
217 JobKeyType mLastJob;
hkuang26587cb2020-01-16 10:36:08 -0800218};
219
220class TranscodingClientManagerTest : public ::testing::Test {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700221public:
222 TranscodingClientManagerTest()
223 : mScheduler(new TestScheduler()),
224 mClientManager(new TranscodingClientManager(mScheduler)) {
hkuang5172cab2020-01-31 12:40:28 -0800225 ALOGD("TranscodingClientManagerTest created");
226 }
hkuang26587cb2020-01-16 10:36:08 -0800227
228 void SetUp() override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700229 mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>();
230 mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>();
231 mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>();
hkuang26587cb2020-01-16 10:36:08 -0800232 }
233
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700234 void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); }
hkuang26587cb2020-01-16 10:36:08 -0800235
236 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
237
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700238 void addMultipleClients() {
239 EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
240 kClientPackage, &mClient1),
241 OK);
242 EXPECT_NE(mClient1, nullptr);
243
244 EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientPid, kClientUid, kClientName,
245 kClientPackage, &mClient2),
246 OK);
247 EXPECT_NE(mClient2, nullptr);
248
249 EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientPid, kClientUid, kClientName,
250 kClientPackage, &mClient3),
251 OK);
252 EXPECT_NE(mClient3, nullptr);
253
254 EXPECT_EQ(mClientManager->getNumOfClients(), 3);
255 }
256
257 void unregisterMultipleClients() {
258 EXPECT_TRUE(mClient1->unregister().isOk());
259 EXPECT_TRUE(mClient2->unregister().isOk());
260 EXPECT_TRUE(mClient3->unregister().isOk());
261 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
262 }
263
264 std::shared_ptr<TestScheduler> mScheduler;
265 std::shared_ptr<TranscodingClientManager> mClientManager;
266 std::shared_ptr<ITranscodingClient> mClient1;
267 std::shared_ptr<ITranscodingClient> mClient2;
268 std::shared_ptr<ITranscodingClient> mClient3;
269 std::shared_ptr<TestClientCallback> mClientCallback1;
270 std::shared_ptr<TestClientCallback> mClientCallback2;
271 std::shared_ptr<TestClientCallback> mClientCallback3;
hkuang26587cb2020-01-16 10:36:08 -0800272};
273
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700274TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
275 // Add a client with null callback and expect failure.
Chong Zhang8e062632020-03-31 10:56:37 -0700276 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700277 status_t err = mClientManager->addClient(nullptr, kClientPid, kClientUid, kClientName,
278 kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700279 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800280}
281
282TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
Chong Zhang8e062632020-03-31 10:56:37 -0700283 // Add a client with invalid Pid and expect failure.
284 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700285 status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientPid, kClientUid,
286 kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700287 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
Chong Zhang8e062632020-03-31 10:56:37 -0700288}
hkuang26587cb2020-01-16 10:36:08 -0800289
Chong Zhang8e062632020-03-31 10:56:37 -0700290TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
291 // Add a client with invalid name and expect failure.
292 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700293 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid,
294 kInvalidClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700295 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800296}
297
298TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
Chong Zhang8e062632020-03-31 10:56:37 -0700299 // Add a client with invalid packagename and expect failure.
300 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700301 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
302 kInvalidClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700303 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800304}
305
306TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700307 // Add a valid client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700308 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700309 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
310 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700311 EXPECT_EQ(err, OK);
312 EXPECT_NE(client.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700313 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800314
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700315 // Unregister client, should succeed.
Chong Zhang8e062632020-03-31 10:56:37 -0700316 Status status = client->unregister();
317 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700318 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800319}
320
321TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
Chong Zhang8e062632020-03-31 10:56:37 -0700322 std::shared_ptr<ITranscodingClient> client;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700323 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
324 kClientPackage, &client);
Chong Zhang8e062632020-03-31 10:56:37 -0700325 EXPECT_EQ(err, OK);
326 EXPECT_NE(client.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 std::shared_ptr<ITranscodingClient> dupClient;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700330 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
331 "dupPackage", &dupClient);
Chong Zhang15c192a2020-05-05 16:24:00 -0700332 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
Chong Zhang8e062632020-03-31 10:56:37 -0700333 EXPECT_EQ(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700334 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800335
Chong Zhang8e062632020-03-31 10:56:37 -0700336 Status status = client->unregister();
337 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700338 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800339
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700340 err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
341 "dupPackage", &dupClient);
Chong Zhang8e062632020-03-31 10:56:37 -0700342 EXPECT_EQ(err, OK);
343 EXPECT_NE(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700344 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800345
Chong Zhang8e062632020-03-31 10:56:37 -0700346 status = dupClient->unregister();
347 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700348 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800349}
350
351TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700352 addMultipleClients();
353 unregisterMultipleClients();
354}
hkuang26587cb2020-01-16 10:36:08 -0800355
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700356TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetJobs) {
357 addMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800358
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700359 // Test jobId assignment.
360 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700361 request.sourceFilePath = "test_source_file_0";
362 request.destinationFilePath = "test_desintaion_file_0";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700363 TranscodingJobParcel job;
364 bool result;
365 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(0));
hkuang26587cb2020-01-16 10:36:08 -0800368
hkuang72d105f2020-05-21 10:48:55 -0700369 request.sourceFilePath = "test_source_file_1";
370 request.destinationFilePath = "test_desintaion_file_1";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700371 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
372 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700373 EXPECT_EQ(job.jobId, JOB(1));
hkuang26587cb2020-01-16 10:36:08 -0800374
hkuang72d105f2020-05-21 10:48:55 -0700375 request.sourceFilePath = "test_source_file_2";
376 request.destinationFilePath = "test_desintaion_file_2";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700377 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
378 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700379 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700380
hkuang72d105f2020-05-21 10:48:55 -0700381 // Test submit bad request (no valid sourceFilePath) fails.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700382 TranscodingRequestParcel badRequest;
hkuang72d105f2020-05-21 10:48:55 -0700383 badRequest.sourceFilePath = "bad_source_file";
384 badRequest.destinationFilePath = "bad_destination_file";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700385 EXPECT_TRUE(mClient1->submitRequest(badRequest, &job, &result).isOk());
386 EXPECT_FALSE(result);
387
388 // Test get jobs by id.
Chong Zhang15c192a2020-05-05 16:24:00 -0700389 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
390 EXPECT_EQ(job.jobId, JOB(2));
hkuang72d105f2020-05-21 10:48:55 -0700391 EXPECT_EQ(job.request.sourceFilePath, "test_source_file_2");
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700392 EXPECT_TRUE(result);
393
394 // Test get jobs by invalid id fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700395 EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700396 EXPECT_FALSE(result);
397
398 // Test cancel non-existent job fail.
Chong Zhang15c192a2020-05-05 16:24:00 -0700399 EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700400 EXPECT_FALSE(result);
401
402 // Test cancel valid jobId in arbitrary order.
Chong Zhang15c192a2020-05-05 16:24:00 -0700403 EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700404 EXPECT_TRUE(result);
405
Chong Zhang15c192a2020-05-05 16:24:00 -0700406 EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700407 EXPECT_TRUE(result);
408
Chong Zhang15c192a2020-05-05 16:24:00 -0700409 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700410 EXPECT_TRUE(result);
411
412 // Test cancel job again fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700413 EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700414 EXPECT_FALSE(result);
415
416 // Test get job after cancel fails.
Chong Zhang15c192a2020-05-05 16:24:00 -0700417 EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700418 EXPECT_FALSE(result);
419
420 // Test jobId independence for each client.
421 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
422 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700423 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700424
425 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
426 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700427 EXPECT_EQ(job.jobId, JOB(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700428
429 unregisterMultipleClients();
430}
431
432TEST_F(TranscodingClientManagerTest, TestClientCallback) {
433 addMultipleClients();
434
435 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700436 request.sourceFilePath = "test_source_file_name";
437 request.destinationFilePath = "test_destination_file_name";
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700438 TranscodingJobParcel job;
439 bool result;
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(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700443
444 mScheduler->finishLastJob();
445 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(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(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700450
451 mScheduler->abortLastJob();
452 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
453
454 EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
455 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700456 EXPECT_EQ(job.jobId, JOB(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700457
458 EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
459 EXPECT_TRUE(result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700460 EXPECT_EQ(job.jobId, JOB(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700461
462 mScheduler->finishLastJob();
463 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
464
465 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800466}
467
Chong Zhang15c192a2020-05-05 16:24:00 -0700468TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
469 // Add a client.
470 std::shared_ptr<ITranscodingClient> client;
471 status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
472 kClientPackage, &client);
473 EXPECT_EQ(err, OK);
474 EXPECT_NE(client.get(), nullptr);
475
476 // Submit 2 requests, 1 offline and 1 realtime.
477 TranscodingRequestParcel request;
478 TranscodingJobParcel job;
479 bool result;
480
hkuang72d105f2020-05-21 10:48:55 -0700481 request.sourceFilePath = "test_source_file_0";
482 request.destinationFilePath = "test_destination_file_0";
Chong Zhang15c192a2020-05-05 16:24:00 -0700483 request.priority = TranscodingJobPriority::kUnspecified;
484 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
485 EXPECT_EQ(job.jobId, JOB(0));
486
hkuang72d105f2020-05-21 10:48:55 -0700487 request.sourceFilePath = "test_source_file_1";
488 request.destinationFilePath = "test_destination_file_1";
Chong Zhang15c192a2020-05-05 16:24:00 -0700489 request.priority = TranscodingJobPriority::kNormal;
490 EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
491 EXPECT_EQ(job.jobId, JOB(1));
492
493 // Unregister client, should succeed.
494 Status status = client->unregister();
495 EXPECT_TRUE(status.isOk());
496
497 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
hkuang72d105f2020-05-21 10:48:55 -0700498 request.sourceFilePath = "test_source_file_2";
499 request.destinationFilePath = "test_destination_file_2";
Chong Zhang15c192a2020-05-05 16:24:00 -0700500 request.priority = TranscodingJobPriority::kNormal;
501 status = client->submitRequest(request, &job, &result);
502 EXPECT_FALSE(status.isOk());
503 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
504
505 // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
506 // regardless of realtime or offline job, or whether the jobId is valid.
507 status = client->cancelJob(JOB(0), &result);
508 EXPECT_FALSE(status.isOk());
509 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
510
511 status = client->cancelJob(JOB(1), &result);
512 EXPECT_FALSE(status.isOk());
513 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
514
515 status = client->cancelJob(JOB(2), &result);
516 EXPECT_FALSE(status.isOk());
517 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
518
519 // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
520 // or offline job, or whether the jobId is valid.
521 status = client->getJobWithId(JOB(0), &job, &result);
522 EXPECT_FALSE(status.isOk());
523 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
524
525 status = client->getJobWithId(JOB(1), &job, &result);
526 EXPECT_FALSE(status.isOk());
527 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
528
529 status = client->getJobWithId(JOB(2), &job, &result);
530 EXPECT_FALSE(status.isOk());
531 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
532}
533
Chong Zhang8e062632020-03-31 10:56:37 -0700534} // namespace android