Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion core/base/src/TEnv.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
91 changes: 62 additions & 29 deletions core/base/test/TEnvTests.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -7,43 +7,76 @@

#include <string>

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 <UUID>/local with user-level config in <UUID> and local-level config
// in <UUID>/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 <UUID>/local with user-level config in <UUID> and local-level config
// in <UUID>/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()));
}
Loading