summaryrefslogtreecommitdiff
path: root/init/test_utils/service_utils.cpp
diff options
context:
space:
mode:
authorDaniel Norman <danielnorman@google.com>2019-07-19 15:18:22 -0700
committerDaniel Norman <danielnorman@google.com>2019-07-31 11:33:47 -0700
commitd19c5a5076e111cdbf8197489b2dc0e2fee010bd (patch)
tree6a851d32bb8bf6b9777658ec391903142c9166ab /init/test_utils/service_utils.cpp
parent8082ba2f77372d3076779f108263ce8a677841a6 (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.cpp63
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