1 //
2 // Copyright (C) 2023 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15
16 #include <string>
17 #include <unordered_map>
18 #include <vector>
19
20 #include <gtest/gtest.h>
21
22 #include "common/libs/utils/environment.h"
23 #include "common/libs/utils/files.h"
24 #include "common/libs/utils/result.h"
25 #include "host/commands/cvd/server_command/host_tool_target_manager.h"
26
27 namespace cuttlefish {
28
TEST(HostToolTarget,KnownFlags)29 TEST(HostToolTarget, KnownFlags) {
30 std::string android_host_out = StringFromEnv("ANDROID_HOST_OUT", "");
31 if (android_host_out.empty()) {
32 GTEST_SKIP() << "Set ANDROID_HOST_OUT";
33 }
34 std::unordered_map<std::string, std::vector<std::string>> ops_to_op_impl_map{
35 {"start", std::vector<std::string>{"cvd_internal_start", "launch_cvd"}}};
36
37 auto host_tool_target =
38 HostToolTarget::Create(android_host_out, ops_to_op_impl_map);
39 ASSERT_TRUE(host_tool_target.ok()) << host_tool_target.error().Trace();
40
41 auto daemon_flag =
42 host_tool_target->GetFlagInfo(HostToolTarget::FlagInfoRequest{
43 .operation_ = "start",
44 .flag_name_ = "daemon",
45 });
46
47 auto bad_flag = host_tool_target->GetFlagInfo(HostToolTarget::FlagInfoRequest{
48 .operation_ = "start",
49 .flag_name_ = "@never_exist@",
50 });
51
52 ASSERT_TRUE(daemon_flag.ok()) << daemon_flag.error().Trace();
53 ASSERT_EQ(daemon_flag->Name(), "daemon");
54 ASSERT_TRUE(daemon_flag->Type() == "string" || daemon_flag->Type() == "bool");
55 ASSERT_FALSE(bad_flag.ok());
56 }
57
CreateManagerComponent()58 fruit::Component<HostToolTargetManager> CreateManagerComponent() {
59 return fruit::createComponent()
60 .install(HostToolTargetManagerComponent)
61 .install(OperationToBinsMapComponent);
62 }
63
TEST(HostToolManager,KnownFlags)64 TEST(HostToolManager, KnownFlags) {
65 std::string android_host_out = StringFromEnv("ANDROID_HOST_OUT", "");
66 if (android_host_out.empty()) {
67 GTEST_SKIP() << "Set ANDROID_HOST_OUT";
68 }
69 fruit::Injector<HostToolTargetManager> injector(CreateManagerComponent);
70 HostToolTargetManager& host_tool_manager =
71 injector.get<HostToolTargetManager&>();
72
73 auto daemon_flag =
74 host_tool_manager.ReadFlag({.artifacts_path = android_host_out,
75 .op = "start",
76 .flag_name = "daemon"});
77 auto bad_flag =
78 host_tool_manager.ReadFlag({.artifacts_path = android_host_out,
79 .op = "start",
80 .flag_name = "@never_exist@"});
81
82 ASSERT_TRUE(daemon_flag.ok()) << daemon_flag.error().Trace();
83 ASSERT_EQ(daemon_flag->Name(), "daemon");
84 ASSERT_TRUE(daemon_flag->Type() == "string" || daemon_flag->Type() == "bool");
85 ASSERT_FALSE(bad_flag.ok());
86 }
87
TEST(HostToolManager,KnownBins)88 TEST(HostToolManager, KnownBins) {
89 std::string android_host_out = StringFromEnv("ANDROID_HOST_OUT", "");
90 if (android_host_out.empty()) {
91 GTEST_SKIP() << "Set ANDROID_HOST_OUT";
92 }
93 fruit::Injector<HostToolTargetManager> injector(CreateManagerComponent);
94 HostToolTargetManager& host_tool_manager =
95 injector.get<HostToolTargetManager&>();
96
97 auto start_bin = host_tool_manager.ExecBaseName(
98 {.artifacts_path = android_host_out, .op = "start"});
99 auto stop_bin = host_tool_manager.ExecBaseName(
100 {.artifacts_path = android_host_out, .op = "stop"});
101 auto bad_bin = host_tool_manager.ExecBaseName(
102 {.artifacts_path = android_host_out, .op = "bad"});
103
104 ASSERT_TRUE(start_bin.ok()) << start_bin.error().Trace();
105 ASSERT_TRUE(stop_bin.ok()) << stop_bin.error().Trace();
106 ASSERT_FALSE(bad_bin.ok()) << "bad_bin should be CF_ERR but is " << *bad_bin;
107 ASSERT_TRUE(*start_bin == "cvd_internal_start" || *start_bin == "launch_cvd")
108 << "start_bin was " << *start_bin;
109 ASSERT_TRUE(*stop_bin == "cvd_internal_stop" || *stop_bin == "stop_cvd")
110 << "stop_bin was " << *stop_bin;
111 }
112
113 } // namespace cuttlefish
114