/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "gtest/gtest.h" #include "PostUpdateEnvironment.h" #include #include #include #include namespace { constexpr WCHAR kMarkerName[]{L"POST_UPDATE_ENVIRONMENT_TEST_MARKER"}; std::vector ReadEntries(LPVOID aBlock) { std::vector entries; LPCWSTR cursor{static_cast(aBlock)}; while (*cursor) { entries.emplace_back(cursor); cursor += entries.back().size() + 1; } return entries; } bool HasVariable(const std::vector& aEntries, std::wstring_view aName) { for (const std::wstring& entry : aEntries) { if (entry.size() > aName.size() && entry[aName.size()] == L'=' && _wcsnicmp(entry.c_str(), aName.data(), aName.size()) == 0) { return true; } } return false; } } // namespace class PostUpdateEnvironmentTest : public ::testing::Test { protected: void SetUp() override { ASSERT_TRUE(SetEnvironmentVariableW(kMarkerName, L"1")); } void TearDown() override { SetEnvironmentVariableW(kMarkerName, nullptr); } }; TEST_F(PostUpdateEnvironmentTest, UnelevatedUsesDefaultUserEnvironment) { PostUpdateEnvironment postUpdateEnvironment{ElevationType::None}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); std::vector entries{ReadEntries(postUpdateEnvironment.get())}; EXPECT_FALSE(entries.empty()); EXPECT_TRUE(HasVariable(entries, L"USERPROFILE")); } TEST_F(PostUpdateEnvironmentTest, UnelevatedDropsInheritedVariables) { PostUpdateEnvironment postUpdateEnvironment{ElevationType::None}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); EXPECT_FALSE( HasVariable(ReadEntries(postUpdateEnvironment.get()), kMarkerName)); } TEST_F(PostUpdateEnvironmentTest, ElevatedByMMSIsEmpty) { PostUpdateEnvironment postUpdateEnvironment{ElevationType::ElevatedByMMS}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); EXPECT_TRUE(ReadEntries(postUpdateEnvironment.get()).empty()); } TEST_F(PostUpdateEnvironmentTest, ElevatedWithoutMMSIsEmpty) { PostUpdateEnvironment postUpdateEnvironment{ ElevationType::ElevatedWithoutMMS}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); EXPECT_TRUE(ReadEntries(postUpdateEnvironment.get()).empty()); } TEST_F(PostUpdateEnvironmentTest, UnknownIsEmpty) { PostUpdateEnvironment postUpdateEnvironment{ElevationType::Unknown}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); EXPECT_TRUE(ReadEntries(postUpdateEnvironment.get()).empty()); } TEST_F(PostUpdateEnvironmentTest, ErrorIsEmpty) { PostUpdateEnvironment postUpdateEnvironment{ElevationType::Error}; ASSERT_NE(postUpdateEnvironment.get(), nullptr); EXPECT_TRUE(ReadEntries(postUpdateEnvironment.get()).empty()); }