diff --git a/core/base/src/TEnv.cxx b/core/base/src/TEnv.cxx index 418a9ea3db86b..6f7de65f3d150 100644 --- a/core/base/src/TEnv.cxx +++ b/core/base/src/TEnv.cxx @@ -701,7 +701,8 @@ void TEnv::SaveLevel(EEnvLevel level) sname += fRcName; rootrcdir = gSystem->PrependPathName(TROOT::GetEtcDir(), sname); } else if (level == kEnvUser) { - rootrcdir = gSystem->PrependPathName(GetUserDirectory(), fRcName); + TString sname = fRcName; + rootrcdir = gSystem->PrependPathName(GetUserDirectory(), sname); } else if (level == kEnvLocal) { rootrcdir = fRcName; } else { diff --git a/core/base/test/TEnvTests.cxx b/core/base/test/TEnvTests.cxx index 074898751c94a..0ef47d0616cc2 100644 --- a/core/base/test/TEnvTests.cxx +++ b/core/base/test/TEnvTests.cxx @@ -7,43 +7,76 @@ #include -TEST(TEnv, ROOTENV_USER_PATH) +class TEnvTest : public testing::Test { +protected: + TString fRcName; + TString fUserDir; + TString fUserConfig; + TString fLocalDir; + TString fLocalConfig; + + void SetUp() override + { + fRcName = "testenv"; + + // Create directories structure /local with user-level config in and local-level config + // in /local + + const auto uuid = TUUID::UUIDv4(); + + fUserDir = uuid.AsString(); + fUserConfig = fRcName; + gSystem->PrependPathName(fUserDir.Data(), fUserConfig); + + fLocalDir = "local"; + gSystem->PrependPathName(fUserDir, fLocalDir); + fLocalConfig = fRcName; + gSystem->PrependPathName(fLocalDir.Data(), fLocalConfig); + + fLocalDir.ReplaceAll("\\", "\\\\"); + ASSERT_EQ(0, gSystem->mkdir(fLocalDir.Data(), /*recursive=*/true)); + + gSystem->Setenv("ROOTENV_USER_PATH", fUserDir.Data()); + } + + void TearDown() override + { + gSystem->Unsetenv("ROOTENV_USER_PATH"); + + gSystem->Unlink((fLocalConfig + ".bak").Data()); + gSystem->Unlink(fLocalConfig.Data()); + gSystem->Unlink(fLocalDir.Data()); + gSystem->Unlink((fUserConfig + ".bak").Data()); + gSystem->Unlink(fUserConfig.Data()); + gSystem->Unlink(fUserDir.Data()); + } +}; + +TEST_F(TEnvTest, ROOTENV_USER_PATH) { - auto uuid = TUUID::UUIDv4(); - - // Create directories structure /local with user-level config in and local-level config - // in /local - const TString rcname = "testenv"; - const TString userDir = uuid.AsString(); - TString userConfig = rcname; - gSystem->PrependPathName(userDir.Data(), userConfig); - const TString userBak = userConfig + ".bak"; - TString localDir = "local"; - gSystem->PrependPathName(userDir, localDir); - TString localConfig = rcname; - gSystem->PrependPathName(localDir.Data(), localConfig); - TString homeConfig = rcname; + TString homeConfig = fRcName; gSystem->PrependPathName(gSystem->HomeDirectory(), homeConfig); - localDir.ReplaceAll("\\", "\\\\"); - ASSERT_EQ(0, gSystem->mkdir(localDir.Data(), /*recursive=*/true)); + // Initially, neither the local nor the user config file exist + EXPECT_TRUE(gSystem->AccessPathName(fLocalConfig.Data())); + EXPECT_TRUE(gSystem->AccessPathName(fUserConfig.Data())); - gSystem->Setenv("ROOTENV_USER_PATH", userDir.Data()); - EXPECT_TRUE(gSystem->AccessPathName(localConfig.Data())); - EXPECT_TRUE(gSystem->AccessPathName(userConfig.Data())); - - TEnv env("testenv"); + TEnv env(fRcName); env.SetValue("EnvRec"); EXPECT_EQ(1, env.GetValue("EnvRec", 0)); env.SaveLevel(kEnvUser); - EXPECT_TRUE(gSystem->AccessPathName(localConfig.Data())); - EXPECT_FALSE(gSystem->AccessPathName(userConfig.Data())); + // Now, the user config file should have been created in the custom directory + EXPECT_TRUE(gSystem->AccessPathName(fLocalConfig.Data())); + EXPECT_FALSE(gSystem->AccessPathName(fUserConfig.Data())); EXPECT_TRUE(gSystem->AccessPathName(homeConfig.Data())); - EXPECT_EQ(0, gSystem->Unlink(localDir.Data())); - EXPECT_EQ(0, gSystem->Unlink(userConfig.Data())); - EXPECT_EQ(0, gSystem->Unlink(userBak.Data())); - EXPECT_EQ(0, gSystem->Unlink(userDir.Data())); - gSystem->Unsetenv("ROOTENV_USER_PATH"); + TString pwd = gSystem->pwd(); + EXPECT_TRUE(gSystem->cd(fLocalDir.Data())); + env.SaveLevel(kEnvLocal); + EXPECT_TRUE(gSystem->cd(pwd.Data())); + + EXPECT_FALSE(gSystem->AccessPathName(fLocalConfig.Data())); + EXPECT_FALSE(gSystem->AccessPathName(fUserConfig.Data())); + EXPECT_TRUE(gSystem->AccessPathName(homeConfig.Data())); }