| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 1 | /* | 
|  | 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 Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 22 | #include <aidl/android/media/BnTranscodingClientCallback.h> | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 23 | #include <aidl/android/media/IMediaTranscodingService.h> | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 24 | #include <android-base/logging.h> | 
|  | 25 | #include <android/binder_manager.h> | 
|  | 26 | #include <android/binder_process.h> | 
|  | 27 | #include <gtest/gtest.h> | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 28 | #include <media/ControllerClientInterface.h> | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 29 | #include <media/TranscodingClientManager.h> | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 30 | #include <media/TranscodingRequest.h> | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 31 | #include <utils/Log.h> | 
|  | 32 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 33 | #include <list> | 
|  | 34 |  | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 35 | namespace android { | 
|  | 36 |  | 
|  | 37 | using Status = ::ndk::ScopedAStatus; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 38 | using ::aidl::android::media::BnTranscodingClientCallback; | 
|  | 39 | using ::aidl::android::media::IMediaTranscodingService; | 
|  | 40 | using ::aidl::android::media::TranscodingErrorCode; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 41 | using ::aidl::android::media::TranscodingRequestParcel; | 
|  | 42 | using ::aidl::android::media::TranscodingResultParcel; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 43 | using ::aidl::android::media::TranscodingSessionParcel; | 
|  | 44 | using ::aidl::android::media::TranscodingSessionPriority; | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 45 |  | 
| Chong Zhang | 3f23e98 | 2020-09-24 14:03:41 -0700 | [diff] [blame] | 46 | constexpr pid_t kInvalidClientPid = -5; | 
|  | 47 | constexpr pid_t kInvalidClientUid = -10; | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 48 | constexpr const char* kInvalidClientName = ""; | 
|  | 49 | constexpr const char* kInvalidClientPackage = ""; | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 50 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 51 | constexpr const char* kClientName = "TestClientName"; | 
|  | 52 | constexpr const char* kClientPackage = "TestClientPackage"; | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 53 | constexpr uid_t OFFLINE_UID = -1; | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 54 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 55 | #define SESSION(n) (n) | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 56 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 57 | struct TestClientCallback : public BnTranscodingClientCallback { | 
|  | 58 | TestClientCallback() { ALOGI("TestClientCallback Created"); } | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 59 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 60 | virtual ~TestClientCallback() { ALOGI("TestClientCallback destroyed"); }; | 
|  | 61 |  | 
| hkuang | 1925309 | 2020-06-01 09:10:49 -0700 | [diff] [blame] | 62 | 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 Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 67 | Status onTranscodingStarted(int32_t /*in_sessionId*/) override { return Status::ok(); } | 
| hkuang | 96471b8 | 2020-06-08 11:12:46 -0700 | [diff] [blame] | 68 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 69 | Status onTranscodingPaused(int32_t /*in_sessionId*/) override { return Status::ok(); } | 
| hkuang | 96471b8 | 2020-06-08 11:12:46 -0700 | [diff] [blame] | 70 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 71 | Status onTranscodingResumed(int32_t /*in_sessionId*/) override { return Status::ok(); } | 
| hkuang | 96471b8 | 2020-06-08 11:12:46 -0700 | [diff] [blame] | 72 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 73 | Status onTranscodingFinished(int32_t in_sessionId, | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 74 | const TranscodingResultParcel& in_result) override { | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 75 | EXPECT_EQ(in_sessionId, in_result.sessionId); | 
|  | 76 | mEventQueue.push_back(Finished(in_sessionId)); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 77 | return Status::ok(); | 
|  | 78 | } | 
|  | 79 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 80 | Status onTranscodingFailed(int32_t in_sessionId, | 
|  | 81 | TranscodingErrorCode /*in_errorCode */) override { | 
|  | 82 | mEventQueue.push_back(Failed(in_sessionId)); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 83 | return Status::ok(); | 
|  | 84 | } | 
|  | 85 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 86 | Status onAwaitNumberOfSessionsChanged(int32_t /* in_sessionId */, | 
|  | 87 | int32_t /* in_oldAwaitNumber */, | 
|  | 88 | int32_t /* in_newAwaitNumber */) override { | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 89 | return Status::ok(); | 
|  | 90 | } | 
|  | 91 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 92 | Status onProgressUpdate(int32_t /* in_sessionId */, int32_t /* in_progress */) override { | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 93 | return Status::ok(); | 
|  | 94 | } | 
|  | 95 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 96 | struct Event { | 
|  | 97 | enum { | 
|  | 98 | NoEvent, | 
|  | 99 | Finished, | 
|  | 100 | Failed, | 
|  | 101 | } type; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 102 | SessionIdType sessionId; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 103 | }; | 
|  | 104 |  | 
|  | 105 | static constexpr Event NoEvent = {Event::NoEvent, 0}; | 
|  | 106 | #define DECLARE_EVENT(action) \ | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 107 | static Event action(SessionIdType sessionId) { return {Event::action, sessionId}; } | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 108 |  | 
|  | 109 | DECLARE_EVENT(Finished); | 
|  | 110 | DECLARE_EVENT(Failed); | 
|  | 111 |  | 
|  | 112 | const Event& popEvent() { | 
|  | 113 | if (mEventQueue.empty()) { | 
|  | 114 | mPoppedEvent = NoEvent; | 
|  | 115 | } else { | 
|  | 116 | mPoppedEvent = *mEventQueue.begin(); | 
|  | 117 | mEventQueue.pop_front(); | 
|  | 118 | } | 
|  | 119 | return mPoppedEvent; | 
|  | 120 | } | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 121 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 122 | private: | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 123 | Event mPoppedEvent; | 
|  | 124 | std::list<Event> mEventQueue; | 
|  | 125 |  | 
|  | 126 | TestClientCallback(const TestClientCallback&) = delete; | 
|  | 127 | TestClientCallback& operator=(const TestClientCallback&) = delete; | 
|  | 128 | }; | 
|  | 129 |  | 
|  | 130 | bool operator==(const TestClientCallback::Event& lhs, const TestClientCallback::Event& rhs) { | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 131 | return lhs.type == rhs.type && lhs.sessionId == rhs.sessionId; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 132 | } | 
|  | 133 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 134 | struct TestController : public ControllerClientInterface { | 
|  | 135 | TestController() { ALOGI("TestController Created"); } | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 136 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 137 | virtual ~TestController() { ALOGI("TestController Destroyed"); } | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 138 |  | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 139 | bool submit(ClientIdType clientId, SessionIdType sessionId, uid_t /*callingUid*/, | 
|  | 140 | uid_t clientUid, const TranscodingRequestParcel& request, | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 141 | const std::weak_ptr<ITranscodingClientCallback>& clientCallback) override { | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 142 | SessionKeyType sessionKey = std::make_pair(clientId, sessionId); | 
|  | 143 | if (mSessions.count(sessionKey) > 0) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 144 | return false; | 
|  | 145 | } | 
|  | 146 |  | 
|  | 147 | // This is the secret name we'll check, to test error propagation from | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 148 | // the controller back to client. | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 149 | if (request.sourceFilePath == "bad_source_file") { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 150 | return false; | 
|  | 151 | } | 
|  | 152 |  | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 153 | if (request.priority == TranscodingSessionPriority::kUnspecified) { | 
|  | 154 | clientUid = OFFLINE_UID; | 
|  | 155 | } | 
|  | 156 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 157 | mSessions[sessionKey].request = request; | 
|  | 158 | mSessions[sessionKey].callback = clientCallback; | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 159 | mSessions[sessionKey].allClientUids.insert(clientUid); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 160 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 161 | mLastSession = sessionKey; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 162 | return true; | 
|  | 163 | } | 
|  | 164 |  | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 165 | bool addClientUid(ClientIdType clientId, SessionIdType sessionId, uid_t clientUid) override { | 
|  | 166 | SessionKeyType sessionKey = std::make_pair(clientId, sessionId); | 
|  | 167 |  | 
|  | 168 | if (mSessions.count(sessionKey) == 0) { | 
|  | 169 | return false; | 
|  | 170 | } | 
|  | 171 | if (mSessions[sessionKey].allClientUids.count(clientUid) > 0) { | 
|  | 172 | return false; | 
|  | 173 | } | 
|  | 174 | mSessions[sessionKey].allClientUids.insert(clientUid); | 
|  | 175 | return true; | 
|  | 176 | } | 
|  | 177 |  | 
|  | 178 | bool getClientUids(ClientIdType clientId, SessionIdType sessionId, | 
|  | 179 | std::vector<int32_t>* out_clientUids) override { | 
|  | 180 | SessionKeyType sessionKey = std::make_pair(clientId, sessionId); | 
|  | 181 |  | 
|  | 182 | if (mSessions.count(sessionKey) == 0) { | 
|  | 183 | return false; | 
|  | 184 | } | 
|  | 185 | out_clientUids->clear(); | 
|  | 186 | for (uid_t uid : mSessions[sessionKey].allClientUids) { | 
|  | 187 | if (uid != OFFLINE_UID) { | 
|  | 188 | out_clientUids->push_back(uid); | 
|  | 189 | } | 
|  | 190 | } | 
|  | 191 | return true; | 
|  | 192 | } | 
|  | 193 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 194 | bool cancel(ClientIdType clientId, SessionIdType sessionId) override { | 
|  | 195 | SessionKeyType sessionKey = std::make_pair(clientId, sessionId); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 196 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 197 | if (mSessions.count(sessionKey) == 0) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 198 | return false; | 
|  | 199 | } | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 200 | mSessions.erase(sessionKey); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 201 | return true; | 
|  | 202 | } | 
|  | 203 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 204 | bool getSession(ClientIdType clientId, SessionIdType sessionId, | 
|  | 205 | TranscodingRequestParcel* request) override { | 
|  | 206 | SessionKeyType sessionKey = std::make_pair(clientId, sessionId); | 
|  | 207 | if (mSessions.count(sessionKey) == 0) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 208 | return false; | 
|  | 209 | } | 
|  | 210 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 211 | *(TranscodingRequest*)request = mSessions[sessionKey].request; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 212 | return true; | 
|  | 213 | } | 
|  | 214 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 215 | void finishLastSession() { | 
|  | 216 | auto it = mSessions.find(mLastSession); | 
|  | 217 | if (it == mSessions.end()) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 218 | return; | 
|  | 219 | } | 
|  | 220 | { | 
|  | 221 | auto clientCallback = it->second.callback.lock(); | 
|  | 222 | if (clientCallback != nullptr) { | 
|  | 223 | clientCallback->onTranscodingFinished( | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 224 | mLastSession.second, | 
|  | 225 | TranscodingResultParcel({mLastSession.second, 0, std::nullopt})); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 226 | } | 
|  | 227 | } | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 228 | mSessions.erase(it); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 229 | } | 
|  | 230 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 231 | void abortLastSession() { | 
|  | 232 | auto it = mSessions.find(mLastSession); | 
|  | 233 | if (it == mSessions.end()) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 234 | return; | 
|  | 235 | } | 
|  | 236 | { | 
|  | 237 | auto clientCallback = it->second.callback.lock(); | 
|  | 238 | if (clientCallback != nullptr) { | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 239 | clientCallback->onTranscodingFailed(mLastSession.second, | 
| Chong Zhang | 7ae4e2f | 2020-04-17 15:24:34 -0700 | [diff] [blame] | 240 | TranscodingErrorCode::kUnknown); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 241 | } | 
|  | 242 | } | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 243 | mSessions.erase(it); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 244 | } | 
|  | 245 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 246 | struct Session { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 247 | TranscodingRequest request; | 
|  | 248 | std::weak_ptr<ITranscodingClientCallback> callback; | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 249 | std::unordered_set<uid_t> allClientUids; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 250 | }; | 
|  | 251 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 252 | typedef std::pair<ClientIdType, SessionIdType> SessionKeyType; | 
|  | 253 | std::map<SessionKeyType, Session> mSessions; | 
|  | 254 | SessionKeyType mLastSession; | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 255 | }; | 
|  | 256 |  | 
|  | 257 | class TranscodingClientManagerTest : public ::testing::Test { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 258 | public: | 
|  | 259 | TranscodingClientManagerTest() | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 260 | : mController(new TestController()), | 
|  | 261 | mClientManager(new TranscodingClientManager(mController)) { | 
| hkuang | 5172cab | 2020-01-31 12:40:28 -0800 | [diff] [blame] | 262 | ALOGD("TranscodingClientManagerTest created"); | 
|  | 263 | } | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 264 |  | 
|  | 265 | void SetUp() override { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 266 | mClientCallback1 = ::ndk::SharedRefBase::make<TestClientCallback>(); | 
|  | 267 | mClientCallback2 = ::ndk::SharedRefBase::make<TestClientCallback>(); | 
|  | 268 | mClientCallback3 = ::ndk::SharedRefBase::make<TestClientCallback>(); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 269 | } | 
|  | 270 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 271 | void TearDown() override { ALOGI("TranscodingClientManagerTest tear down"); } | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 272 |  | 
|  | 273 | ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); } | 
|  | 274 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 275 | void addMultipleClients() { | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 276 | EXPECT_EQ( | 
|  | 277 | mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &mClient1), | 
|  | 278 | OK); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 279 | EXPECT_NE(mClient1, nullptr); | 
|  | 280 |  | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 281 | EXPECT_EQ( | 
|  | 282 | mClientManager->addClient(mClientCallback2, kClientName, kClientPackage, &mClient2), | 
|  | 283 | OK); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 284 | EXPECT_NE(mClient2, nullptr); | 
|  | 285 |  | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 286 | EXPECT_EQ( | 
|  | 287 | mClientManager->addClient(mClientCallback3, kClientName, kClientPackage, &mClient3), | 
|  | 288 | OK); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 289 | EXPECT_NE(mClient3, nullptr); | 
|  | 290 |  | 
|  | 291 | EXPECT_EQ(mClientManager->getNumOfClients(), 3); | 
|  | 292 | } | 
|  | 293 |  | 
|  | 294 | void unregisterMultipleClients() { | 
|  | 295 | EXPECT_TRUE(mClient1->unregister().isOk()); | 
|  | 296 | EXPECT_TRUE(mClient2->unregister().isOk()); | 
|  | 297 | EXPECT_TRUE(mClient3->unregister().isOk()); | 
|  | 298 | EXPECT_EQ(mClientManager->getNumOfClients(), 0); | 
|  | 299 | } | 
|  | 300 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 301 | std::shared_ptr<TestController> mController; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 302 | std::shared_ptr<TranscodingClientManager> mClientManager; | 
|  | 303 | std::shared_ptr<ITranscodingClient> mClient1; | 
|  | 304 | std::shared_ptr<ITranscodingClient> mClient2; | 
|  | 305 | std::shared_ptr<ITranscodingClient> mClient3; | 
|  | 306 | std::shared_ptr<TestClientCallback> mClientCallback1; | 
|  | 307 | std::shared_ptr<TestClientCallback> mClientCallback2; | 
|  | 308 | std::shared_ptr<TestClientCallback> mClientCallback3; | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 309 | }; | 
|  | 310 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 311 | TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) { | 
|  | 312 | // Add a client with null callback and expect failure. | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 313 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 314 | status_t err = mClientManager->addClient(nullptr, kClientName, kClientPackage, &client); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 315 | EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 316 | } | 
| Chong Zhang | 3f23e98 | 2020-09-24 14:03:41 -0700 | [diff] [blame] | 317 | // | 
|  | 318 | //TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) { | 
|  | 319 | //    // Add a client with invalid Pid and expect failure. | 
|  | 320 | //    std::shared_ptr<ITranscodingClient> client; | 
|  | 321 | //    status_t err = mClientManager->addClient(mClientCallback1, | 
|  | 322 | //                                             kClientName, kClientPackage, &client); | 
|  | 323 | //    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT); | 
|  | 324 | //} | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 325 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 326 | TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) { | 
|  | 327 | // Add a client with invalid name and expect failure. | 
|  | 328 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 329 | status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientName, kClientPackage, | 
|  | 330 | &client); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 331 | EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 332 | } | 
|  | 333 |  | 
|  | 334 | TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) { | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 335 | // Add a client with invalid packagename and expect failure. | 
|  | 336 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 337 | status_t err = mClientManager->addClient(mClientCallback1, kClientName, kInvalidClientPackage, | 
|  | 338 | &client); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 339 | EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 340 | } | 
|  | 341 |  | 
|  | 342 | TEST_F(TranscodingClientManagerTest, TestAddingValidClient) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 343 | // Add a valid client, should succeed. | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 344 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 345 | status_t err = | 
|  | 346 | mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client); | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 347 | EXPECT_EQ(err, OK); | 
|  | 348 | EXPECT_NE(client.get(), nullptr); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 349 | EXPECT_EQ(mClientManager->getNumOfClients(), 1); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 350 |  | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 351 | // Unregister client, should succeed. | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 352 | Status status = client->unregister(); | 
|  | 353 | EXPECT_TRUE(status.isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 354 | EXPECT_EQ(mClientManager->getNumOfClients(), 0); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 355 | } | 
|  | 356 |  | 
|  | 357 | TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) { | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 358 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 359 | status_t err = | 
|  | 360 | mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client); | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 361 | EXPECT_EQ(err, OK); | 
|  | 362 | EXPECT_NE(client.get(), nullptr); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 363 | EXPECT_EQ(mClientManager->getNumOfClients(), 1); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 364 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 365 | std::shared_ptr<ITranscodingClient> dupClient; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 366 | err = mClientManager->addClient(mClientCallback1, "dupClient", "dupPackage", &dupClient); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 367 | EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS); | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 368 | EXPECT_EQ(dupClient.get(), nullptr); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 369 | EXPECT_EQ(mClientManager->getNumOfClients(), 1); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 370 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 371 | Status status = client->unregister(); | 
|  | 372 | EXPECT_TRUE(status.isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 373 | EXPECT_EQ(mClientManager->getNumOfClients(), 0); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 374 |  | 
| Chong Zhang | 3f23e98 | 2020-09-24 14:03:41 -0700 | [diff] [blame] | 375 | err = mClientManager->addClient(mClientCallback1, "dupClient", "dupPackage", &dupClient); | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 376 | EXPECT_EQ(err, OK); | 
|  | 377 | EXPECT_NE(dupClient.get(), nullptr); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 378 | EXPECT_EQ(mClientManager->getNumOfClients(), 1); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 379 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 380 | status = dupClient->unregister(); | 
|  | 381 | EXPECT_TRUE(status.isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 382 | EXPECT_EQ(mClientManager->getNumOfClients(), 0); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 383 | } | 
|  | 384 |  | 
|  | 385 | TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 386 | addMultipleClients(); | 
|  | 387 | unregisterMultipleClients(); | 
|  | 388 | } | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 389 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 390 | TEST_F(TranscodingClientManagerTest, TestSubmitCancelGetSessions) { | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 391 | addMultipleClients(); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 392 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 393 | // Test sessionId assignment. | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 394 | TranscodingRequestParcel request; | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 395 | request.sourceFilePath = "test_source_file_0"; | 
|  | 396 | request.destinationFilePath = "test_desintaion_file_0"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 397 | TranscodingSessionParcel session; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 398 | bool result; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 399 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 400 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 401 | EXPECT_EQ(session.sessionId, SESSION(0)); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 402 |  | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 403 | request.sourceFilePath = "test_source_file_1"; | 
|  | 404 | request.destinationFilePath = "test_desintaion_file_1"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 405 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 406 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 407 | EXPECT_EQ(session.sessionId, SESSION(1)); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 408 |  | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 409 | request.sourceFilePath = "test_source_file_2"; | 
|  | 410 | request.destinationFilePath = "test_desintaion_file_2"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 411 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 412 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 413 | EXPECT_EQ(session.sessionId, SESSION(2)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 414 |  | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 415 | // Test submit bad request (no valid sourceFilePath) fails. | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 416 | TranscodingRequestParcel badRequest; | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 417 | badRequest.sourceFilePath = "bad_source_file"; | 
|  | 418 | badRequest.destinationFilePath = "bad_destination_file"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 419 | EXPECT_TRUE(mClient1->submitRequest(badRequest, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 420 | EXPECT_FALSE(result); | 
|  | 421 |  | 
| Chong Zhang | 3f23e98 | 2020-09-24 14:03:41 -0700 | [diff] [blame] | 422 | // Test submit with bad pid/uid. | 
|  | 423 | badRequest.sourceFilePath = "test_source_file_3"; | 
|  | 424 | badRequest.destinationFilePath = "test_desintaion_file_3"; | 
|  | 425 | badRequest.clientPid = kInvalidClientPid; | 
|  | 426 | badRequest.clientUid = kInvalidClientUid; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 427 | EXPECT_TRUE(mClient1->submitRequest(badRequest, &session, &result).isOk()); | 
| Chong Zhang | 3f23e98 | 2020-09-24 14:03:41 -0700 | [diff] [blame] | 428 | EXPECT_FALSE(result); | 
|  | 429 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 430 | // Test get sessions by id. | 
|  | 431 | EXPECT_TRUE(mClient1->getSessionWithId(SESSION(2), &session, &result).isOk()); | 
|  | 432 | EXPECT_EQ(session.sessionId, SESSION(2)); | 
|  | 433 | EXPECT_EQ(session.request.sourceFilePath, "test_source_file_2"); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 434 | EXPECT_TRUE(result); | 
|  | 435 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 436 | // Test get sessions by invalid id fails. | 
|  | 437 | EXPECT_TRUE(mClient1->getSessionWithId(SESSION(100), &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 438 | EXPECT_FALSE(result); | 
|  | 439 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 440 | // Test cancel non-existent session fail. | 
|  | 441 | EXPECT_TRUE(mClient2->cancelSession(SESSION(100), &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 442 | EXPECT_FALSE(result); | 
|  | 443 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 444 | // Test cancel valid sessionId in arbitrary order. | 
|  | 445 | EXPECT_TRUE(mClient1->cancelSession(SESSION(2), &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 446 | EXPECT_TRUE(result); | 
|  | 447 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 448 | EXPECT_TRUE(mClient1->cancelSession(SESSION(0), &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 449 | EXPECT_TRUE(result); | 
|  | 450 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 451 | EXPECT_TRUE(mClient1->cancelSession(SESSION(1), &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 452 | EXPECT_TRUE(result); | 
|  | 453 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 454 | // Test cancel session again fails. | 
|  | 455 | EXPECT_TRUE(mClient1->cancelSession(SESSION(1), &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 456 | EXPECT_FALSE(result); | 
|  | 457 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 458 | // Test get session after cancel fails. | 
|  | 459 | EXPECT_TRUE(mClient1->getSessionWithId(SESSION(2), &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 460 | EXPECT_FALSE(result); | 
|  | 461 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 462 | // Test sessionId independence for each client. | 
|  | 463 | EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 464 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 465 | EXPECT_EQ(session.sessionId, SESSION(0)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 466 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 467 | EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 468 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 469 | EXPECT_EQ(session.sessionId, SESSION(1)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 470 |  | 
|  | 471 | unregisterMultipleClients(); | 
|  | 472 | } | 
|  | 473 |  | 
|  | 474 | TEST_F(TranscodingClientManagerTest, TestClientCallback) { | 
|  | 475 | addMultipleClients(); | 
|  | 476 |  | 
|  | 477 | TranscodingRequestParcel request; | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 478 | request.sourceFilePath = "test_source_file_name"; | 
|  | 479 | request.destinationFilePath = "test_destination_file_name"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 480 | TranscodingSessionParcel session; | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 481 | bool result; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 482 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 483 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 484 | EXPECT_EQ(session.sessionId, SESSION(0)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 485 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 486 | mController->finishLastSession(); | 
|  | 487 | EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(session.sessionId)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 488 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 489 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 490 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 491 | EXPECT_EQ(session.sessionId, SESSION(1)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 492 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 493 | mController->abortLastSession(); | 
|  | 494 | EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(session.sessionId)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 495 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 496 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 497 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 498 | EXPECT_EQ(session.sessionId, SESSION(2)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 499 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 500 | EXPECT_TRUE(mClient2->submitRequest(request, &session, &result).isOk()); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 501 | EXPECT_TRUE(result); | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 502 | EXPECT_EQ(session.sessionId, SESSION(0)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 503 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 504 | mController->finishLastSession(); | 
|  | 505 | EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(session.sessionId)); | 
| Chong Zhang | 6d58e4b | 2020-03-31 09:41:10 -0700 | [diff] [blame] | 506 |  | 
|  | 507 | unregisterMultipleClients(); | 
| hkuang | 26587cb | 2020-01-16 10:36:08 -0800 | [diff] [blame] | 508 | } | 
|  | 509 |  | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 510 | TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) { | 
|  | 511 | // Add a client. | 
|  | 512 | std::shared_ptr<ITranscodingClient> client; | 
| Chong Zhang | 0579c6f | 2020-10-05 12:03:34 -0700 | [diff] [blame] | 513 | status_t err = | 
|  | 514 | mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 515 | EXPECT_EQ(err, OK); | 
|  | 516 | EXPECT_NE(client.get(), nullptr); | 
|  | 517 |  | 
|  | 518 | // Submit 2 requests, 1 offline and 1 realtime. | 
|  | 519 | TranscodingRequestParcel request; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 520 | TranscodingSessionParcel session; | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 521 | bool result; | 
|  | 522 |  | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 523 | request.sourceFilePath = "test_source_file_0"; | 
|  | 524 | request.destinationFilePath = "test_destination_file_0"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 525 | request.priority = TranscodingSessionPriority::kUnspecified; | 
|  | 526 | EXPECT_TRUE(client->submitRequest(request, &session, &result).isOk() && result); | 
|  | 527 | EXPECT_EQ(session.sessionId, SESSION(0)); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 528 |  | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 529 | request.sourceFilePath = "test_source_file_1"; | 
|  | 530 | request.destinationFilePath = "test_destination_file_1"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 531 | request.priority = TranscodingSessionPriority::kNormal; | 
|  | 532 | EXPECT_TRUE(client->submitRequest(request, &session, &result).isOk() && result); | 
|  | 533 | EXPECT_EQ(session.sessionId, SESSION(1)); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 534 |  | 
|  | 535 | // Unregister client, should succeed. | 
|  | 536 | Status status = client->unregister(); | 
|  | 537 | EXPECT_TRUE(status.isOk()); | 
|  | 538 |  | 
|  | 539 | // Test submit new request after unregister, should fail with ERROR_DISCONNECTED. | 
| hkuang | 72d105f | 2020-05-21 10:48:55 -0700 | [diff] [blame] | 540 | request.sourceFilePath = "test_source_file_2"; | 
|  | 541 | request.destinationFilePath = "test_destination_file_2"; | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 542 | request.priority = TranscodingSessionPriority::kNormal; | 
|  | 543 | status = client->submitRequest(request, &session, &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 544 | EXPECT_FALSE(status.isOk()); | 
|  | 545 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 546 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 547 | // Test cancel sessions after unregister, should fail with ERROR_DISCONNECTED | 
|  | 548 | // regardless of realtime or offline session, or whether the sessionId is valid. | 
|  | 549 | status = client->cancelSession(SESSION(0), &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 550 | EXPECT_FALSE(status.isOk()); | 
|  | 551 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 552 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 553 | status = client->cancelSession(SESSION(1), &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 554 | EXPECT_FALSE(status.isOk()); | 
|  | 555 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 556 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 557 | status = client->cancelSession(SESSION(2), &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 558 | EXPECT_FALSE(status.isOk()); | 
|  | 559 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 560 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 561 | // Test get sessions, should fail with ERROR_DISCONNECTED regardless of realtime | 
|  | 562 | // or offline session, or whether the sessionId is valid. | 
|  | 563 | status = client->getSessionWithId(SESSION(0), &session, &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 564 | EXPECT_FALSE(status.isOk()); | 
|  | 565 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 566 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 567 | status = client->getSessionWithId(SESSION(1), &session, &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 568 | EXPECT_FALSE(status.isOk()); | 
|  | 569 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 570 |  | 
| Chong Zhang | bc06248 | 2020-10-14 16:43:53 -0700 | [diff] [blame] | 571 | status = client->getSessionWithId(SESSION(2), &session, &result); | 
| Chong Zhang | 15c192a | 2020-05-05 16:24:00 -0700 | [diff] [blame] | 572 | EXPECT_FALSE(status.isOk()); | 
|  | 573 | EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); | 
|  | 574 | } | 
|  | 575 |  | 
| Chong Zhang | ebd86d3 | 2021-03-29 11:30:56 -0700 | [diff] [blame] | 576 | TEST_F(TranscodingClientManagerTest, TestAddGetClientUidsInvalidArgs) { | 
|  | 577 | addMultipleClients(); | 
|  | 578 |  | 
|  | 579 | bool result; | 
|  | 580 | std::vector<int32_t> clientUids; | 
|  | 581 | TranscodingRequestParcel request; | 
|  | 582 | TranscodingSessionParcel session; | 
|  | 583 | uid_t ownUid = ::getuid(); | 
|  | 584 |  | 
|  | 585 | // Add/Get clients with invalid session id fails. | 
|  | 586 | EXPECT_TRUE(mClient1->addClientUid(-1, ownUid, &result).isOk()); | 
|  | 587 | EXPECT_FALSE(result); | 
|  | 588 | EXPECT_TRUE(mClient1->addClientUid(SESSION(0), ownUid, &result).isOk()); | 
|  | 589 | EXPECT_FALSE(result); | 
|  | 590 | EXPECT_TRUE(mClient1->getClientUids(-1, &clientUids, &result).isOk()); | 
|  | 591 | EXPECT_FALSE(result); | 
|  | 592 | EXPECT_TRUE(mClient1->getClientUids(SESSION(0), &clientUids, &result).isOk()); | 
|  | 593 | EXPECT_FALSE(result); | 
|  | 594 |  | 
|  | 595 | unregisterMultipleClients(); | 
|  | 596 | } | 
|  | 597 |  | 
|  | 598 | TEST_F(TranscodingClientManagerTest, TestAddGetClientUids) { | 
|  | 599 | addMultipleClients(); | 
|  | 600 |  | 
|  | 601 | bool result; | 
|  | 602 | std::vector<int32_t> clientUids; | 
|  | 603 | TranscodingRequestParcel request; | 
|  | 604 | TranscodingSessionParcel session; | 
|  | 605 | uid_t ownUid = ::getuid(); | 
|  | 606 |  | 
|  | 607 | // Submit one real-time session. | 
|  | 608 | request.sourceFilePath = "test_source_file_0"; | 
|  | 609 | request.destinationFilePath = "test_desintaion_file_0"; | 
|  | 610 | request.priority = TranscodingSessionPriority::kNormal; | 
|  | 611 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
|  | 612 | EXPECT_TRUE(result); | 
|  | 613 |  | 
|  | 614 | // Should have own uid in client uid list. | 
|  | 615 | EXPECT_TRUE(mClient1->getClientUids(SESSION(0), &clientUids, &result).isOk()); | 
|  | 616 | EXPECT_TRUE(result); | 
|  | 617 | EXPECT_EQ(clientUids.size(), 1); | 
|  | 618 | EXPECT_EQ(clientUids[0], ownUid); | 
|  | 619 |  | 
|  | 620 | // Adding invalid client uid should fail. | 
|  | 621 | EXPECT_TRUE(mClient1->addClientUid(SESSION(0), kInvalidClientUid, &result).isOk()); | 
|  | 622 | EXPECT_FALSE(result); | 
|  | 623 |  | 
|  | 624 | // Adding own uid again should fail. | 
|  | 625 | EXPECT_TRUE(mClient1->addClientUid(SESSION(0), ownUid, &result).isOk()); | 
|  | 626 | EXPECT_FALSE(result); | 
|  | 627 |  | 
|  | 628 | // Submit one offline session. | 
|  | 629 | request.sourceFilePath = "test_source_file_1"; | 
|  | 630 | request.destinationFilePath = "test_desintaion_file_1"; | 
|  | 631 | request.priority = TranscodingSessionPriority::kUnspecified; | 
|  | 632 | EXPECT_TRUE(mClient1->submitRequest(request, &session, &result).isOk()); | 
|  | 633 | EXPECT_TRUE(result); | 
|  | 634 |  | 
|  | 635 | // Should not have own uid in client uid list. | 
|  | 636 | EXPECT_TRUE(mClient1->getClientUids(SESSION(1), &clientUids, &result).isOk()); | 
|  | 637 | EXPECT_TRUE(result); | 
|  | 638 | EXPECT_EQ(clientUids.size(), 0); | 
|  | 639 |  | 
|  | 640 | // Add own uid (with IMediaTranscodingService::USE_CALLING_UID) again, should succeed. | 
|  | 641 | EXPECT_TRUE( | 
|  | 642 | mClient1->addClientUid(SESSION(1), IMediaTranscodingService::USE_CALLING_UID, &result) | 
|  | 643 | .isOk()); | 
|  | 644 | EXPECT_TRUE(result); | 
|  | 645 | EXPECT_TRUE(mClient1->getClientUids(SESSION(1), &clientUids, &result).isOk()); | 
|  | 646 | EXPECT_TRUE(result); | 
|  | 647 | EXPECT_EQ(clientUids.size(), 1); | 
|  | 648 | EXPECT_EQ(clientUids[0], ownUid); | 
|  | 649 |  | 
|  | 650 | // Add more uids, should succeed. | 
|  | 651 | int32_t kFakeUid = ::getuid() ^ 0x1; | 
|  | 652 | EXPECT_TRUE(mClient1->addClientUid(SESSION(1), kFakeUid, &result).isOk()); | 
|  | 653 | EXPECT_TRUE(result); | 
|  | 654 | EXPECT_TRUE(mClient1->getClientUids(SESSION(1), &clientUids, &result).isOk()); | 
|  | 655 | EXPECT_TRUE(result); | 
|  | 656 | std::unordered_set<uid_t> uidSet; | 
|  | 657 | uidSet.insert(clientUids.begin(), clientUids.end()); | 
|  | 658 | EXPECT_EQ(uidSet.size(), 2); | 
|  | 659 | EXPECT_EQ(uidSet.count(ownUid), 1); | 
|  | 660 | EXPECT_EQ(uidSet.count(kFakeUid), 1); | 
|  | 661 |  | 
|  | 662 | unregisterMultipleClients(); | 
|  | 663 | } | 
|  | 664 |  | 
| Chong Zhang | 8e06263 | 2020-03-31 10:56:37 -0700 | [diff] [blame] | 665 | }  // namespace android |