-- 5dc8d7504b7c11710b19365a6582c288c8992366 by Derek Mauro <dmauro@google.com>: Fix constexpr Span::last under MSVC and add Span constexpr tests. PiperOrigin-RevId: 237515952 -- 5ea8c146e653bbc49ff7e698699478242df7de35 by Derek Mauro <dmauro@google.com>: Implement Span::first and Span::last from C++20. https://github.com/abseil/abseil-cpp/pull/274 PiperOrigin-RevId: 237494399 -- 08db3417f1d8fe4556255d57a2f0df51b09bdd9a by Derek Mauro <dmauro@google.com>: HTTPS in more URLs. PiperOrigin-RevId: 237486823 -- 83ec63a7f8e47b62af619546f9f7b3bf72e74e86 by Derek Mauro <dmauro@google.com>: Changed HTTP URLs to HTTPS where possible. https://github.com/abseil/abseil-cpp/pull/270 PiperOrigin-RevId: 237445310 -- 220bf279c14cb31efa239500d1a70e0ac0c32e3c by Abseil Team <absl-team@google.com>: Support parsing decltype(nullptr) as a type. PiperOrigin-RevId: 237336739 -- ced234bbe78f5d495c3f6f6a9c2e0a95f7c080a5 by Gennadiy Rozental <rogeeff@google.com>: Introduce internal interface for setting environment variable value in scope PiperOrigin-RevId: 237275806 -- 1f1acb4e294af24d9f7598e85163d5e1d9958ae9 by Samuel Benzaquen <sbenza@google.com>: Avoid using aliases in the SFINAE expressions to make it more compatible with MSVC. Turn on the tests in MSVC. PiperOrigin-RevId: 237261456 -- 06cf7de6250a0572ef90fa1176f742ca0451ce71 by Derek Mauro <dmauro@google.com>: Fix unused variable warning. PiperOrigin-RevId: 237108006 GitOrigin-RevId: 5dc8d7504b7c11710b19365a6582c288c8992366 Change-Id: Ife5182c80942945c4e8700844c8febb482d6ad82pull/275/head
parent
c1cecb25a9
commit
88a152ae74
17 changed files with 371 additions and 141 deletions
@ -0,0 +1,79 @@ |
||||
// Copyright 2019 The Abseil Authors.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// https://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 "absl/base/internal/scoped_set_env.h" |
||||
|
||||
#ifdef _WIN32 |
||||
#include <windows.h> |
||||
#endif |
||||
|
||||
#include <cstdlib> |
||||
|
||||
#include "absl/base/internal/raw_logging.h" |
||||
|
||||
namespace absl { |
||||
namespace base_internal { |
||||
|
||||
namespace { |
||||
|
||||
#ifdef _WIN32 |
||||
const int kMaxEnvVarValueSize = 1024; |
||||
#endif |
||||
|
||||
void SetEnvVar(const char* name, const char* value) { |
||||
#ifdef _WIN32 |
||||
SetEnvironmentVariable(name, value); |
||||
#else |
||||
if (value == nullptr) { |
||||
::unsetenv(name); |
||||
} else { |
||||
::setenv(name, value, 1); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
} // namespace
|
||||
|
||||
ScopedSetEnv::ScopedSetEnv(const char* var_name, const char* new_value) |
||||
: var_name_(var_name), was_unset_(false) { |
||||
#ifdef _WIN32 |
||||
char buf[kMaxEnvVarValueSize]; |
||||
auto get_res = GetEnvironmentVariable(var_name_.c_str(), buf, sizeof(buf)); |
||||
ABSL_INTERNAL_CHECK(get_res < sizeof(buf), "value exceeds buffer size"); |
||||
|
||||
if (get_res == 0) { |
||||
was_unset_ = (GetLastError() == ERROR_ENVVAR_NOT_FOUND); |
||||
} else { |
||||
old_value_.assign(buf, get_res); |
||||
} |
||||
|
||||
SetEnvironmentVariable(var_name_.c_str(), new_value); |
||||
#else |
||||
const char* val = ::getenv(var_name_.c_str()); |
||||
if (val == nullptr) { |
||||
was_unset_ = true; |
||||
} else { |
||||
old_value_ = val; |
||||
} |
||||
#endif |
||||
|
||||
SetEnvVar(var_name_.c_str(), new_value); |
||||
} |
||||
|
||||
ScopedSetEnv::~ScopedSetEnv() { |
||||
SetEnvVar(var_name_.c_str(), was_unset_ ? nullptr : old_value_.c_str()); |
||||
} |
||||
|
||||
} // namespace base_internal
|
||||
} // namespace absl
|
@ -0,0 +1,41 @@ |
||||
//
|
||||
// Copyright 2019 The Abseil Authors.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// https://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.
|
||||
//
|
||||
|
||||
#ifndef ABSL_BASE_INTERNAL_SCOPED_SET_ENV_H_ |
||||
#define ABSL_BASE_INTERNAL_SCOPED_SET_ENV_H_ |
||||
|
||||
#include <string> |
||||
|
||||
namespace absl { |
||||
namespace base_internal { |
||||
|
||||
class ScopedSetEnv { |
||||
public: |
||||
ScopedSetEnv(const char* var_name, const char* new_value); |
||||
~ScopedSetEnv(); |
||||
|
||||
private: |
||||
std::string var_name_; |
||||
std::string old_value_; |
||||
|
||||
// True if the environment variable was initially not set.
|
||||
bool was_unset_; |
||||
}; |
||||
|
||||
} // namespace base_internal
|
||||
} // namespace absl
|
||||
|
||||
#endif // ABSL_BASE_INTERNAL_SCOPED_SET_ENV_H_
|
@ -0,0 +1,99 @@ |
||||
// Copyright 2019 The Abseil Authors.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// https://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.
|
||||
|
||||
#ifdef _WIN32 |
||||
#include <windows.h> |
||||
#endif |
||||
|
||||
#include "gtest/gtest.h" |
||||
#include "absl/base/internal/scoped_set_env.h" |
||||
|
||||
namespace { |
||||
|
||||
using absl::base_internal::ScopedSetEnv; |
||||
|
||||
std::string GetEnvVar(const char* name) { |
||||
#ifdef _WIN32 |
||||
char buf[1024]; |
||||
auto get_res = GetEnvironmentVariable(name, buf, sizeof(buf)); |
||||
if (get_res == sizeof(buf)) { |
||||
return "TOO_BIG"; |
||||
} |
||||
|
||||
if (get_res == 0) { |
||||
return "UNSET"; |
||||
} |
||||
|
||||
return std::string(buf, get_res); |
||||
#else |
||||
const char* val = ::getenv(name); |
||||
if (val == nullptr) { |
||||
return "UNSET"; |
||||
} |
||||
|
||||
return val; |
||||
#endif |
||||
} |
||||
|
||||
TEST(ScopedSetEnvTest, SetNonExistingVarToString) { |
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
|
||||
{ |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value"); |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value"); |
||||
} |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
} |
||||
|
||||
TEST(ScopedSetEnvTest, SetNonExistingVarToNull) { |
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
|
||||
{ |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", nullptr); |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
} |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
} |
||||
|
||||
TEST(ScopedSetEnvTest, SetExistingVarToString) { |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value"); |
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value"); |
||||
|
||||
{ |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "new_value"); |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "new_value"); |
||||
} |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value"); |
||||
} |
||||
|
||||
TEST(ScopedSetEnvTest, SetExistingVarToNull) { |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", "value"); |
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value"); |
||||
|
||||
{ |
||||
ScopedSetEnv scoped_set("SCOPED_SET_ENV_TEST_VAR", nullptr); |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "UNSET"); |
||||
} |
||||
|
||||
EXPECT_EQ(GetEnvVar("SCOPED_SET_ENV_TEST_VAR"), "value"); |
||||
} |
||||
|
||||
} // namespace
|
Loading…
Reference in new issue