/*
* Copyright (C) 2017 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_TAG "VtsHalHidlTargetTestEnvBase"
#include "VtsHalHidlTargetTestEnvBase.h"
#include <string>
#include <utils/Log.h>
static constexpr const char* kListFlag = "--list_registered_services";
static constexpr const char* kServiceInstanceFlag = "--hal_service_instance";
using namespace std;
namespace testing {
void VtsHalHidlTargetTestEnvBase::SetUp() {
if (!inited_) {
ALOGE("Environment not inited, did you forget to call init()?");
abort();
}
// Register services used in the test.
registerTestServices();
// For a dummy run which just print the registered hal services.
if (listService_) {
listRegisteredServices();
exit(0);
}
// Call the customized setup process.
HidlSetUp();
}
void VtsHalHidlTargetTestEnvBase::TearDown() {
// Call the customized teardown process.
HidlTearDown();
}
void VtsHalHidlTargetTestEnvBase::init(int* argc, char** argv) {
if (inited_) return;
for (int i = 1; i < *argc; i++) {
if (parseVtsTestOption(argv[i])) {
// Shift the remainder of the argv list left by one.
for (int j = i; j != *argc; j++) {
argv[j] = argv[j + 1];
}
// Decrements the argument count.
(*argc)--;
// We also need to decrement the iterator as we just removed an element.
i--;
}
}
inited_ = true;
}
bool VtsHalHidlTargetTestEnvBase::parseVtsTestOption(const char* arg) {
// arg must not be NULL.
if (arg == NULL) return false;
if (strncmp(arg, kListFlag, strlen(kListFlag)) == 0) {
listService_ = true;
return true;
}
if (strncmp(arg, kServiceInstanceFlag, strlen(kServiceInstanceFlag)) == 0) {
// value is the part after "--hal_service_instance="
const char* value = arg + strlen(kServiceInstanceFlag) + 1;
addHalServiceInstance(string(value));
return true;
}
return false;
}
void VtsHalHidlTargetTestEnvBase::addHalServiceInstance(
const string& halServiceInstance) {
// hal_service_instance follows the format:
// package@version::interface/service_name e.g.:
// android.hardware.vibrator@1.0::IVibrator/default
string instanceName =
halServiceInstance.substr(0, halServiceInstance.find('/'));
string serviceName =
halServiceInstance.substr(halServiceInstance.find('/') + 1);
// Fail the process if trying to pass multiple service names for the same
// service instance.
if (halServiceInstances_.find(instanceName) != halServiceInstances_.end()) {
ALOGE("Exisitng instance %s with name %s", instanceName.c_str(),
halServiceInstances_[instanceName].c_str());
abort();
}
halServiceInstances_[instanceName] = serviceName;
}
string VtsHalHidlTargetTestEnvBase::getServiceName(const string& instanceName,
const string& defaultName) {
if (halServiceInstances_.find(instanceName) != halServiceInstances_.end()) {
return halServiceInstances_[instanceName];
}
// Could not find the instance.
ALOGE("Does not find service name for %s, using default name: %s",
instanceName.c_str(), defaultName.c_str());
return defaultName;
}
void VtsHalHidlTargetTestEnvBase::registerTestService(const string& FQName) {
registeredHalServices_.insert(FQName);
}
void VtsHalHidlTargetTestEnvBase::listRegisteredServices() {
for (string service : registeredHalServices_) {
printf("hal_service: %s\n", service.c_str());
}
printf("service_comb_mode: %d\n", mode_);
}
} // namespace testing