1
// TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015-2018, 2021, 2023 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include "StringUtils.h"
23 #include "PathUtils.h"
24 #include "DirFileEnum.h"
34 static bool GetResourcesDir(CString
& resourcesDir
)
36 resourcesDir
= CPathUtils::GetAppDirectory() + L
"\\resources";
37 if (!PathIsDirectory(resourcesDir
))
38 resourcesDir
= CPathUtils::GetAppDirectory() + L
"\\..\\..\\..\\test\\UnitTests\\resources";
39 return PathIsDirectory(resourcesDir
) != FALSE
;
42 static void CopyRecursively(const CString
& source
, const CString
& dest
)
44 CDirFileEnum
finder(source
);
45 while (auto file
= finder
.NextFile())
47 CString filepath
= file
->GetFilePath();
48 CString relpath
= filepath
.Mid(source
.GetLength());
49 if (file
->IsDirectory())
50 EXPECT_TRUE(CreateDirectory(dest
+ relpath
, nullptr));
52 EXPECT_TRUE(CopyFile(filepath
, dest
+ relpath
, false));
56 class CBasicGitFixture
: public ::testing::TestWithParam
<config
>
59 virtual void SetUp() override
64 m_Git
.m_IsUseLibGit2
= true;
65 m_Git
.m_IsUseLibGit2_mask
= 0xffffffff;
66 m_Git
.m_IsUseGitDLL
= false;
69 m_Git
.m_IsUseLibGit2
= true;
70 m_Git
.m_IsUseLibGit2_mask
= DEFAULT_USE_LIBGIT2_MASK
;
71 m_Git
.m_IsUseGitDLL
= false;
74 m_Git
.m_IsUseLibGit2
= false;
75 m_Git
.m_IsUseLibGit2_mask
= 0;
76 m_Git
.m_IsUseGitDLL
= true;
79 m_Git
.m_IsUseLibGit2
= false;
80 m_Git
.m_IsUseLibGit2_mask
= 0;
81 m_Git
.m_IsUseGitDLL
= false;
83 m_Git
.m_CurrentDir
= m_Dir
.GetTempDir();
84 // some methods rely on g_Git, so set values there as well
85 g_Git
.m_IsGitDllInited
= false;
86 g_Git
.m_CurrentDir
= m_Git
.m_CurrentDir
;
87 g_Git
.m_IsUseGitDLL
= m_Git
.m_IsUseGitDLL
;
88 g_Git
.m_IsUseLibGit2
= m_Git
.m_IsUseLibGit2
;
89 g_Git
.m_IsUseLibGit2_mask
= m_Git
.m_IsUseLibGit2_mask
;
90 // libgit relies on CWD being set to working tree
91 SetCurrentDirectory(m_Git
.m_CurrentDir
);
93 if (CGit::ms_LastMsysGitVersion
== 0)
94 CGit::ms_LastMsysGitVersion
= max(0, m_Git
.GetGitVersion(nullptr, nullptr));
97 virtual void TearDown() override
99 SetCurrentDirectory(CPathUtils::GetAppDirectory());
107 class CBasicGitWithTestRepoCreatorFixture
: public CBasicGitFixture
110 CBasicGitWithTestRepoCreatorFixture(const CString
& arepo
= L
"git-repo1")
116 void SetUpTestRepo(CString path
)
118 CString resourcesDir
;
119 ASSERT_TRUE(GetResourcesDir(resourcesDir
));
120 CPathUtils::TrimTrailingPathDelimiter(path
);
121 CreateDirectory(path
, nullptr);
122 ASSERT_TRUE(PathIsDirectory(path
));
123 if (!prefix
.IsEmpty())
124 EXPECT_TRUE(CreateDirectory(path
+ prefix
, nullptr));
125 CString repoDir
= resourcesDir
+ L
"\\" + m_reponame
;
126 CopyRecursively(repoDir
, path
+ prefix
);
127 CString configFile
= path
+ prefix
+ L
"\\config";
129 ASSERT_TRUE(CStringUtils::ReadStringFromTextFile(configFile
, text
));
130 text
+= L
"\n[core]\n autocrlf = false\n[user]\n name = User\n email = user@example.com\n";
131 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(configFile
, text
));
134 virtual void SetUp() override
136 CBasicGitFixture::SetUp();
144 class CBasicGitWithTestRepoFixture
: public CBasicGitWithTestRepoCreatorFixture
147 CBasicGitWithTestRepoFixture() : CBasicGitWithTestRepoCreatorFixture() {};
148 CBasicGitWithTestRepoFixture(const CString
& arepo
) : CBasicGitWithTestRepoCreatorFixture(arepo
) {};
149 virtual void SetUp() override
151 CBasicGitWithTestRepoCreatorFixture::SetUp();
152 SetUpTestRepo(m_Dir
.GetTempDir());
156 class CBasicGitWithTestRepoBareFixture
: public CBasicGitWithTestRepoFixture
159 CBasicGitWithTestRepoBareFixture() : CBasicGitWithTestRepoFixture() {};
160 CBasicGitWithTestRepoBareFixture(const CString
& arepo
) : CBasicGitWithTestRepoFixture(arepo
) {};
163 virtual void SetUp() override
166 CBasicGitWithTestRepoFixture::SetUp();
168 DeleteFile(m_Dir
.GetTempDir() + L
"\\index");
169 CString configFile
= m_Dir
.GetTempDir() + L
"\\config";
171 ASSERT_TRUE(CStringUtils::ReadStringFromTextFile(configFile
, text
));
172 EXPECT_EQ(1, text
.Replace(L
"bare = false", L
"bare = true"));
173 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(configFile
, text
));
177 class CBasicGitWithSubmoduleRepositoryFixture
: public CBasicGitWithTestRepoFixture
180 CBasicGitWithSubmoduleRepositoryFixture() : CBasicGitWithTestRepoFixture(L
"git-submodules-repo") {};
183 class CBasicGitWithSubmodulRepoeBareFixture
: public CBasicGitWithTestRepoBareFixture
186 CBasicGitWithSubmodulRepoeBareFixture() : CBasicGitWithTestRepoBareFixture(L
"git-submodules-repo") {};
189 class CBasicGitWithEmptyRepositoryFixture
: public CBasicGitFixture
192 virtual void SetUp() override
194 CBasicGitFixture::SetUp();
196 EXPECT_EQ(0, m_Git
.Run(L
"git.exe init", &output
, CP_UTF8
));
197 EXPECT_STRNE(L
"", output
);
199 EXPECT_EQ(0, m_Git
.Run(L
"git.exe config core.autocrlf false", &output
, CP_UTF8
));
200 EXPECT_STREQ(L
"", output
);
202 EXPECT_EQ(0, m_Git
.Run(L
"git.exe config user.name User", &output
, CP_UTF8
));
203 EXPECT_STREQ(L
"", output
);
205 EXPECT_EQ(0, m_Git
.Run(L
"git.exe config user.email user@example.com", &output
, CP_UTF8
));
206 EXPECT_STREQ(L
"", output
);
210 class CBasicGitWithEmptyBareRepositoryFixture
: public CBasicGitFixture
213 virtual void SetUp() override
215 CBasicGitFixture::SetUp();
217 EXPECT_EQ(0, m_Git
.Run(L
"git.exe init --bare", &output
, CP_UTF8
));
218 EXPECT_STRNE(L
"", output
);