Skip to content

Commit 276a926

Browse files
committed
Add const char* and std::string_view overloads for StringFromEnv
Assisted-by: Antigravity:Gemini Next Bug: b/507161864
1 parent c1b3de7 commit 276a926

4 files changed

Lines changed: 155 additions & 4 deletions

File tree

base/cvd/cuttlefish/common/libs/utils/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ cf_cc_library(
9696
],
9797
)
9898

99+
cf_cc_test(
100+
name = "environment_test",
101+
srcs = ["environment_test.cpp"],
102+
deps = [
103+
":environment",
104+
"@abseil-cpp//absl/cleanup",
105+
],
106+
)
107+
99108
cf_cc_library(
100109
name = "files",
101110
srcs = ["files.cpp"],

base/cvd/cuttlefish/common/libs/utils/environment.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,37 @@
1818

1919
#include <cstdlib>
2020
#include <string>
21+
#include <string_view>
2122

2223
namespace cuttlefish {
2324

24-
std::optional<std::string> StringFromEnv(const std::string& varname) {
25-
26-
const char* const valstr = getenv(varname.c_str());
25+
std::optional<std::string> StringFromEnv(const char* varname) {
26+
const char* const valstr = getenv(varname);
2727
if (!valstr) {
2828
return std::nullopt;
2929
}
3030
return valstr;
3131
}
3232

33+
std::optional<std::string> StringFromEnv(const std::string& varname) {
34+
return StringFromEnv(varname.c_str());
35+
}
36+
37+
std::optional<std::string> StringFromEnv(std::string_view varname) {
38+
return StringFromEnv(std::string(varname).c_str());
39+
}
40+
41+
std::string StringFromEnv(const char* varname, const std::string& defval) {
42+
return StringFromEnv(varname).value_or(defval);
43+
}
44+
3345
std::string StringFromEnv(const std::string& varname,
3446
const std::string& defval) {
35-
return StringFromEnv(varname).value_or(defval);
47+
return StringFromEnv(varname.c_str(), defval);
48+
}
49+
50+
std::string StringFromEnv(std::string_view varname, const std::string& defval) {
51+
return StringFromEnv(std::string(varname).c_str(), defval);
3652
}
3753

3854
} // namespace cuttlefish

base/cvd/cuttlefish/common/libs/utils/environment.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717

1818
#include <optional>
1919
#include <string>
20+
#include <string_view>
2021

2122
namespace cuttlefish {
2223

2324
std::optional<std::string> StringFromEnv(const std::string& varname);
25+
std::optional<std::string> StringFromEnv(const char* varname);
26+
std::optional<std::string> StringFromEnv(std::string_view varname);
2427

2528
std::string StringFromEnv(const std::string& varname,
2629
const std::string& defval);
30+
std::string StringFromEnv(const char* varname, const std::string& defval);
31+
std::string StringFromEnv(std::string_view varname, const std::string& defval);
2732

2833
} // namespace cuttlefish
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
* Copyright (C) 2026 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+
17+
#include "cuttlefish/common/libs/utils/environment.h"
18+
19+
#include <cstdlib>
20+
#include <string>
21+
#include <string_view>
22+
23+
#include <gtest/gtest.h>
24+
#include "absl/cleanup/cleanup.h"
25+
26+
namespace cuttlefish {
27+
28+
TEST(EnvironmentTest, StringFromEnvString) {
29+
const std::string env_name = "TEST_ENV_VAR_STRING";
30+
const std::string env_value = "test_value";
31+
32+
setenv(env_name.c_str(), env_value.c_str(), 1);
33+
absl::Cleanup cleanup = [&env_name]() { unsetenv(env_name.c_str()); };
34+
35+
std::optional<std::string> result = StringFromEnv(env_name);
36+
ASSERT_TRUE(result.has_value());
37+
EXPECT_EQ(*result, env_value);
38+
}
39+
40+
TEST(EnvironmentTest, StringFromEnvStringDefault) {
41+
const std::string env_name = "TEST_ENV_VAR_STRING_DEFAULT";
42+
const std::string env_value = "test_value";
43+
const std::string def_value = "default_value";
44+
45+
setenv(env_name.c_str(), env_value.c_str(), 1);
46+
absl::Cleanup cleanup = [&env_name]() { unsetenv(env_name.c_str()); };
47+
48+
EXPECT_EQ(StringFromEnv(env_name, def_value), env_value);
49+
}
50+
51+
TEST(EnvironmentTest, StringFromEnvStringDefaultFallback) {
52+
const std::string env_name = "TEST_ENV_VAR_STRING_DEFAULT_FALLBACK";
53+
const std::string def_value = "default_value";
54+
55+
EXPECT_EQ(StringFromEnv(env_name, def_value), def_value);
56+
}
57+
58+
TEST(EnvironmentTest, StringFromEnvCharPtr) {
59+
const char* env_name = "TEST_ENV_VAR_CHAR_PTR";
60+
const char* env_value = "test_value";
61+
62+
setenv(env_name, env_value, 1);
63+
absl::Cleanup cleanup = [env_name]() { unsetenv(env_name); };
64+
65+
std::optional<std::string> result = StringFromEnv(env_name);
66+
ASSERT_TRUE(result.has_value());
67+
EXPECT_EQ(*result, env_value);
68+
}
69+
70+
TEST(EnvironmentTest, StringFromEnvCharPtrDefault) {
71+
const char* env_name = "TEST_ENV_VAR_CHAR_PTR_DEFAULT";
72+
const char* env_value = "test_value";
73+
const std::string def_value = "default_value";
74+
75+
setenv(env_name, env_value, 1);
76+
absl::Cleanup cleanup = [env_name]() { unsetenv(env_name); };
77+
78+
EXPECT_EQ(StringFromEnv(env_name, def_value), env_value);
79+
}
80+
81+
TEST(EnvironmentTest, StringFromEnvCharPtrDefaultFallback) {
82+
const char* env_name = "TEST_ENV_VAR_CHAR_PTR_DEFAULT_FALLBACK";
83+
const std::string def_value = "default_value";
84+
85+
EXPECT_EQ(StringFromEnv(env_name, def_value), def_value);
86+
}
87+
88+
TEST(EnvironmentTest, StringFromEnvStringView) {
89+
const std::string env_name_str = "TEST_ENV_VAR_STRING_VIEW";
90+
const std::string env_value = "test_value";
91+
std::string_view env_name = env_name_str;
92+
93+
setenv(env_name_str.c_str(), env_value.c_str(), 1);
94+
absl::Cleanup cleanup = [&env_name_str]() { unsetenv(env_name_str.c_str()); };
95+
96+
std::optional<std::string> result = StringFromEnv(env_name);
97+
ASSERT_TRUE(result.has_value());
98+
EXPECT_EQ(*result, env_value);
99+
}
100+
101+
TEST(EnvironmentTest, StringFromEnvStringViewDefault) {
102+
const std::string env_name_str = "TEST_ENV_VAR_STRING_VIEW_DEFAULT";
103+
const std::string env_value = "test_value";
104+
const std::string def_value = "default_value";
105+
std::string_view env_name = env_name_str;
106+
107+
setenv(env_name_str.c_str(), env_value.c_str(), 1);
108+
absl::Cleanup cleanup = [&env_name_str]() { unsetenv(env_name_str.c_str()); };
109+
110+
EXPECT_EQ(StringFromEnv(env_name, def_value), env_value);
111+
}
112+
113+
TEST(EnvironmentTest, StringFromEnvStringViewDefaultFallback) {
114+
const std::string env_name_str = "TEST_ENV_VAR_STRING_VIEW_DEFAULT_FALLBACK";
115+
const std::string def_value = "default_value";
116+
std::string_view env_name = env_name_str;
117+
118+
EXPECT_EQ(StringFromEnv(env_name, def_value), def_value);
119+
}
120+
121+
} // namespace cuttlefish

0 commit comments

Comments
 (0)