##// END OF EJS Templates
scm: bazaar: add non ASCII path test to unit model test (#11834)...
Toshi MARUYAMA -
r10238:1fcd3d956fd0
parent child
Show More
@@ -1,151 +1,306
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang
2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class RepositoryBazaarTest < ActiveSupport::TestCase
20 class RepositoryBazaarTest < ActiveSupport::TestCase
21 fixtures :projects
21 fixtures :projects
22
22
23 include Redmine::I18n
23 include Redmine::I18n
24
24
25 REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s
25 REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s
26 REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk")
26 REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk")
27 NUM_REV = 4
27 NUM_REV = 4
28
28
29 REPOSITORY_PATH_NON_ASCII = Rails.root.join(REPOSITORY_PATH + '/' + 'non_ascii').to_s
30
31 # Bazaar core does not support xml output such as Subversion and Mercurial.
32 # "bzr" command output and command line parameter depend on locale.
33 # So, tests cannot run independent locale.
34 #
35 # If you want to run Bazaar non ASCII path tests on *Ruby 1.9*,
36 # you need to set locale character set "ISO-8859-1".
37 # E.g. "LANG=en_US.ISO-8859-1".
38 # On other platforms (e.g. Ruby 1.8, JRuby),
39 # you need to set "RUN_LATIN1_OUTPUT_TEST = true" manually.
40 #
41 # On Windows, because it is too hard to change system locale,
42 # you cannot run Bazaar non ASCII path tests.
43 #
44 RUN_LATIN1_OUTPUT_TEST = (RUBY_PLATFORM != 'java' &&
45 REPOSITORY_PATH.respond_to?(:force_encoding) &&
46 Encoding.locale_charmap == "ISO-8859-1")
47
48 CHAR_1_UTF8_HEX = "\xc3\x9c"
49 CHAR_1_LATIN1_HEX = "\xdc"
50
29 def setup
51 def setup
30 @project = Project.find(3)
52 @project = Project.find(3)
31 @repository = Repository::Bazaar.create(
53 @repository = Repository::Bazaar.create(
32 :project => @project, :url => REPOSITORY_PATH_TRUNK,
54 :project => @project, :url => REPOSITORY_PATH_TRUNK,
33 :log_encoding => 'UTF-8')
55 :log_encoding => 'UTF-8')
34 assert @repository
56 assert @repository
57 @char_1_utf8 = CHAR_1_UTF8_HEX.dup
58 @char_1_ascii8bit = CHAR_1_LATIN1_HEX.dup
59 if @char_1_utf8.respond_to?(:force_encoding)
60 @char_1_utf8.force_encoding('UTF-8')
61 @char_1_ascii8bit.force_encoding('ASCII-8BIT')
62 end
35 end
63 end
36
64
37 def test_blank_path_to_repository_error_message
65 def test_blank_path_to_repository_error_message
38 set_language_if_valid 'en'
66 set_language_if_valid 'en'
39 repo = Repository::Bazaar.new(
67 repo = Repository::Bazaar.new(
40 :project => @project,
68 :project => @project,
41 :identifier => 'test',
69 :identifier => 'test',
42 :log_encoding => 'UTF-8'
70 :log_encoding => 'UTF-8'
43 )
71 )
44 assert !repo.save
72 assert !repo.save
45 assert_include "Path to repository can't be blank",
73 assert_include "Path to repository can't be blank",
46 repo.errors.full_messages
74 repo.errors.full_messages
47 end
75 end
48
76
49 def test_blank_path_to_repository_error_message_fr
77 def test_blank_path_to_repository_error_message_fr
50 set_language_if_valid 'fr'
78 set_language_if_valid 'fr'
51 str = "Chemin du d\xc3\xa9p\xc3\xb4t doit \xc3\xaatre renseign\xc3\xa9(e)"
79 str = "Chemin du d\xc3\xa9p\xc3\xb4t doit \xc3\xaatre renseign\xc3\xa9(e)"
52 str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
80 str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
53 repo = Repository::Bazaar.new(
81 repo = Repository::Bazaar.new(
54 :project => @project,
82 :project => @project,
55 :url => "",
83 :url => "",
56 :identifier => 'test',
84 :identifier => 'test',
57 :log_encoding => 'UTF-8'
85 :log_encoding => 'UTF-8'
58 )
86 )
59 assert !repo.save
87 assert !repo.save
60 assert_include str, repo.errors.full_messages
88 assert_include str, repo.errors.full_messages
61 end
89 end
62
90
63 if File.directory?(REPOSITORY_PATH_TRUNK)
91 if File.directory?(REPOSITORY_PATH_TRUNK)
64 def test_fetch_changesets_from_scratch
92 def test_fetch_changesets_from_scratch
65 assert_equal 0, @repository.changesets.count
93 assert_equal 0, @repository.changesets.count
66 @repository.fetch_changesets
94 @repository.fetch_changesets
67 @project.reload
95 @project.reload
68
96
69 assert_equal NUM_REV, @repository.changesets.count
97 assert_equal NUM_REV, @repository.changesets.count
70 assert_equal 9, @repository.filechanges.count
98 assert_equal 9, @repository.filechanges.count
71 assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
99 assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
72 end
100 end
73
101
74 def test_fetch_changesets_incremental
102 def test_fetch_changesets_incremental
75 assert_equal 0, @repository.changesets.count
103 assert_equal 0, @repository.changesets.count
76 @repository.fetch_changesets
104 @repository.fetch_changesets
77 @project.reload
105 @project.reload
78 assert_equal NUM_REV, @repository.changesets.count
106 assert_equal NUM_REV, @repository.changesets.count
79 # Remove changesets with revision > 5
107 # Remove changesets with revision > 5
80 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2}
108 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2}
81 @project.reload
109 @project.reload
82 assert_equal 2, @repository.changesets.count
110 assert_equal 2, @repository.changesets.count
83
111
84 @repository.fetch_changesets
112 @repository.fetch_changesets
85 @project.reload
113 @project.reload
86 assert_equal NUM_REV, @repository.changesets.count
114 assert_equal NUM_REV, @repository.changesets.count
87 end
115 end
88
116
89 def test_entries
117 def test_entries
90 entries = @repository.entries
118 entries = @repository.entries
91 assert_kind_of Redmine::Scm::Adapters::Entries, entries
119 assert_kind_of Redmine::Scm::Adapters::Entries, entries
92 assert_equal 2, entries.size
120 assert_equal 2, entries.size
93
121
94 assert_equal 'dir', entries[0].kind
122 assert_equal 'dir', entries[0].kind
95 assert_equal 'directory', entries[0].name
123 assert_equal 'directory', entries[0].name
96 assert_equal 'directory', entries[0].path
124 assert_equal 'directory', entries[0].path
97
125
98 assert_equal 'file', entries[1].kind
126 assert_equal 'file', entries[1].kind
99 assert_equal 'doc-mkdir.txt', entries[1].name
127 assert_equal 'doc-mkdir.txt', entries[1].name
100 assert_equal 'doc-mkdir.txt', entries[1].path
128 assert_equal 'doc-mkdir.txt', entries[1].path
101 end
129 end
102
130
103 def test_entries_in_subdirectory
131 def test_entries_in_subdirectory
104 entries = @repository.entries('directory')
132 entries = @repository.entries('directory')
105 assert_equal 3, entries.size
133 assert_equal 3, entries.size
106
134
107 assert_equal 'file', entries.last.kind
135 assert_equal 'file', entries.last.kind
108 assert_equal 'edit.png', entries.last.name
136 assert_equal 'edit.png', entries.last.name
109 assert_equal 'directory/edit.png', entries.last.path
137 assert_equal 'directory/edit.png', entries.last.path
110 end
138 end
111
139
112 def test_previous
140 def test_previous
113 assert_equal 0, @repository.changesets.count
141 assert_equal 0, @repository.changesets.count
114 @repository.fetch_changesets
142 @repository.fetch_changesets
115 @project.reload
143 @project.reload
116 assert_equal NUM_REV, @repository.changesets.count
144 assert_equal NUM_REV, @repository.changesets.count
117 changeset = @repository.find_changeset_by_name('3')
145 changeset = @repository.find_changeset_by_name('3')
118 assert_equal @repository.find_changeset_by_name('2'), changeset.previous
146 assert_equal @repository.find_changeset_by_name('2'), changeset.previous
119 end
147 end
120
148
121 def test_previous_nil
149 def test_previous_nil
122 assert_equal 0, @repository.changesets.count
150 assert_equal 0, @repository.changesets.count
123 @repository.fetch_changesets
151 @repository.fetch_changesets
124 @project.reload
152 @project.reload
125 assert_equal NUM_REV, @repository.changesets.count
153 assert_equal NUM_REV, @repository.changesets.count
126 changeset = @repository.find_changeset_by_name('1')
154 changeset = @repository.find_changeset_by_name('1')
127 assert_nil changeset.previous
155 assert_nil changeset.previous
128 end
156 end
129
157
130 def test_next
158 def test_next
131 assert_equal 0, @repository.changesets.count
159 assert_equal 0, @repository.changesets.count
132 @repository.fetch_changesets
160 @repository.fetch_changesets
133 @project.reload
161 @project.reload
134 assert_equal NUM_REV, @repository.changesets.count
162 assert_equal NUM_REV, @repository.changesets.count
135 changeset = @repository.find_changeset_by_name('2')
163 changeset = @repository.find_changeset_by_name('2')
136 assert_equal @repository.find_changeset_by_name('3'), changeset.next
164 assert_equal @repository.find_changeset_by_name('3'), changeset.next
137 end
165 end
138
166
139 def test_next_nil
167 def test_next_nil
140 assert_equal 0, @repository.changesets.count
168 assert_equal 0, @repository.changesets.count
141 @repository.fetch_changesets
169 @repository.fetch_changesets
142 @project.reload
170 @project.reload
143 assert_equal NUM_REV, @repository.changesets.count
171 assert_equal NUM_REV, @repository.changesets.count
144 changeset = @repository.find_changeset_by_name('4')
172 changeset = @repository.find_changeset_by_name('4')
145 assert_nil changeset.next
173 assert_nil changeset.next
146 end
174 end
175
176 if File.directory?(REPOSITORY_PATH_NON_ASCII) && RUN_LATIN1_OUTPUT_TEST
177 def test_cat_latin1_path
178 latin1_repo = create_latin1_repo
179 buf = latin1_repo.cat(
180 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", 2)
181 assert buf
182 lines = buf.split("\n")
183 assert_equal 2, lines.length
184 assert_equal 'It is written in Python.', lines[1]
185
186 buf = latin1_repo.cat(
187 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2)
188 assert buf
189 lines = buf.split("\n")
190 assert_equal 1, lines.length
191 assert_equal "test-#{@char_1_ascii8bit}.txt", lines[0]
192 end
193
194 def test_annotate_latin1_path
195 latin1_repo = create_latin1_repo
196 ann1 = latin1_repo.annotate(
197 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", 2)
198 assert_equal 2, ann1.lines.size
199 assert_equal '2', ann1.revisions[0].identifier
200 assert_equal 'test00@', ann1.revisions[0].author
201 assert_equal 'It is written in Python.', ann1.lines[1]
202 ann2 = latin1_repo.annotate(
203 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2)
204 assert_equal 1, ann2.lines.size
205 assert_equal '2', ann2.revisions[0].identifier
206 assert_equal 'test00@', ann2.revisions[0].author
207 assert_equal "test-#{@char_1_ascii8bit}.txt", ann2.lines[0]
208 end
209
210 def test_diff_latin1_path
211 latin1_repo = create_latin1_repo
212 diff1 = latin1_repo.diff(
213 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2, 1)
214 assert_equal 7, diff1.size
215 buf = diff1[5].gsub(/\r\n|\r|\n/, "")
216 assert_equal "+test-#{@char_1_ascii8bit}.txt", buf
217 end
218
219 def test_entries_latin1_path
220 latin1_repo = create_latin1_repo
221 entries = latin1_repo.entries("test-#{@char_1_utf8}-dir", 2)
222 assert_kind_of Redmine::Scm::Adapters::Entries, entries
223 assert_equal 3, entries.size
224 assert_equal 'file', entries[1].kind
225 assert_equal "test-#{@char_1_utf8}-1.txt", entries[0].name
226 assert_equal "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", entries[0].path
227 end
228
229 def test_entry_latin1_path
230 latin1_repo = create_latin1_repo
231 ["test-#{@char_1_utf8}-dir",
232 "/test-#{@char_1_utf8}-dir",
233 "/test-#{@char_1_utf8}-dir/"
234 ].each do |path|
235 entry = latin1_repo.entry(path, 2)
236 assert_equal "test-#{@char_1_utf8}-dir", entry.path
237 assert_equal "dir", entry.kind
238 end
239 ["test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt",
240 "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt"
241 ].each do |path|
242 entry = latin1_repo.entry(path, 2)
243 assert_equal "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt",
244 entry.path
245 assert_equal "file", entry.kind
246 end
247 end
248
249 def test_changeset_latin1_path
250 latin1_repo = create_latin1_repo
251 assert_equal 0, latin1_repo.changesets.count
252 latin1_repo.fetch_changesets
253 @project.reload
254 assert_equal 3, latin1_repo.changesets.count
255
256 cs2 = latin1_repo.changesets.find_by_revision('2')
257 assert_not_nil cs2
258 assert_equal "test-#{@char_1_utf8}", cs2.comments
259 c2 = cs2.filechanges.sort_by(&:path)
260 assert_equal 4, c2.size
261 assert_equal 'A', c2[0].action
262 assert_equal "/test-#{@char_1_utf8}-dir/", c2[0].path
263 assert_equal 'A', c2[1].action
264 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", c2[1].path
265 assert_equal 'A', c2[2].action
266 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", c2[2].path
267 assert_equal 'A', c2[3].action
268 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}.txt", c2[3].path
269
270 cs3 = latin1_repo.changesets.find_by_revision('3')
271 assert_not_nil cs3
272 assert_equal "modify, move and delete #{@char_1_utf8} files", cs3.comments
273 c3 = cs3.filechanges.sort_by(&:path)
274 assert_equal 3, c3.size
275 assert_equal 'M', c3[0].action
276 assert_equal "/test-#{@char_1_utf8}-1.txt", c3[0].path
277 assert_equal 'D', c3[1].action
278 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", c3[1].path
279 assert_equal 'M', c3[2].action
280 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}.txt", c3[2].path
281 end
282 else
283 msg = "Bazaar non ASCII output test cannot run this environment." + "\n"
284 if msg.respond_to?(:force_encoding)
285 msg += "Encoding.locale_charmap: " + Encoding.locale_charmap + "\n"
286 end
287 puts msg
288 end
289
290 private
291
292 def create_latin1_repo
293 repo = Repository::Bazaar.create(
294 :project => @project,
295 :identifier => 'latin1',
296 :url => REPOSITORY_PATH_NON_ASCII,
297 :log_encoding => 'ISO-8859-1'
298 )
299 assert repo
300 repo
301 end
147 else
302 else
148 puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
303 puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
149 def test_fake; assert true end
304 def test_fake; assert true end
150 end
305 end
151 end
306 end
General Comments 0
You need to be logged in to leave comments. Login now