commit
9d73033022
@ -0,0 +1,29 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2020 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
BasedOnStyle: Google
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
ColumnLimit: 100
|
||||||
|
CommentPragmas: NOLINT:.*
|
||||||
|
ContinuationIndentWidth: 8
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
IndentWidth: 4
|
||||||
|
PointerAlignment: Left
|
||||||
|
TabWidth: 4
|
@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #define LOG_NDEBUG 0
|
||||||
|
#define LOG_TAG "TranscodingClientManager"
|
||||||
|
|
||||||
|
#include <media/TranscodingClientManager.h>
|
||||||
|
#include <utils/Log.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
class DeathNotifier;
|
||||||
|
using Status = ::ndk::ScopedAStatus;
|
||||||
|
|
||||||
|
// static
|
||||||
|
sp<TranscodingClientManager> TranscodingClientManager::getInstance() {
|
||||||
|
static sp<TranscodingClientManager> sInstance = new TranscodingClientManager();
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
TranscodingClientManager::TranscodingClientManager()
|
||||||
|
: mDeathRecipient(AIBinder_DeathRecipient_new(
|
||||||
|
TranscodingClientManager::DeathNotifier::BinderDiedCallback)) {
|
||||||
|
ALOGD("TranscodingClientManager started");
|
||||||
|
}
|
||||||
|
|
||||||
|
TranscodingClientManager::~TranscodingClientManager() {
|
||||||
|
ALOGD("TranscodingClientManager exited");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TranscodingClientManager::isClientIdRegistered(int32_t clientId) const {
|
||||||
|
std::scoped_lock lock{mLock};
|
||||||
|
return mClientIdToClientInfoMap.find(clientId) != mClientIdToClientInfoMap.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranscodingClientManager::dumpAllClients(int fd, const Vector<String16>& args __unused) {
|
||||||
|
String8 result;
|
||||||
|
|
||||||
|
const size_t SIZE = 256;
|
||||||
|
char buffer[SIZE];
|
||||||
|
|
||||||
|
snprintf(buffer, SIZE, " Total num of Clients: %zu\n", mClientIdToClientInfoMap.size());
|
||||||
|
result.append(buffer);
|
||||||
|
|
||||||
|
if (mClientIdToClientInfoMap.size() > 0) {
|
||||||
|
snprintf(buffer, SIZE, "========== Dumping all clients =========\n");
|
||||||
|
result.append(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& iter : mClientIdToClientInfoMap) {
|
||||||
|
const std::shared_ptr<ITranscodingServiceClient> client = iter.second->mClient;
|
||||||
|
std::string clientName;
|
||||||
|
Status status = client->getName(&clientName);
|
||||||
|
if (!status.isOk()) {
|
||||||
|
ALOGE("Failed to get client: %d information", iter.first);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
snprintf(buffer, SIZE, " -- Clients: %d name: %s\n", iter.first, clientName.c_str());
|
||||||
|
result.append(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
write(fd, result.string(), result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t TranscodingClientManager::addClient(std::unique_ptr<ClientInfo> client) {
|
||||||
|
// Validate the client.
|
||||||
|
if (client == nullptr || client->mClientId <= 0 || client->mClientPid <= 0 ||
|
||||||
|
client->mClientUid <= 0 || client->mClientOpPackageName.empty() ||
|
||||||
|
client->mClientOpPackageName == "") {
|
||||||
|
ALOGE("Invalid client");
|
||||||
|
return BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALOGD("Adding client id %d %s", client->mClientId, client->mClientOpPackageName.c_str());
|
||||||
|
std::scoped_lock lock{mLock};
|
||||||
|
|
||||||
|
// Check if the client already exists.
|
||||||
|
if (mClientIdToClientInfoMap.count(client->mClientId) != 0) {
|
||||||
|
ALOGW("Client already exists.");
|
||||||
|
return ALREADY_EXISTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen to the death of the client.
|
||||||
|
client->mDeathNotifier = new DeathNotifier();
|
||||||
|
AIBinder_linkToDeath(client->mClient->asBinder().get(), mDeathRecipient.get(),
|
||||||
|
client->mDeathNotifier.get());
|
||||||
|
|
||||||
|
// Adds the new client to the map.
|
||||||
|
mClientIdToClientInfoMap[client->mClientId] = std::move(client);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t TranscodingClientManager::removeClient(int32_t clientId) {
|
||||||
|
ALOGD("Removing client id %d", clientId);
|
||||||
|
std::scoped_lock lock{mLock};
|
||||||
|
|
||||||
|
// Checks if the client is valid.
|
||||||
|
auto it = mClientIdToClientInfoMap.find(clientId);
|
||||||
|
if (it == mClientIdToClientInfoMap.end()) {
|
||||||
|
ALOGE("Client id %d does not exist", clientId);
|
||||||
|
return INVALID_OPERATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client = it->second->mClient;
|
||||||
|
|
||||||
|
// Check if the client still live. If alive, unlink the death.
|
||||||
|
if (client) {
|
||||||
|
AIBinder_unlinkToDeath(client->asBinder().get(), mDeathRecipient.get(),
|
||||||
|
it->second->mDeathNotifier.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erase the entry.
|
||||||
|
mClientIdToClientInfoMap.erase(it);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t TranscodingClientManager::getNumOfClients() const {
|
||||||
|
std::scoped_lock lock{mLock};
|
||||||
|
return mClientIdToClientInfoMap.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void TranscodingClientManager::DeathNotifier::BinderDiedCallback(void* cookie) {
|
||||||
|
int32_t* pClientId = static_cast<int32_t*>(cookie);
|
||||||
|
ALOGD("Client %d is dead", *pClientId);
|
||||||
|
// Don't check for pid validity since we know it's already dead.
|
||||||
|
sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance();
|
||||||
|
manager->removeClient(*pClientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace android
|
@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_MEDIA_TRANSCODING_CLIENT_MANAGER_H
|
||||||
|
#define ANDROID_MEDIA_TRANSCODING_CLIENT_MANAGER_H
|
||||||
|
|
||||||
|
#include <aidl/android/media/BnTranscodingServiceClient.h>
|
||||||
|
#include <android/binder_ibinder.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <utils/Condition.h>
|
||||||
|
#include <utils/RefBase.h>
|
||||||
|
#include <utils/String8.h>
|
||||||
|
#include <utils/Vector.h>
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
using ::aidl::android::media::ITranscodingServiceClient;
|
||||||
|
|
||||||
|
class MediaTranscodingService;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TranscodingClientManager manages all the transcoding clients across different processes.
|
||||||
|
*
|
||||||
|
* TranscodingClientManager is a global singleton that could only acquired by
|
||||||
|
* MediaTranscodingService. It manages all the clients's registration/unregistration and clients'
|
||||||
|
* information. It also bookkeeps all the clients' information. It also monitors to the death of the
|
||||||
|
* clients. Upon client's death, it will remove the client from it.
|
||||||
|
*
|
||||||
|
* TODO(hkuang): Hook up with ResourceManager for resource management.
|
||||||
|
* TODO(hkuang): Hook up with MediaMetrics to log all the transactions.
|
||||||
|
*/
|
||||||
|
class TranscodingClientManager : public RefBase {
|
||||||
|
private:
|
||||||
|
// Forward declare it as it will be used in ClientInfo below.
|
||||||
|
class DeathNotifier;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~TranscodingClientManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ClientInfo contains a single client's information.
|
||||||
|
*/
|
||||||
|
struct ClientInfo {
|
||||||
|
/* The remote client that this ClientInfo is associated with. */
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> mClient;
|
||||||
|
/* A unique positive Id assigned to the client by the service. */
|
||||||
|
int32_t mClientId;
|
||||||
|
/* Process id of the client */
|
||||||
|
int32_t mClientPid;
|
||||||
|
/* User id of the client. */
|
||||||
|
int32_t mClientUid;
|
||||||
|
/* Package name of the client. */
|
||||||
|
std::string mClientOpPackageName;
|
||||||
|
/* Listener for the death of the client. */
|
||||||
|
sp<DeathNotifier> mDeathNotifier;
|
||||||
|
|
||||||
|
ClientInfo(const std::shared_ptr<ITranscodingServiceClient>& client, int64_t clientId,
|
||||||
|
int32_t pid, int32_t uid, const std::string& opPackageName)
|
||||||
|
: mClient(client),
|
||||||
|
mClientId(clientId),
|
||||||
|
mClientPid(pid),
|
||||||
|
mClientUid(uid),
|
||||||
|
mClientOpPackageName(opPackageName),
|
||||||
|
mDeathNotifier(nullptr) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new client to the manager.
|
||||||
|
*
|
||||||
|
* The client must have valid clientId, pid, uid and opPackageName, otherwise, this will return
|
||||||
|
* a non-zero errorcode. If the client has already been added, it will also return non-zero
|
||||||
|
* errorcode.
|
||||||
|
*
|
||||||
|
* @param client to be added to the manager.
|
||||||
|
* @return 0 if client is added successfully, non-zero errorcode otherwise.
|
||||||
|
*/
|
||||||
|
status_t addClient(std::unique_ptr<ClientInfo> client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an existing client from the manager.
|
||||||
|
*
|
||||||
|
* If the client does not exist, this will return non-zero errorcode.
|
||||||
|
*
|
||||||
|
* @param clientId id of the client to be removed..
|
||||||
|
* @return 0 if client is removed successfully, non-zero errorcode otherwise.
|
||||||
|
*/
|
||||||
|
status_t removeClient(int32_t clientId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of clients.
|
||||||
|
*/
|
||||||
|
size_t getNumOfClients() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a client with clientId is already registered.
|
||||||
|
*/
|
||||||
|
bool isClientIdRegistered(int32_t clientId) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump all the client information to the fd.
|
||||||
|
*/
|
||||||
|
void dumpAllClients(int fd, const Vector<String16>& args);
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class MediaTranscodingService;
|
||||||
|
friend class TranscodingClientManagerTest;
|
||||||
|
|
||||||
|
class DeathNotifier : public RefBase {
|
||||||
|
public:
|
||||||
|
DeathNotifier() = default;
|
||||||
|
|
||||||
|
~DeathNotifier() = default;
|
||||||
|
|
||||||
|
// Implement death recipient
|
||||||
|
static void BinderDiedCallback(void* cookie);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Get the singleton instance of the TranscodingClientManager. */
|
||||||
|
static sp<TranscodingClientManager> getInstance();
|
||||||
|
|
||||||
|
TranscodingClientManager();
|
||||||
|
|
||||||
|
mutable std::mutex mLock;
|
||||||
|
std::unordered_map<int32_t, std::unique_ptr<ClientInfo>> mClientIdToClientInfoMap
|
||||||
|
GUARDED_BY(mLock);
|
||||||
|
|
||||||
|
std::vector<sp<DeathNotifier>> mDeathNotifiers GUARDED_BY(mLock);
|
||||||
|
::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace android
|
||||||
|
#endif // ANDROID_MEDIA_TRANSCODING_SERVICE_H
|
@ -0,0 +1,38 @@
|
|||||||
|
// Build the unit tests for libmediatranscoding.
|
||||||
|
cc_defaults {
|
||||||
|
name: "libmediatranscoding_test_defaults",
|
||||||
|
|
||||||
|
header_libs: [
|
||||||
|
"libbase_headers",
|
||||||
|
"libmedia_headers",
|
||||||
|
],
|
||||||
|
|
||||||
|
shared_libs: [
|
||||||
|
"libbinder_ndk",
|
||||||
|
"libcutils",
|
||||||
|
"liblog",
|
||||||
|
"libutils",
|
||||||
|
"libmediatranscoding"
|
||||||
|
],
|
||||||
|
|
||||||
|
static_libs: [
|
||||||
|
"mediatranscoding_aidl_interface-ndk_platform",
|
||||||
|
],
|
||||||
|
|
||||||
|
cflags: [
|
||||||
|
"-Werror",
|
||||||
|
"-Wall",
|
||||||
|
],
|
||||||
|
|
||||||
|
test_suites: ["device-tests"],
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// TranscodingClientManager unit test
|
||||||
|
//
|
||||||
|
cc_test {
|
||||||
|
name: "TranscodingClientManager_tests",
|
||||||
|
defaults: ["libmediatranscoding_test_defaults"],
|
||||||
|
|
||||||
|
srcs: ["TranscodingClientManager_tests.cpp"],
|
||||||
|
}
|
@ -0,0 +1,285 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Unit Test for TranscodingClientManager
|
||||||
|
|
||||||
|
// #define LOG_NDEBUG 0
|
||||||
|
#define LOG_TAG "TranscodingClientManagerTest"
|
||||||
|
|
||||||
|
#include <aidl/android/media/BnTranscodingServiceClient.h>
|
||||||
|
#include <aidl/android/media/IMediaTranscodingService.h>
|
||||||
|
#include <aidl/android/media/ITranscodingServiceClient.h>
|
||||||
|
#include <android-base/logging.h>
|
||||||
|
#include <android/binder_manager.h>
|
||||||
|
#include <android/binder_process.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <media/TranscodingClientManager.h>
|
||||||
|
#include <utils/Log.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
using Status = ::ndk::ScopedAStatus;
|
||||||
|
using aidl::android::media::BnTranscodingServiceClient;
|
||||||
|
using aidl::android::media::IMediaTranscodingService;
|
||||||
|
using aidl::android::media::ITranscodingServiceClient;
|
||||||
|
|
||||||
|
constexpr int32_t kInvalidClientId = -1;
|
||||||
|
constexpr int32_t kInvalidClientPid = -1;
|
||||||
|
constexpr int32_t kInvalidClientUid = -1;
|
||||||
|
constexpr const char* kInvalidClientOpPackageName = "";
|
||||||
|
|
||||||
|
constexpr int32_t kClientId = 1;
|
||||||
|
constexpr int32_t kClientPid = 2;
|
||||||
|
constexpr int32_t kClientUid = 3;
|
||||||
|
constexpr const char* kClientOpPackageName = "TestClient";
|
||||||
|
|
||||||
|
struct TestClient : public BnTranscodingServiceClient {
|
||||||
|
TestClient(const std::shared_ptr<IMediaTranscodingService>& service) : mService(service) {
|
||||||
|
ALOGD("TestClient Created");
|
||||||
|
}
|
||||||
|
|
||||||
|
Status getName(std::string* _aidl_return) override {
|
||||||
|
*_aidl_return = "test_client";
|
||||||
|
return Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status onTranscodingFinished(
|
||||||
|
int32_t /* in_jobId */,
|
||||||
|
const ::aidl::android::media::TranscodingResultParcel& /* in_result */) override {
|
||||||
|
return Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status onTranscodingFailed(
|
||||||
|
int32_t /* in_jobId */,
|
||||||
|
::aidl::android::media::TranscodingErrorCode /*in_errorCode */) override {
|
||||||
|
return Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status onAwaitNumberOfJobsChanged(int32_t /* in_jobId */, int32_t /* in_oldAwaitNumber */,
|
||||||
|
int32_t /* in_newAwaitNumber */) override {
|
||||||
|
return Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status onProgressUpdate(int32_t /* in_jobId */, int32_t /* in_progress */) override {
|
||||||
|
return Status::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~TestClient() { ALOGI("TestClient destroyed"); };
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<IMediaTranscodingService> mService;
|
||||||
|
TestClient(const TestClient&) = delete;
|
||||||
|
TestClient& operator=(const TestClient&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TranscodingClientManagerTest : public ::testing::Test {
|
||||||
|
public:
|
||||||
|
TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest created"); }
|
||||||
|
|
||||||
|
void SetUp() override {
|
||||||
|
mClientManager = TranscodingClientManager::getInstance();
|
||||||
|
if (mClientManager == nullptr) {
|
||||||
|
ALOGE("Failed to acquire TranscodingClientManager.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
::ndk::SpAIBinder binder(AServiceManager_getService("media.transcoding"));
|
||||||
|
mService = IMediaTranscodingService::fromBinder(binder);
|
||||||
|
if (mService == nullptr) {
|
||||||
|
ALOGE("Failed to connect to the media.trascoding service.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mTestClient = ::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override {
|
||||||
|
ALOGI("TranscodingClientManagerTest tear down");
|
||||||
|
mClientManager = nullptr;
|
||||||
|
mService = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
|
||||||
|
|
||||||
|
sp<TranscodingClientManager> mClientManager = nullptr;
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> mTestClient = nullptr;
|
||||||
|
std::shared_ptr<IMediaTranscodingService> mService = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientId) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
// Create a client with invalid client id.
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client, kInvalidClientId, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
// Add the client to the manager and expect failure.
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
// Create a client with invalid Pid.
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client, kClientId, kInvalidClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
// Add the client to the manager and expect failure.
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientUid) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
// Create a client with invalid Uid.
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client, kClientId, kClientPid, kInvalidClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
// Add the client to the manager and expect failure.
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
// Create a client with invalid packagename.
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client, kClientId, kClientPid, kClientUid, kInvalidClientOpPackageName);
|
||||||
|
|
||||||
|
// Add the client to the manager and expect failure.
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client1 =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
size_t numOfClients = mClientManager->getNumOfClients();
|
||||||
|
EXPECT_EQ(numOfClients, 1);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(kClientId);
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client1 =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(kClientId);
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestAddingMultipleClient) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client1 =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo1 =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client1, kClientId, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo1));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client2 =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo2 =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client2, kClientId + 1, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
err = mClientManager->addClient(std::move(clientInfo2));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client3 =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
// Create a client with invalid packagename.
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo3 =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client3, kClientId + 2, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
err = mClientManager->addClient(std::move(clientInfo3));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
size_t numOfClients = mClientManager->getNumOfClients();
|
||||||
|
EXPECT_EQ(numOfClients, 3);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(kClientId);
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(kClientId + 1);
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(kClientId + 2);
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestRemovingNonExistClient) {
|
||||||
|
status_t err = mClientManager->removeClient(kInvalidClientId);
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
|
||||||
|
err = mClientManager->removeClient(1000 /* clientId */);
|
||||||
|
EXPECT_TRUE(err != OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranscodingClientManagerTest, TestCheckClientWithClientId) {
|
||||||
|
std::shared_ptr<ITranscodingServiceClient> client =
|
||||||
|
::ndk::SharedRefBase::make<TestClient>(mService);
|
||||||
|
|
||||||
|
std::unique_ptr<TranscodingClientManager::ClientInfo> clientInfo =
|
||||||
|
std::make_unique<TranscodingClientManager::ClientInfo>(
|
||||||
|
client, kClientId, kClientPid, kClientUid, kClientOpPackageName);
|
||||||
|
|
||||||
|
status_t err = mClientManager->addClient(std::move(clientInfo));
|
||||||
|
EXPECT_TRUE(err == OK);
|
||||||
|
|
||||||
|
bool res = mClientManager->isClientIdRegistered(kClientId);
|
||||||
|
EXPECT_TRUE(res);
|
||||||
|
|
||||||
|
res = mClientManager->isClientIdRegistered(kInvalidClientId);
|
||||||
|
EXPECT_FALSE(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace android
|
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Run tests in this directory.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -z "$ANDROID_BUILD_TOP" ]; then
|
||||||
|
echo "Android build environment not set"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ensure we have mm
|
||||||
|
. $ANDROID_BUILD_TOP/build/envsetup.sh
|
||||||
|
|
||||||
|
mm
|
||||||
|
|
||||||
|
echo "waiting for device"
|
||||||
|
|
||||||
|
adb root && adb wait-for-device remount && adb sync
|
||||||
|
|
||||||
|
echo "========================================"
|
||||||
|
|
||||||
|
echo "testing TranscodingClientManager"
|
||||||
|
adb shell /data/nativetest64/TranscodingClientManager_tests/TranscodingClientManager_tests
|
Loading…
Reference in new issue