blob: 1a50923c3f0c9da6e5ef008c3fcdf7d0a9979035 [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 Zhangbc062482020-10-14 16:43:53 -070028#include <media/ControllerClientInterface.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;
Chong Zhang6d58e4b2020-03-31 09:41:10 -070041using ::aidl::android::media::TranscodingRequestParcel;
42using ::aidl::android::media::TranscodingResultParcel;
Chong Zhangbc062482020-10-14 16:43:53 -070043using ::aidl::android::media::TranscodingSessionParcel;
44using ::aidl::android::media::TranscodingSessionPriority;
hkuang26587cb2020-01-16 10:36:08 -080045
Chong Zhang3f23e982020-09-24 14:03:41 -070046constexpr pid_t kInvalidClientPid = -5;
47constexpr pid_t kInvalidClientUid = -10;
Chong Zhang8e062632020-03-31 10:56:37 -070048constexpr const char* kInvalidClientName = "";
49constexpr const char* kInvalidClientPackage = "";
hkuang26587cb2020-01-16 10:36:08 -080050
Chong Zhang8e062632020-03-31 10:56:37 -070051constexpr const char* kClientName = "TestClientName";
52constexpr const char* kClientPackage = "TestClientPackage";
hkuang26587cb2020-01-16 10:36:08 -080053
Chong Zhangbc062482020-10-14 16:43:53 -070054#define SESSION(n) (n)
Chong Zhang15c192a2020-05-05 16:24:00 -070055
Chong Zhang6d58e4b2020-03-31 09:41:10 -070056struct TestClientCallback : public BnTranscodingClientCallback {
57 TestClientCallback() { ALOGI("TestClientCallback Created"); }
hkuang26587cb2020-01-16 10:36:08 -080058
Chong Zhang6d58e4b2020-03-31 09:41:10 -070059 virtual ~TestClientCallback() { ALOGI("TestClientCallback destroyed"); };
60
hkuang19253092020-06-01 09:10:49 -070061 Status openFileDescriptor(const std::string& /*in_fileUri*/, const std::string& /*in_mode*/,
62 ::ndk::ScopedFileDescriptor* /*_aidl_return*/) override {
63 return Status::ok();
64 }
65
Chong Zhangbc062482020-10-14 16:43:53 -070066 Status onTranscodingStarted(int32_t /*in_sessionId*/) override { return Status::ok(); }
hkuang96471b82020-06-08 11:12:46 -070067
Chong Zhangbc062482020-10-14 16:43:53 -070068 Status onTranscodingPaused(int32_t /*in_sessionId*/) override { return Status::ok(); }
hkuang96471b82020-06-08 11:12:46 -070069
Chong Zhangbc062482020-10-14 16:43:53 -070070 Status onTranscodingResumed(int32_t /*in_sessionId*/) override { return Status::ok(); }
hkuang96471b82020-06-08 11:12:46 -070071
Chong Zhangbc062482020-10-14 16:43:53 -070072 Status onTranscodingFinished(int32_t in_sessionId,
Chong Zhang6d58e4b2020-03-31 09:41:10 -070073 const TranscodingResultParcel& in_result) override {
Chong Zhangbc062482020-10-14 16:43:53 -070074 EXPECT_EQ(in_sessionId, in_result.sessionId);
75 mEventQueue.push_back(Finished(in_sessionId));
hkuang26587cb2020-01-16 10:36:08 -080076 return Status::ok();
77 }
78
Chong Zhangbc062482020-10-14 16:43:53 -070079 Status onTranscodingFailed(int32_t in_sessionId,
80 TranscodingErrorCode /*in_errorCode */) override {
81 mEventQueue.push_back(Failed(in_sessionId));
hkuang26587cb2020-01-16 10:36:08 -080082 return Status::ok();
83 }
84
Chong Zhangbc062482020-10-14 16:43:53 -070085 Status onAwaitNumberOfSessionsChanged(int32_t /* in_sessionId */,
86 int32_t /* in_oldAwaitNumber */,
87 int32_t /* in_newAwaitNumber */) override {
hkuang26587cb2020-01-16 10:36:08 -080088 return Status::ok();
89 }
90
Chong Zhangbc062482020-10-14 16:43:53 -070091 Status onProgressUpdate(int32_t /* in_sessionId */, int32_t /* in_progress */) override {
hkuang26587cb2020-01-16 10:36:08 -080092 return Status::ok();
93 }
94
Chong Zhang6d58e4b2020-03-31 09:41:10 -070095 struct Event {
96 enum {
97 NoEvent,
98 Finished,
99 Failed,
100 } type;
Chong Zhangbc062482020-10-14 16:43:53 -0700101 SessionIdType sessionId;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700102 };
103
104 static constexpr Event NoEvent = {Event::NoEvent, 0};
105#define DECLARE_EVENT(action) \
Chong Zhangbc062482020-10-14 16:43:53 -0700106 static Event action(SessionIdType sessionId) { return {Event::action, sessionId}; }
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700107
108 DECLARE_EVENT(Finished);
109 DECLARE_EVENT(Failed);
110
111 const Event& popEvent() {
112 if (mEventQueue.empty()) {
113 mPoppedEvent = NoEvent;
114 } else {
115 mPoppedEvent = *mEventQueue.begin();
116 mEventQueue.pop_front();
117 }
118 return mPoppedEvent;
119 }
hkuang26587cb2020-01-16 10:36:08 -0800120
Chong Zhang8e062632020-03-31 10:56:37 -0700121private:
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700122 Event mPoppedEvent;
123 std::list<Event> mEventQueue;
124
125 TestClientCallback(const TestClientCallback&) = delete;
126 TestClientCallback& operator=(const TestClientCallback&) = delete;
127};
128
129bool operator==(const TestClientCallback::Event& lhs, const TestClientCallback::Event& rhs) {
Chong Zhangbc062482020-10-14 16:43:53 -0700130 return lhs.type == rhs.type && lhs.sessionId == rhs.sessionId;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700131}
132
Chong Zhangbc062482020-10-14 16:43:53 -0700133struct TestController : public ControllerClientInterface {
134 TestController() { ALOGI("TestController Created"); }
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700135
Chong Zhangbc062482020-10-14 16:43:53 -0700136 virtual ~TestController() { ALOGI("TestController Destroyed"); }
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700137
Chong Zhangbc062482020-10-14 16:43:53 -0700138 bool submit(ClientIdType clientId, SessionIdType sessionId, uid_t /*uid*/,
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700139 const TranscodingRequestParcel& request,
140 const std::weak_ptr<ITranscodingClientCallback>& clientCallback) override {
Chong Zhangbc062482020-10-14 16:43:53 -0700141 SessionKeyType sessionKey = std::make_pair(clientId, sessionId);
142 if (mSessions.count(sessionKey) > 0) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700143 return false;
144 }
145
146 // This is the secret name we'll check, to test error propagation from
Chong Zhangbc062482020-10-14 16:43:53 -0700147 // the controller back to client.
hkuang72d105f2020-05-21 10:48:55 -0700148 if (request.sourceFilePath == "bad_source_file") {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700149 return false;
150 }
151
Chong Zhangbc062482020-10-14 16:43:53 -0700152 mSessions[sessionKey].request = request;
153 mSessions[sessionKey].callback = clientCallback;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700154
Chong Zhangbc062482020-10-14 16:43:53 -0700155 mLastSession = sessionKey;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700156 return true;
157 }
158
Chong Zhangbc062482020-10-14 16:43:53 -0700159 bool cancel(ClientIdType clientId, SessionIdType sessionId) override {
160 SessionKeyType sessionKey = std::make_pair(clientId, sessionId);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700161
Chong Zhangbc062482020-10-14 16:43:53 -0700162 if (mSessions.count(sessionKey) == 0) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700163 return false;
164 }
Chong Zhangbc062482020-10-14 16:43:53 -0700165 mSessions.erase(sessionKey);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700166 return true;
167 }
168
Chong Zhangbc062482020-10-14 16:43:53 -0700169 bool getSession(ClientIdType clientId, SessionIdType sessionId,
170 TranscodingRequestParcel* request) override {
171 SessionKeyType sessionKey = std::make_pair(clientId, sessionId);
172 if (mSessions.count(sessionKey) == 0) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700173 return false;
174 }
175
Chong Zhangbc062482020-10-14 16:43:53 -0700176 *(TranscodingRequest*)request = mSessions[sessionKey].request;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700177 return true;
178 }
179
Chong Zhangbc062482020-10-14 16:43:53 -0700180 void finishLastSession() {
181 auto it = mSessions.find(mLastSession);
182 if (it == mSessions.end()) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700183 return;
184 }
185 {
186 auto clientCallback = it->second.callback.lock();
187 if (clientCallback != nullptr) {
188 clientCallback->onTranscodingFinished(
Chong Zhangbc062482020-10-14 16:43:53 -0700189 mLastSession.second,
190 TranscodingResultParcel({mLastSession.second, 0, std::nullopt}));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700191 }
192 }
Chong Zhangbc062482020-10-14 16:43:53 -0700193 mSessions.erase(it);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700194 }
195
Chong Zhangbc062482020-10-14 16:43:53 -0700196 void abortLastSession() {
197 auto it = mSessions.find(mLastSession);
198 if (it == mSessions.end()) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700199 return;
200 }
201 {
202 auto clientCallback = it->second.callback.lock();
203 if (clientCallback != nullptr) {
Chong Zhangbc062482020-10-14 16:43:53 -0700204 clientCallback->onTranscodingFailed(mLastSession.second,
Chong Zhang7ae4e2f2020-04-17 15:24:34 -0700205 TranscodingErrorCode::kUnknown);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700206 }
207 }
Chong Zhangbc062482020-10-14 16:43:53 -0700208 mSessions.erase(it);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700209 }
210
Chong Zhangbc062482020-10-14 16:43:53 -0700211 struct Session {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700212 TranscodingRequest request;
213 std::weak_ptr<ITranscodingClientCallback> callback;
214 };
215
Chong Zhangbc062482020-10-14 16:43:53 -0700216 typedef std::pair<ClientIdType, SessionIdType> SessionKeyType;
217 std::map<SessionKeyType, Session> mSessions;
218 SessionKeyType mLastSession;
hkuang26587cb2020-01-16 10:36:08 -0800219};
220
221class TranscodingClientManagerTest : public ::testing::Test {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700222public:
223 TranscodingClientManagerTest()
Chong Zhangbc062482020-10-14 16:43:53 -0700224 : mController(new TestController()),
225 mClientManager(new TranscodingClientManager(mController)) {
hkuang5172cab2020-01-31 12:40:28 -0800226 ALOGD("TranscodingClientManagerTest created");
227 }
hkuang26587cb2020-01-16 10:36:08 -0800228
229 void SetUp() override {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700230 mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>();
231 mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>();
232 mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>();
hkuang26587cb2020-01-16 10:36:08 -0800233 }
234
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700235 void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); }
hkuang26587cb2020-01-16 10:36:08 -0800236
237 ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
238
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700239 void addMultipleClients() {
Chong Zhang0579c6f2020-10-05 12:03:34 -0700240 EXPECT_EQ(
241 mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &mClient1),
242 OK);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700243 EXPECT_NE(mClient1, nullptr);
244
Chong Zhang0579c6f2020-10-05 12:03:34 -0700245 EXPECT_EQ(
246 mClientManager->addClient(mClientCallback2, kClientName, kClientPackage, &mClient2),
247 OK);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700248 EXPECT_NE(mClient2, nullptr);
249
Chong Zhang0579c6f2020-10-05 12:03:34 -0700250 EXPECT_EQ(
251 mClientManager->addClient(mClientCallback3, kClientName, kClientPackage, &mClient3),
252 OK);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700253 EXPECT_NE(mClient3, nullptr);
254
255 EXPECT_EQ(mClientManager->getNumOfClients(), 3);
256 }
257
258 void unregisterMultipleClients() {
259 EXPECT_TRUE(mClient1->unregister().isOk());
260 EXPECT_TRUE(mClient2->unregister().isOk());
261 EXPECT_TRUE(mClient3->unregister().isOk());
262 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
263 }
264
Chong Zhangbc062482020-10-14 16:43:53 -0700265 std::shared_ptr<TestController> mController;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700266 std::shared_ptr<TranscodingClientManager> mClientManager;
267 std::shared_ptr<ITranscodingClient> mClient1;
268 std::shared_ptr<ITranscodingClient> mClient2;
269 std::shared_ptr<ITranscodingClient> mClient3;
270 std::shared_ptr<TestClientCallback> mClientCallback1;
271 std::shared_ptr<TestClientCallback> mClientCallback2;
272 std::shared_ptr<TestClientCallback> mClientCallback3;
hkuang26587cb2020-01-16 10:36:08 -0800273};
274
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700275TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
276 // Add a client with null callback and expect failure.
Chong Zhang8e062632020-03-31 10:56:37 -0700277 std::shared_ptr<ITranscodingClient> client;
Chong Zhang0579c6f2020-10-05 12:03:34 -0700278 status_t err = mClientManager->addClient(nullptr, kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700279 EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
hkuang26587cb2020-01-16 10:36:08 -0800280}
Chong Zhang3f23e982020-09-24 14:03:41 -0700281//
282//TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
283// // Add a client with invalid Pid and expect failure.
284// std::shared_ptr<ITranscodingClient> client;
285// status_t err = mClientManager->addClient(mClientCallback1,
286// kClientName, kClientPackage, &client);
287// EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
288//}
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 Zhang0579c6f2020-10-05 12:03:34 -0700293 status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientName, kClientPackage,
294 &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 Zhang0579c6f2020-10-05 12:03:34 -0700301 status_t err = mClientManager->addClient(mClientCallback1, kClientName, kInvalidClientPackage,
302 &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 Zhang0579c6f2020-10-05 12:03:34 -0700309 status_t err =
310 mClientManager->addClient(mClientCallback1, kClientName, 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 Zhang0579c6f2020-10-05 12:03:34 -0700323 status_t err =
324 mClientManager->addClient(mClientCallback1, kClientName, 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 Zhang0579c6f2020-10-05 12:03:34 -0700330 err = mClientManager->addClient(mClientCallback1, "dupClient", "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 Zhang3f23e982020-09-24 14:03:41 -0700339 err = mClientManager->addClient(mClientCallback1, "dupClient", "dupPackage", &dupClient);
Chong Zhang8e062632020-03-31 10:56:37 -0700340 EXPECT_EQ(err, OK);
341 EXPECT_NE(dupClient.get(), nullptr);
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700342 EXPECT_EQ(mClientManager->getNumOfClients(), 1);
hkuang26587cb2020-01-16 10:36:08 -0800343
Chong Zhang8e062632020-03-31 10:56:37 -0700344 status = dupClient->unregister();
345 EXPECT_TRUE(status.isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700346 EXPECT_EQ(mClientManager->getNumOfClients(), 0);
hkuang26587cb2020-01-16 10:36:08 -0800347}
348
349TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700350 addMultipleClients();
351 unregisterMultipleClients();
352}
hkuang26587cb2020-01-16 10:36:08 -0800353
Chong Zhangbc062482020-10-14 16:43:53 -0700354TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetSessions) {
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700355 addMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800356
Chong Zhangbc062482020-10-14 16:43:53 -0700357 // Test sessionId assignment.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700358 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700359 request.sourceFilePath = "test_source_file_0";
360 request.destinationFilePath = "test_desintaion_file_0";
Chong Zhangbc062482020-10-14 16:43:53 -0700361 TranscodingSessionParcel session;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700362 bool result;
Chong Zhangbc062482020-10-14 16:43:53 -0700363 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700364 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700365 EXPECT_EQ(session.sessionId, SESSION(0));
hkuang26587cb2020-01-16 10:36:08 -0800366
hkuang72d105f2020-05-21 10:48:55 -0700367 request.sourceFilePath = "test_source_file_1";
368 request.destinationFilePath = "test_desintaion_file_1";
Chong Zhangbc062482020-10-14 16:43:53 -0700369 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700370 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700371 EXPECT_EQ(session.sessionId, SESSION(1));
hkuang26587cb2020-01-16 10:36:08 -0800372
hkuang72d105f2020-05-21 10:48:55 -0700373 request.sourceFilePath = "test_source_file_2";
374 request.destinationFilePath = "test_desintaion_file_2";
Chong Zhangbc062482020-10-14 16:43:53 -0700375 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700376 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700377 EXPECT_EQ(session.sessionId, SESSION(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700378
hkuang72d105f2020-05-21 10:48:55 -0700379 // Test submit bad request (no valid sourceFilePath) fails.
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700380 TranscodingRequestParcel badRequest;
hkuang72d105f2020-05-21 10:48:55 -0700381 badRequest.sourceFilePath = "bad_source_file";
382 badRequest.destinationFilePath = "bad_destination_file";
Chong Zhangbc062482020-10-14 16:43:53 -0700383 EXPECT_TRUE(mClient1->submitRequest(badRequest, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700384 EXPECT_FALSE(result);
385
Chong Zhang3f23e982020-09-24 14:03:41 -0700386 // Test submit with bad pid/uid.
387 badRequest.sourceFilePath = "test_source_file_3";
388 badRequest.destinationFilePath = "test_desintaion_file_3";
389 badRequest.clientPid = kInvalidClientPid;
390 badRequest.clientUid = kInvalidClientUid;
Chong Zhangbc062482020-10-14 16:43:53 -0700391 EXPECT_TRUE(mClient1->submitRequest(badRequest, &session, &result).isOk());
Chong Zhang3f23e982020-09-24 14:03:41 -0700392 EXPECT_FALSE(result);
393
Chong Zhangbc062482020-10-14 16:43:53 -0700394 // Test get sessions by id.
395 EXPECT_TRUE(mClient1->getSessionWithId(SESSION(2), &session, &result).isOk());
396 EXPECT_EQ(session.sessionId, SESSION(2));
397 EXPECT_EQ(session.request.sourceFilePath, "test_source_file_2");
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700398 EXPECT_TRUE(result);
399
Chong Zhangbc062482020-10-14 16:43:53 -0700400 // Test get sessions by invalid id fails.
401 EXPECT_TRUE(mClient1->getSessionWithId(SESSION(100), &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700402 EXPECT_FALSE(result);
403
Chong Zhangbc062482020-10-14 16:43:53 -0700404 // Test cancel non-existent session fail.
405 EXPECT_TRUE(mClient2->cancelSession(SESSION(100), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700406 EXPECT_FALSE(result);
407
Chong Zhangbc062482020-10-14 16:43:53 -0700408 // Test cancel valid sessionId in arbitrary order.
409 EXPECT_TRUE(mClient1->cancelSession(SESSION(2), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700410 EXPECT_TRUE(result);
411
Chong Zhangbc062482020-10-14 16:43:53 -0700412 EXPECT_TRUE(mClient1->cancelSession(SESSION(0), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700413 EXPECT_TRUE(result);
414
Chong Zhangbc062482020-10-14 16:43:53 -0700415 EXPECT_TRUE(mClient1->cancelSession(SESSION(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700416 EXPECT_TRUE(result);
417
Chong Zhangbc062482020-10-14 16:43:53 -0700418 // Test cancel session again fails.
419 EXPECT_TRUE(mClient1->cancelSession(SESSION(1), &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700420 EXPECT_FALSE(result);
421
Chong Zhangbc062482020-10-14 16:43:53 -0700422 // Test get session after cancel fails.
423 EXPECT_TRUE(mClient1->getSessionWithId(SESSION(2), &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700424 EXPECT_FALSE(result);
425
Chong Zhangbc062482020-10-14 16:43:53 -0700426 // Test sessionId independence for each client.
427 EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700428 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700429 EXPECT_EQ(session.sessionId, SESSION(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700430
Chong Zhangbc062482020-10-14 16:43:53 -0700431 EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700432 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700433 EXPECT_EQ(session.sessionId, SESSION(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700434
435 unregisterMultipleClients();
436}
437
438TEST_F(TranscodingClientManagerTest, TestClientCallback) {
439 addMultipleClients();
440
441 TranscodingRequestParcel request;
hkuang72d105f2020-05-21 10:48:55 -0700442 request.sourceFilePath = "test_source_file_name";
443 request.destinationFilePath = "test_destination_file_name";
Chong Zhangbc062482020-10-14 16:43:53 -0700444 TranscodingSessionParcel session;
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700445 bool result;
Chong Zhangbc062482020-10-14 16:43:53 -0700446 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700447 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700448 EXPECT_EQ(session.sessionId, SESSION(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700449
Chong Zhangbc062482020-10-14 16:43:53 -0700450 mController->finishLastSession();
451 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(session.sessionId));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700452
Chong Zhangbc062482020-10-14 16:43:53 -0700453 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700454 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700455 EXPECT_EQ(session.sessionId, SESSION(1));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700456
Chong Zhangbc062482020-10-14 16:43:53 -0700457 mController->abortLastSession();
458 EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(session.sessionId));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700459
Chong Zhangbc062482020-10-14 16:43:53 -0700460 EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700461 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700462 EXPECT_EQ(session.sessionId, SESSION(2));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700463
Chong Zhangbc062482020-10-14 16:43:53 -0700464 EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk());
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700465 EXPECT_TRUE(result);
Chong Zhangbc062482020-10-14 16:43:53 -0700466 EXPECT_EQ(session.sessionId, SESSION(0));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700467
Chong Zhangbc062482020-10-14 16:43:53 -0700468 mController->finishLastSession();
469 EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(session.sessionId));
Chong Zhang6d58e4b2020-03-31 09:41:10 -0700470
471 unregisterMultipleClients();
hkuang26587cb2020-01-16 10:36:08 -0800472}
473
Chong Zhang15c192a2020-05-05 16:24:00 -0700474TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
475 // Add a client.
476 std::shared_ptr<ITranscodingClient> client;
Chong Zhang0579c6f2020-10-05 12:03:34 -0700477 status_t err =
478 mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
Chong Zhang15c192a2020-05-05 16:24:00 -0700479 EXPECT_EQ(err, OK);
480 EXPECT_NE(client.get(), nullptr);
481
482 // Submit 2 requests, 1 offline and 1 realtime.
483 TranscodingRequestParcel request;
Chong Zhangbc062482020-10-14 16:43:53 -0700484 TranscodingSessionParcel session;
Chong Zhang15c192a2020-05-05 16:24:00 -0700485 bool result;
486
hkuang72d105f2020-05-21 10:48:55 -0700487 request.sourceFilePath = "test_source_file_0";
488 request.destinationFilePath = "test_destination_file_0";
Chong Zhangbc062482020-10-14 16:43:53 -0700489 request.priority = TranscodingSessionPriority::kUnspecified;
490 EXPECT_TRUE(client->submitRequest(request, &session, &result).isOk() && result);
491 EXPECT_EQ(session.sessionId, SESSION(0));
Chong Zhang15c192a2020-05-05 16:24:00 -0700492
hkuang72d105f2020-05-21 10:48:55 -0700493 request.sourceFilePath = "test_source_file_1";
494 request.destinationFilePath = "test_destination_file_1";
Chong Zhangbc062482020-10-14 16:43:53 -0700495 request.priority = TranscodingSessionPriority::kNormal;
496 EXPECT_TRUE(client->submitRequest(request, &session, &result).isOk() && result);
497 EXPECT_EQ(session.sessionId, SESSION(1));
Chong Zhang15c192a2020-05-05 16:24:00 -0700498
499 // Unregister client, should succeed.
500 Status status = client->unregister();
501 EXPECT_TRUE(status.isOk());
502
503 // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
hkuang72d105f2020-05-21 10:48:55 -0700504 request.sourceFilePath = "test_source_file_2";
505 request.destinationFilePath = "test_destination_file_2";
Chong Zhangbc062482020-10-14 16:43:53 -0700506 request.priority = TranscodingSessionPriority::kNormal;
507 status = client->submitRequest(request, &session, &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700508 EXPECT_FALSE(status.isOk());
509 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
510
Chong Zhangbc062482020-10-14 16:43:53 -0700511 // Test cancel sessions after unregister, should fail with ERROR_DISCONNECTED
512 // regardless of realtime or offline session, or whether the sessionId is valid.
513 status = client->cancelSession(SESSION(0), &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700514 EXPECT_FALSE(status.isOk());
515 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
516
Chong Zhangbc062482020-10-14 16:43:53 -0700517 status = client->cancelSession(SESSION(1), &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700518 EXPECT_FALSE(status.isOk());
519 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
520
Chong Zhangbc062482020-10-14 16:43:53 -0700521 status = client->cancelSession(SESSION(2), &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700522 EXPECT_FALSE(status.isOk());
523 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
524
Chong Zhangbc062482020-10-14 16:43:53 -0700525 // Test get sessions, should fail with ERROR_DISCONNECTED regardless of realtime
526 // or offline session, or whether the sessionId is valid.
527 status = client->getSessionWithId(SESSION(0), &session, &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700528 EXPECT_FALSE(status.isOk());
529 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
530
Chong Zhangbc062482020-10-14 16:43:53 -0700531 status = client->getSessionWithId(SESSION(1), &session, &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700532 EXPECT_FALSE(status.isOk());
533 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
534
Chong Zhangbc062482020-10-14 16:43:53 -0700535 status = client->getSessionWithId(SESSION(2), &session, &result);
Chong Zhang15c192a2020-05-05 16:24:00 -0700536 EXPECT_FALSE(status.isOk());
537 EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
538}
539
Chong Zhang8e062632020-03-31 10:56:37 -0700540} // namespace android