| /* |
| * 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 <iostream> |
| #include <string> |
| |
| #include <hidl-util/FqInstance.h> |
| |
| static const std::string kListFlag = "--list_registered_services"; |
| static const std::string kServiceInstanceFlag = "--hal_service_instance="; |
| |
| using namespace std; |
| |
| namespace testing { |
| |
| void VtsHalHidlTargetTestEnvBase::SetUp() { |
| if (!inited_) { |
| cerr << "Environment not inited, did you forget to call init()?" << endl; |
| exit(-1); |
| } |
| // Register services used in the test. |
| registerTestServices(); |
| // For a no-op 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 (arg == kListFlag) { |
| listService_ = true; |
| return true; |
| } |
| |
| if (string(arg).find(kServiceInstanceFlag) == 0) { |
| // value is the part after "--hal_service_instance=" |
| string value = string(arg).substr(kServiceInstanceFlag.length()); |
| addHalServiceInstance(value); |
| return true; |
| } |
| return false; |
| } |
| |
| void VtsHalHidlTargetTestEnvBase::addHalServiceInstance( |
| const string& halServiceInstance) { |
| // hal_service_instance follows the format: |
| // package@version::interface/instance e.g.: |
| // [email protected]::IVibrator/default |
| if (!isValidInstance(halServiceInstance)) { |
| cerr << "Input instance " << halServiceInstance |
| << "does not confirm to the HAL instance format. " |
| << "Expect format: package@version::interface/instance." << endl; |
| exit(-1); |
| } |
| string halName = halServiceInstance.substr(0, halServiceInstance.find('/')); |
| string instanceName = |
| halServiceInstance.substr(halServiceInstance.find('/') + 1); |
| // Fail the process if trying to pass multiple service names for the same |
| // service instance. |
| if (halServiceInstances_.find(halName) != halServiceInstances_.end()) { |
| cerr << "Existing instance " << halName << "with name " |
| << halServiceInstances_[halName] << endl; |
| exit(-1); |
| } |
| halServiceInstances_[halName] = instanceName; |
| } |
| |
| string VtsHalHidlTargetTestEnvBase::getServiceName(const string& instanceName, |
| const string& defaultName) { |
| if (halServiceInstances_.find(instanceName) != halServiceInstances_.end()) { |
| return halServiceInstances_[instanceName]; |
| } |
| // Could not find the instance. |
| cerr << "Does not find service name for " << instanceName |
| << " using default name: " << defaultName << endl; |
| return defaultName; |
| } |
| |
| void VtsHalHidlTargetTestEnvBase::registerTestService(const string& FQName) { |
| registeredHalServices_.insert(FQName); |
| } |
| |
| void VtsHalHidlTargetTestEnvBase::listRegisteredServices() { |
| for (const string& service : registeredHalServices_) { |
| cout << "hal_service: " << service << endl; |
| } |
| cout << "service_comb_mode: " << mode_ << endl; |
| } |
| |
| bool VtsHalHidlTargetTestEnvBase::isValidInstance( |
| const string& halServiceInstance) { |
| ::android::FqInstance fqInstance; |
| return (fqInstance.setTo(halServiceInstance) && fqInstance.hasPackage() && |
| fqInstance.hasVersion() && fqInstance.hasInterface() && |
| fqInstance.hasInstance()); |
| } |
| |
| } // namespace testing |