From 65f22dc3787447c0c4e21efa979e729f7d45517c Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Wed, 8 Jul 2026 13:41:10 +0200 Subject: [PATCH 1/2] [core] make test fixture for TEnv unit tests --- core/base/test/TEnvTests.cxx | 84 +++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/core/base/test/TEnvTests.cxx b/core/base/test/TEnvTests.cxx index 074898751c94a..f1eeea6e612bc 100644 --- a/core/base/test/TEnvTests.cxx +++ b/core/base/test/TEnvTests.cxx @@ -7,43 +7,67 @@ #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)); - - gSystem->Setenv("ROOTENV_USER_PATH", userDir.Data()); - EXPECT_TRUE(gSystem->AccessPathName(localConfig.Data())); - EXPECT_TRUE(gSystem->AccessPathName(userConfig.Data())); + // Initially, neither the local nor the user config file exist + EXPECT_TRUE(gSystem->AccessPathName(fLocalConfig.Data())); + EXPECT_TRUE(gSystem->AccessPathName(fUserConfig.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"); } From 8801173a78545c1926127fe11391ae21c1ebfab0 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Wed, 8 Jul 2026 14:12:53 +0200 Subject: [PATCH 2/2] [core] fix up saving TEnv to custom user directory The previous fix for this made incorrect use of the PrependPathName() API. Fixing. --- core/base/src/TEnv.cxx | 3 ++- core/base/test/TEnvTests.cxx | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) 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 f1eeea6e612bc..0ef47d0616cc2 100644 --- a/core/base/test/TEnvTests.cxx +++ b/core/base/test/TEnvTests.cxx @@ -70,4 +70,13 @@ TEST_F(TEnvTest, ROOTENV_USER_PATH) EXPECT_TRUE(gSystem->AccessPathName(fLocalConfig.Data())); EXPECT_FALSE(gSystem->AccessPathName(fUserConfig.Data())); EXPECT_TRUE(gSystem->AccessPathName(homeConfig.Data())); + + 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())); }