diff options
author | Daniel Norman <danielnorman@google.com> | 2019-07-19 15:18:22 -0700 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2019-07-31 11:33:47 -0700 |
commit | d19c5a5076e111cdbf8197489b2dc0e2fee010bd (patch) | |
tree | 6a851d32bb8bf6b9777658ec391903142c9166ab /init/test_utils/service_utils.cpp | |
parent | 8082ba2f77372d3076779f108263ce8a677841a6 (diff) |
Adds a library to parse service info from init_rc files for use in tests.
Bug: 138114550
Test: used in vts_ibase_test
Change-Id: Ibadc2a76d6112b5778d3a282a1e05ffc74511623
Diffstat (limited to 'init/test_utils/service_utils.cpp')
-rw-r--r-- | init/test_utils/service_utils.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/init/test_utils/service_utils.cpp b/init/test_utils/service_utils.cpp new file mode 100644 index 000000000..bc0070268 --- /dev/null +++ b/init/test_utils/service_utils.cpp @@ -0,0 +1,63 @@ +// +// Copyright (C) 2019 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. +// + +#include <string> + +#include <android-base/logging.h> + +#include "../parser.h" +#include "../service.h" +#include "../service_list.h" +#include "../service_parser.h" +#include "include/init-test-utils/service_utils.h" + +namespace android { +namespace init { + +android::base::Result<ServiceInterfacesMap> GetOnDeviceServiceInterfacesMap() { + ServiceList& service_list = ServiceList::GetInstance(); + Parser parser; + parser.AddSectionParser("service", + std::make_unique<ServiceParser>(&service_list, nullptr, std::nullopt)); + for (const auto& location : { + "/init.rc", + "/system/etc/init", + "/system_ext/etc/init", + "/product/etc/init", + "/odm/etc/init", + "/vendor/etc/init", + }) { + parser.ParseConfig(location); + } + + ServiceInterfacesMap result; + for (const auto& service : service_list.services()) { + // Create an entry for all services, including services that may not + // have any declared interfaces. + result[service->name()] = std::set<android::FqInstance>(); + for (const auto& intf : service->interfaces()) { + android::FqInstance fqInstance; + if (!fqInstance.setTo(intf)) { + return android::base::Error() << "Unable to parse interface: '" << intf << "'"; + } + result[service->name()].insert(fqInstance); + } + } + return result; +} + +} // namespace init +} // namespace android |