##// END OF EJS Templates
scm: git: add unit model test that revisions ordering is consistent in new database (#5357)....
Toshi MARUYAMA -
r5734:9376f6e2c370
parent child
Show More
@@ -1,387 +1,394
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class RepositoryGitTest < ActiveSupport::TestCase
21 21 fixtures :projects, :repositories, :enabled_modules, :users, :roles
22 22
23 23 # No '..' in the repository path
24 24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
25 25 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
26 26
27 27 FELIX_HEX = "Felix Sch\xC3\xA4fer"
28 28 CHAR_1_HEX = "\xc3\x9c"
29 29
30 30 ## Ruby uses ANSI api to fork a process on Windows.
31 31 ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
32 32 ## and these are incompatible with ASCII.
33 33 # WINDOWS_PASS = Redmine::Platform.mswin?
34 34 WINDOWS_PASS = false
35 35
36 36 if File.directory?(REPOSITORY_PATH)
37 37 def setup
38 38 klass = Repository::Git
39 39 assert_equal "Git", klass.scm_name
40 40 assert klass.scm_adapter_class
41 41 assert_not_equal "", klass.scm_command
42 42 assert_equal true, klass.scm_available
43 43
44 44 @project = Project.find(3)
45 45 @repository = Repository::Git.create(
46 46 :project => @project,
47 47 :url => REPOSITORY_PATH,
48 48 :path_encoding => 'ISO-8859-1'
49 49 )
50 50 assert @repository
51 51 @char_1 = CHAR_1_HEX.dup
52 52 if @char_1.respond_to?(:force_encoding)
53 53 @char_1.force_encoding('UTF-8')
54 54 end
55 55 end
56 56
57 57 def test_fetch_changesets_from_scratch
58 58 assert_nil @repository.extra_info
59 59
60 60 @repository.fetch_changesets
61 61 @repository.reload
62 62
63 63 assert_equal 21, @repository.changesets.count
64 64 assert_equal 33, @repository.changes.count
65 65
66 66 commit = @repository.changesets.find(:first, :order => 'committed_on ASC')
67 67 assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments
68 68 assert_equal "jsmith <jsmith@foo.bar>", commit.committer
69 69 assert_equal User.find_by_login('jsmith'), commit.user
70 70 # TODO: add a commit with commit time <> author time to the test repository
71 71 assert_equal "2007-12-14 09:22:52".to_time, commit.committed_on
72 72 assert_equal "2007-12-14".to_date, commit.commit_date
73 73 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.revision
74 74 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.scmid
75 75 assert_equal 3, commit.changes.count
76 76 change = commit.changes.sort_by(&:path).first
77 77 assert_equal "README", change.path
78 78 assert_equal "A", change.action
79 79
80 80 assert_equal 4, @repository.extra_info["branches"].size
81 81 end
82 82
83 83 def test_fetch_changesets_incremental
84 84 @repository.fetch_changesets
85 85 @repository.reload
86 86 assert_equal 21, @repository.changesets.count
87 87 assert_equal 33, @repository.changes.count
88 88 extra_info_db = @repository.extra_info["branches"]
89 89 assert_equal 4, extra_info_db.size
90 90 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127",
91 91 extra_info_db["latin-1-path-encoding"]["last_scmid"]
92 92 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
93 93 extra_info_db["master"]["last_scmid"]
94 94
95 95 del_revs = [
96 96 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
97 97 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
98 98 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
99 99 "deff712f05a90d96edbd70facc47d944be5897e3",
100 100 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
101 101 "7e61ac704deecde634b51e59daa8110435dcb3da",
102 102 ]
103 103 @repository.changesets.each do |rev|
104 104 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
105 105 end
106 106 @repository.reload
107 107 cs1 = @repository.changesets
108 108 assert_equal 15, cs1.count
109 109 h = @repository.extra_info.dup
110 110 h["branches"]["master"]["last_scmid"] =
111 111 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
112 112 @repository.merge_extra_info(h)
113 113 @repository.save
114 114 @repository.reload
115 115 extra_info_db_1 = @repository.extra_info["branches"]
116 116 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
117 117 extra_info_db_1["master"]["last_scmid"]
118 118
119 119 @repository.fetch_changesets
120 120 assert_equal 21, @repository.changesets.count
121 121 end
122 122
123 123 def test_fetch_changesets_invalid_rev
124 124 @repository.fetch_changesets
125 125 @repository.reload
126 126 assert_equal 21, @repository.changesets.count
127 127 assert_equal 33, @repository.changes.count
128 128 extra_info_db = @repository.extra_info["branches"]
129 129 assert_equal 4, extra_info_db.size
130 130 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127",
131 131 extra_info_db["latin-1-path-encoding"]["last_scmid"]
132 132 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
133 133 extra_info_db["master"]["last_scmid"]
134 134
135 135 del_revs = [
136 136 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
137 137 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
138 138 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
139 139 "deff712f05a90d96edbd70facc47d944be5897e3",
140 140 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
141 141 "7e61ac704deecde634b51e59daa8110435dcb3da",
142 142 ]
143 143 @repository.changesets.each do |rev|
144 144 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
145 145 end
146 146 @repository.reload
147 147 cs1 = @repository.changesets
148 148 assert_equal 15, cs1.count
149 149 h = @repository.extra_info.dup
150 150 h["branches"]["master"]["last_scmid"] =
151 151 "abcd1234efgh"
152 152 @repository.merge_extra_info(h)
153 153 @repository.save
154 154 @repository.reload
155 155 extra_info_db_1 = @repository.extra_info["branches"]
156 156 assert_equal "abcd1234efgh",
157 157 extra_info_db_1["master"]["last_scmid"]
158 158
159 159 @repository.fetch_changesets
160 160 assert_equal 15, @repository.changesets.count
161 161 end
162 162
163 def test_db_consistent_ordering_init
164 assert_nil @repository.extra_info
165 @repository.fetch_changesets
166 @repository.reload
167 assert_equal 1, @repository.extra_info["db_consistent"]["ordering"]
168 end
169
163 170 def test_latest_changesets
164 171 @repository.fetch_changesets
165 172 @repository.reload
166 173 # with limit
167 174 changesets = @repository.latest_changesets('', nil, 2)
168 175 assert_equal 2, changesets.size
169 176
170 177 # with path
171 178 changesets = @repository.latest_changesets('images', nil)
172 179 assert_equal [
173 180 'deff712f05a90d96edbd70facc47d944be5897e3',
174 181 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
175 182 '7234cb2750b63f47bff735edc50a1c0a433c2518',
176 183 ], changesets.collect(&:revision)
177 184
178 185 changesets = @repository.latest_changesets('README', nil)
179 186 assert_equal [
180 187 '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf',
181 188 '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8',
182 189 '713f4944648826f558cf548222f813dabe7cbb04',
183 190 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
184 191 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
185 192 '7234cb2750b63f47bff735edc50a1c0a433c2518',
186 193 ], changesets.collect(&:revision)
187 194
188 195 # with path, revision and limit
189 196 changesets = @repository.latest_changesets('images', '899a15dba')
190 197 assert_equal [
191 198 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
192 199 '7234cb2750b63f47bff735edc50a1c0a433c2518',
193 200 ], changesets.collect(&:revision)
194 201
195 202 changesets = @repository.latest_changesets('images', '899a15dba', 1)
196 203 assert_equal [
197 204 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
198 205 ], changesets.collect(&:revision)
199 206
200 207 changesets = @repository.latest_changesets('README', '899a15dba')
201 208 assert_equal [
202 209 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
203 210 '7234cb2750b63f47bff735edc50a1c0a433c2518',
204 211 ], changesets.collect(&:revision)
205 212
206 213 changesets = @repository.latest_changesets('README', '899a15dba', 1)
207 214 assert_equal [
208 215 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
209 216 ], changesets.collect(&:revision)
210 217
211 218 # with path, tag and limit
212 219 changesets = @repository.latest_changesets('images', 'tag01.annotated')
213 220 assert_equal [
214 221 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
215 222 '7234cb2750b63f47bff735edc50a1c0a433c2518',
216 223 ], changesets.collect(&:revision)
217 224
218 225 changesets = @repository.latest_changesets('images', 'tag01.annotated', 1)
219 226 assert_equal [
220 227 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
221 228 ], changesets.collect(&:revision)
222 229
223 230 changesets = @repository.latest_changesets('README', 'tag01.annotated')
224 231 assert_equal [
225 232 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
226 233 '7234cb2750b63f47bff735edc50a1c0a433c2518',
227 234 ], changesets.collect(&:revision)
228 235
229 236 changesets = @repository.latest_changesets('README', 'tag01.annotated', 1)
230 237 assert_equal [
231 238 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
232 239 ], changesets.collect(&:revision)
233 240
234 241 # with path, branch and limit
235 242 changesets = @repository.latest_changesets('images', 'test_branch')
236 243 assert_equal [
237 244 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
238 245 '7234cb2750b63f47bff735edc50a1c0a433c2518',
239 246 ], changesets.collect(&:revision)
240 247
241 248 changesets = @repository.latest_changesets('images', 'test_branch', 1)
242 249 assert_equal [
243 250 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
244 251 ], changesets.collect(&:revision)
245 252
246 253 changesets = @repository.latest_changesets('README', 'test_branch')
247 254 assert_equal [
248 255 '713f4944648826f558cf548222f813dabe7cbb04',
249 256 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
250 257 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
251 258 '7234cb2750b63f47bff735edc50a1c0a433c2518',
252 259 ], changesets.collect(&:revision)
253 260
254 261 changesets = @repository.latest_changesets('README', 'test_branch', 2)
255 262 assert_equal [
256 263 '713f4944648826f558cf548222f813dabe7cbb04',
257 264 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
258 265 ], changesets.collect(&:revision)
259 266
260 267 # latin-1 encoding path
261 268 changesets = @repository.latest_changesets(
262 269 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89')
263 270 assert_equal [
264 271 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
265 272 '4fc55c43bf3d3dc2efb66145365ddc17639ce81e',
266 273 ], changesets.collect(&:revision)
267 274
268 275 changesets = @repository.latest_changesets(
269 276 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89', 1)
270 277 assert_equal [
271 278 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
272 279 ], changesets.collect(&:revision)
273 280 end
274 281
275 282 def test_latest_changesets_latin_1_dir
276 283 if WINDOWS_PASS
277 284 #
278 285 else
279 286 @repository.fetch_changesets
280 287 @repository.reload
281 288 changesets = @repository.latest_changesets(
282 289 "latin-1-dir/test-#{@char_1}-subdir", '1ca7f5ed')
283 290 assert_equal [
284 291 '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127',
285 292 ], changesets.collect(&:revision)
286 293 end
287 294 end
288 295
289 296 def test_find_changeset_by_name
290 297 @repository.fetch_changesets
291 298 @repository.reload
292 299 ['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r|
293 300 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518',
294 301 @repository.find_changeset_by_name(r).revision
295 302 end
296 303 end
297 304
298 305 def test_find_changeset_by_empty_name
299 306 @repository.fetch_changesets
300 307 @repository.reload
301 308 ['', ' ', nil].each do |r|
302 309 assert_nil @repository.find_changeset_by_name(r)
303 310 end
304 311 end
305 312
306 313 def test_identifier
307 314 @repository.fetch_changesets
308 315 @repository.reload
309 316 c = @repository.changesets.find_by_revision(
310 317 '7234cb2750b63f47bff735edc50a1c0a433c2518')
311 318 assert_equal c.scmid, c.identifier
312 319 end
313 320
314 321 def test_format_identifier
315 322 @repository.fetch_changesets
316 323 @repository.reload
317 324 c = @repository.changesets.find_by_revision(
318 325 '7234cb2750b63f47bff735edc50a1c0a433c2518')
319 326 assert_equal '7234cb27', c.format_identifier
320 327 end
321 328
322 329 def test_activities
323 330 c = Changeset.new(:repository => @repository,
324 331 :committed_on => Time.now,
325 332 :revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
326 333 :scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
327 334 :comments => 'test')
328 335 assert c.event_title.include?('abc7234c:')
329 336 assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
330 337 end
331 338
332 339 def test_log_utf8
333 340 @repository.fetch_changesets
334 341 @repository.reload
335 342 str_felix_hex = FELIX_HEX.dup
336 343 if str_felix_hex.respond_to?(:force_encoding)
337 344 str_felix_hex.force_encoding('UTF-8')
338 345 end
339 346 c = @repository.changesets.find_by_revision(
340 347 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b')
341 348 assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer
342 349 end
343 350
344 351 def test_previous
345 352 @repository.fetch_changesets
346 353 @repository.reload
347 354 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
348 355 changeset = @repository.find_changeset_by_name(r1)
349 356 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
350 357 assert_equal @repository.find_changeset_by_name(r2), changeset.previous
351 358 end
352 359 end
353 360 end
354 361
355 362 def test_previous_nil
356 363 @repository.fetch_changesets
357 364 @repository.reload
358 365 %w|7234cb2750b63f47bff735edc50a1c0a433c2518 7234cb2|.each do |r1|
359 366 changeset = @repository.find_changeset_by_name(r1)
360 367 assert_nil changeset.previous
361 368 end
362 369 end
363 370
364 371 def test_next
365 372 @repository.fetch_changesets
366 373 @repository.reload
367 374 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
368 375 changeset = @repository.find_changeset_by_name(r2)
369 376 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
370 377 assert_equal @repository.find_changeset_by_name(r1), changeset.next
371 378 end
372 379 end
373 380 end
374 381
375 382 def test_next_nil
376 383 @repository.fetch_changesets
377 384 @repository.reload
378 385 %w|67e7792ce20ccae2e4bb73eed09bb397819c8834 67e7792ce20cca|.each do |r1|
379 386 changeset = @repository.find_changeset_by_name(r1)
380 387 assert_nil changeset.next
381 388 end
382 389 end
383 390 else
384 391 puts "Git test repository NOT FOUND. Skipping unit tests !!!"
385 392 def test_fake; assert true end
386 393 end
387 394 end
General Comments 0
You need to be logged in to leave comments. Login now