• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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