]>
Commit | Line | Data |
---|---|---|
d4b5a4e2 VM |
1 | /* |
2 | * This file is free software; you can redistribute it and/or modify | |
3 | * it under the terms of the GNU General Public License, version 2, | |
4 | * as published by the Free Software Foundation. | |
5 | * | |
6 | * In addition to the permissions in the GNU General Public License, | |
7 | * the authors give you unlimited permission to link the compiled | |
8 | * version of this file into combinations with other programs, | |
9 | * and to distribute those combinations without any restriction | |
10 | * coming from the use of this file. (The General Public License | |
11 | * restrictions do apply in other respects; for example, they cover | |
12 | * modification of the file, and distribution when not linked into | |
13 | * a combined executable.) | |
14 | * | |
15 | * This file is distributed in the hope that it will be useful, but | |
16 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 | * General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; see the file COPYING. If not, write to | |
22 | * the Free Software Foundation, 51 Franklin Street, Fifth Floor, | |
23 | * Boston, MA 02110-1301, USA. | |
24 | */ | |
25 | #include "test_lib.h" | |
26 | #include "test_helpers.h" | |
27 | ||
28 | #include "odb.h" | |
29 | #include "git2/odb_backend.h" | |
705a90ec | 30 | #include "repository.h" |
d4b5a4e2 VM |
31 | |
32 | typedef struct { | |
33 | git_odb_backend base; | |
34 | int position; | |
35 | } fake_backend; | |
36 | ||
37 | git_odb_backend *new_backend(int position) | |
38 | { | |
39 | fake_backend *b; | |
40 | ||
41 | b = git__malloc(sizeof(fake_backend)); | |
42 | if (b == NULL) | |
43 | return NULL; | |
44 | ||
45 | memset(b, 0x0, sizeof(fake_backend)); | |
46 | b->position = position; | |
47 | return (git_odb_backend *)b; | |
48 | } | |
49 | ||
50 | int test_backend_sorting(git_odb *odb) | |
51 | { | |
52 | unsigned int i; | |
53 | ||
54 | for (i = 0; i < odb->backends.length; ++i) { | |
55 | fake_backend *internal = *((fake_backend **)git_vector_get(&odb->backends, i)); | |
56 | ||
57 | if (internal == NULL) | |
58 | return GIT_ERROR; | |
59 | ||
60 | if (internal->position != (int)i) | |
61 | return GIT_ERROR; | |
62 | } | |
63 | ||
64 | return GIT_SUCCESS; | |
65 | } | |
66 | ||
3dccfed1 | 67 | BEGIN_TEST(odb0, "assure that ODB backends are properly sorted") |
d4b5a4e2 VM |
68 | git_odb *odb; |
69 | must_pass(git_odb_new(&odb)); | |
70 | must_pass(git_odb_add_backend(odb, new_backend(0), 5)); | |
71 | must_pass(git_odb_add_backend(odb, new_backend(2), 3)); | |
72 | must_pass(git_odb_add_backend(odb, new_backend(1), 4)); | |
73 | must_pass(git_odb_add_backend(odb, new_backend(3), 1)); | |
74 | must_pass(test_backend_sorting(odb)); | |
75 | git_odb_close(odb); | |
76 | END_TEST | |
77 | ||
3dccfed1 | 78 | BEGIN_TEST(odb1, "assure that alternate backends are properly sorted") |
d4b5a4e2 VM |
79 | git_odb *odb; |
80 | must_pass(git_odb_new(&odb)); | |
81 | must_pass(git_odb_add_backend(odb, new_backend(0), 5)); | |
82 | must_pass(git_odb_add_backend(odb, new_backend(2), 3)); | |
83 | must_pass(git_odb_add_backend(odb, new_backend(1), 4)); | |
84 | must_pass(git_odb_add_backend(odb, new_backend(3), 1)); | |
85 | must_pass(git_odb_add_alternate(odb, new_backend(4), 5)); | |
86 | must_pass(git_odb_add_alternate(odb, new_backend(6), 3)); | |
87 | must_pass(git_odb_add_alternate(odb, new_backend(5), 4)); | |
88 | must_pass(git_odb_add_alternate(odb, new_backend(7), 1)); | |
89 | must_pass(test_backend_sorting(odb)); | |
90 | git_odb_close(odb); | |
91 | END_TEST | |
92 | ||
705a90ec | 93 | |
94 | #define STANDARD_REPOSITORY 0 | |
95 | #define BARE_REPOSITORY 1 | |
96 | ||
3dccfed1 VM |
97 | static int ensure_repository_init( |
98 | const char *working_directory, | |
99 | int repository_kind, | |
100 | const char *expected_path_index, | |
101 | const char *expected_path_repository, | |
102 | const char *expected_working_directory) | |
705a90ec | 103 | { |
104 | char path_odb[GIT_PATH_MAX]; | |
105 | git_repository *repo; | |
106 | ||
3dccfed1 VM |
107 | if (gitfo_isdir(working_directory) == GIT_SUCCESS) |
108 | return GIT_ERROR; | |
705a90ec | 109 | |
110 | git__joinpath(path_odb, expected_path_repository, GIT_OBJECTS_DIR); | |
111 | ||
3dccfed1 VM |
112 | if (git_repository_init(&repo, working_directory, repository_kind) < GIT_SUCCESS) |
113 | return GIT_ERROR; | |
114 | ||
115 | if (repo->path_workdir != NULL || expected_working_directory != NULL) { | |
c90292ce | 116 | if (git__suffixcmp(repo->path_workdir, expected_working_directory) != 0) |
45314a7e | 117 | goto cleanup; |
3dccfed1 VM |
118 | } |
119 | ||
c90292ce | 120 | if (git__suffixcmp(repo->path_odb, path_odb) != 0) |
45314a7e | 121 | goto cleanup; |
3dccfed1 | 122 | |
c90292ce | 123 | if (git__suffixcmp(repo->path_repository, expected_path_repository) != 0) |
45314a7e | 124 | goto cleanup; |
3dccfed1 VM |
125 | |
126 | if (repo->path_index != NULL || expected_path_index != NULL) { | |
c90292ce | 127 | if (git__suffixcmp(repo->path_index, expected_path_index) != 0) |
45314a7e | 128 | goto cleanup; |
3dccfed1 | 129 | } |
705a90ec | 130 | |
131 | git_repository_free(repo); | |
3dccfed1 VM |
132 | rmdir_recurs(working_directory); |
133 | ||
134 | return GIT_SUCCESS; | |
45314a7e TC |
135 | |
136 | cleanup: | |
137 | git_repository_free(repo); | |
138 | rmdir_recurs(working_directory); | |
139 | return GIT_ERROR; | |
705a90ec | 140 | } |
141 | ||
3dccfed1 | 142 | BEGIN_TEST(init0, "initialize a standard repo") |
705a90ec | 143 | char path_index[GIT_PATH_MAX], path_repository[GIT_PATH_MAX]; |
144 | ||
3dccfed1 | 145 | git__joinpath(path_repository, TEMP_REPO_FOLDER, GIT_DIR); |
705a90ec | 146 | git__joinpath(path_index, path_repository, GIT_INDEX_FILE); |
147 | ||
45314a7e TC |
148 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); |
149 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, STANDARD_REPOSITORY, path_index, path_repository, TEMP_REPO_FOLDER)); | |
705a90ec | 150 | END_TEST |
151 | ||
3dccfed1 | 152 | BEGIN_TEST(init1, "initialize a bare repo") |
705a90ec | 153 | char path_repository[GIT_PATH_MAX]; |
154 | ||
3dccfed1 | 155 | git__joinpath(path_repository, TEMP_REPO_FOLDER, ""); |
705a90ec | 156 | |
45314a7e TC |
157 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER, BARE_REPOSITORY, NULL, path_repository, NULL)); |
158 | must_pass(ensure_repository_init(TEMP_REPO_FOLDER_NS, BARE_REPOSITORY, NULL, path_repository, NULL)); | |
705a90ec | 159 | END_TEST |
160 | ||
ba1bdf86 | 161 | BEGIN_TEST(init2, "Initialize and open a bare repo with a relative path escaping out of the current working directory") |
677a3c07 | 162 | char path_repository[GIT_PATH_MAX]; |
163 | char current_workdir[GIT_PATH_MAX]; | |
164 | const int mode = 0755; /* or 0777 ? */ | |
165 | git_repository* repo; | |
166 | ||
167 | must_pass(gitfo_getcwd(current_workdir, sizeof(current_workdir))); | |
168 | ||
c90292ce | 169 | git__joinpath(path_repository, TEMP_REPO_FOLDER, "a/b/c/"); |
677a3c07 | 170 | must_pass(gitfo_mkdir_recurs(path_repository, mode)); |
171 | ||
172 | must_pass(chdir(path_repository)); | |
173 | ||
174 | must_pass(git_repository_init(&repo, "../d/e.git", 1)); | |
c90292ce | 175 | must_pass(git__suffixcmp(repo->path_repository, "/a/b/d/e.git/")); |
176 | ||
677a3c07 | 177 | git_repository_free(repo); |
178 | ||
ba1bdf86 | 179 | must_pass(git_repository_open(&repo, "../d/e.git")); |
180 | ||
181 | git_repository_free(repo); | |
182 | ||
183 | must_pass(chdir(current_workdir)); | |
184 | rmdir_recurs(TEMP_REPO_FOLDER); | |
185 | END_TEST | |
186 | ||
2ce44b67 | 187 | #define EMPTY_BARE_REPOSITORY_NAME "empty_bare.git" |
188 | #define EMPTY_BARE_REPOSITORY_FOLDER TEST_RESOURCES "/" EMPTY_BARE_REPOSITORY_NAME "/" | |
189 | ||
190 | BEGIN_TEST(open0, "Open a bare repository that has just been initialized by git") | |
191 | git_repository *repo; | |
192 | ||
193 | must_pass(copydir_recurs(EMPTY_BARE_REPOSITORY_FOLDER, TEMP_REPO_FOLDER)); | |
194 | must_pass(remove_placeholders(TEMP_REPO_FOLDER, "dummy-marker.txt")); | |
195 | ||
196 | must_pass(git_repository_open(&repo, TEMP_REPO_FOLDER)); | |
4a34b3a9 | 197 | must_be_true(git_repository_path(repo) != NULL); |
198 | must_be_true(git_repository_workdir(repo) == NULL); | |
2ce44b67 | 199 | |
200 | git_repository_free(repo); | |
201 | must_pass(rmdir_recurs(TEMP_REPO_FOLDER)); | |
202 | END_TEST | |
203 | ||
a8375f53 | 204 | #define SOURCE_EMPTY_REPOSITORY_NAME "empty_standard_repo/.gitted" |
205 | #define EMPTY_REPOSITORY_NAME "empty_standard_repo/.git" | |
206 | #define EMPTY_REPOSITORY_FOLDER TEST_RESOURCES "/" SOURCE_EMPTY_REPOSITORY_NAME "/" | |
207 | #define DEST_REPOSITORY_FOLDER TEMP_REPO_FOLDER DOT_GIT "/" | |
208 | ||
209 | BEGIN_TEST(open1, "Open a standard repository that has just been initialized by git") | |
210 | git_repository *repo; | |
211 | ||
212 | must_pass(copydir_recurs(EMPTY_REPOSITORY_FOLDER, DEST_REPOSITORY_FOLDER)); | |
213 | must_pass(remove_placeholders(DEST_REPOSITORY_FOLDER, "dummy-marker.txt")); | |
214 | ||
215 | must_pass(git_repository_open(&repo, DEST_REPOSITORY_FOLDER)); | |
4a34b3a9 | 216 | must_be_true(git_repository_path(repo) != NULL); |
217 | must_be_true(git_repository_workdir(repo) != NULL); | |
a8375f53 | 218 | |
219 | git_repository_free(repo); | |
220 | must_pass(rmdir_recurs(TEMP_REPO_FOLDER)); | |
221 | END_TEST | |
222 | ||
223 | ||
ba1bdf86 | 224 | BEGIN_TEST(open2, "Open a bare repository with a relative path escaping out of the current working directory") |
225 | char new_current_workdir[GIT_PATH_MAX]; | |
226 | char current_workdir[GIT_PATH_MAX]; | |
227 | char path_repository[GIT_PATH_MAX]; | |
228 | ||
229 | const int mode = 0755; /* or 0777 ? */ | |
230 | git_repository* repo; | |
231 | ||
232 | /* Setup the repository to open */ | |
233 | must_pass(gitfo_getcwd(current_workdir, sizeof(current_workdir))); | |
234 | strcpy(path_repository, current_workdir); | |
235 | git__joinpath_n(path_repository, 3, path_repository, TEMP_REPO_FOLDER, "a/d/e.git"); | |
ba1bdf86 | 236 | must_pass(copydir_recurs(REPOSITORY_FOLDER, path_repository)); |
237 | ||
238 | /* Change the current working directory */ | |
239 | git__joinpath(new_current_workdir, TEMP_REPO_FOLDER, "a/b/c/"); | |
240 | must_pass(gitfo_mkdir_recurs(new_current_workdir, mode)); | |
241 | must_pass(chdir(new_current_workdir)); | |
242 | ||
243 | must_pass(git_repository_open(&repo, "../../d/e.git")); | |
244 | ||
245 | git_repository_free(repo); | |
246 | ||
677a3c07 | 247 | must_pass(chdir(current_workdir)); |
c90292ce | 248 | rmdir_recurs(TEMP_REPO_FOLDER); |
677a3c07 | 249 | END_TEST |
d4b5a4e2 | 250 | |
41233c40 VM |
251 | BEGIN_TEST(empty0, "test if a repository is empty or not") |
252 | ||
253 | git_repository *repo_empty, *repo_normal; | |
254 | ||
255 | must_pass(git_repository_open(&repo_normal, REPOSITORY_FOLDER)); | |
256 | must_be_true(git_repository_is_empty(repo_normal) == 0); | |
257 | git_repository_free(repo_normal); | |
258 | ||
259 | must_pass(git_repository_open(&repo_empty, EMPTY_BARE_REPOSITORY_FOLDER)); | |
260 | must_be_true(git_repository_is_empty(repo_empty) == 1); | |
261 | git_repository_free(repo_empty); | |
262 | END_TEST | |
263 | ||
3dccfed1 VM |
264 | BEGIN_SUITE(repository) |
265 | ADD_TEST(odb0); | |
266 | ADD_TEST(odb1); | |
267 | ADD_TEST(init0); | |
268 | ADD_TEST(init1); | |
677a3c07 | 269 | ADD_TEST(init2); |
2ce44b67 | 270 | ADD_TEST(open0); |
a8375f53 | 271 | ADD_TEST(open1); |
ba1bdf86 | 272 | ADD_TEST(open2); |
41233c40 | 273 | ADD_TEST(empty0); |
3dccfed1 | 274 | END_SUITE |
d4b5a4e2 | 275 |