test/sync_helper_test.rb in esr-rim-1.4.0 vs test/sync_helper_test.rb in esr-rim-1.4.2

- old
+ new

@@ -1,296 +1,296 @@ -$:.unshift File.join(File.dirname(__FILE__),"..","lib") -$:.unshift File.join(File.dirname(__FILE__)) - -require 'minitest/autorun' -require 'rim/git' -require 'rim/module_info' -require 'rim/status_builder' -require 'rim/sync_helper' -require 'test_helper' -require 'fileutils' - -class SyncHelperTest < Minitest::Test - include FileUtils - include TestHelper - - def setup - test_dir = empty_test_dir("sync_helper_test") - @remote_git_dir = File.join(test_dir, "remote_git") - @ws_remote_dir = File.join(test_dir, "remote_ws") - @ws_dir = File.join(test_dir, "ws") - @logger = Logger.new($stdout) - @logger.level = Logger::ERROR unless ARGV.include? "debug" - RIM::GitSession.logger = @logger - end - - def teardown - remove_test_dirs - end - - def test_files_are_synchronized - mod1_info = create_module_git("mod1") - mod2_info = create_module_git("mod2") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) - cut.sync - RIM::git_session(@ws_dir) do |s| - assert !File.exist?(File.join(@ws_dir, "mod1")) - assert !File.exist?(File.join(@ws_dir, "mod2")) - s.execute("git checkout rim/testbr") - check_not_dirty(s) - log = s.execute("git log | grep \" module \"").split("\n").sort - assert log.size == 2 - assert log[0].include?("mod1") - assert log[1].include?("mod2") - assert File.exist?(File.join(@ws_dir, "mod1")) - assert File.exist?(File.join(@ws_dir, "mod2")) - assert File.exist?(File.join(@ws_dir, "mod1", "readme.txt")) - assert File.exist?(File.join(@ws_dir, "mod2", "readme.txt")) - end - end - - def test_files_are_synchronized_subtree - mod_git_dir = create_all_module_git("mod_all") - mod_a_info = RIM::ModuleInfo.new("file://" + mod_git_dir, "modules/a", "master", nil, nil, "mod_a") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod_a_info]) - cut.sync - RIM::git_session(@ws_dir) do |s| - assert !File.exist?(File.join(@ws_dir, "modules", "a")) - s.execute("git checkout rim/testbr") - check_not_dirty(s) - log = s.execute("git log | grep \" module \"").split("\n").sort - assert log.size == 1 - assert log[0].include?("modules/a") - assert !File.exist?(File.join(@ws_dir, "modules", "b")) - assert File.exist?(File.join(@ws_dir, "modules", "a")) - assert File.exist?(File.join(@ws_dir, "modules", "a", "file_a.c")) - end - end - - def test_files_are_synchronized_subtree_deep - mod_git_dir = create_all_module_git("mod_all") - mod_a_info = RIM::ModuleInfo.new("file://" + mod_git_dir, "modules/b_src", "master", nil, nil, "mod_b/src") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod_a_info]) - cut.sync - RIM::git_session(@ws_dir) do |s| - assert !File.exist?(File.join(@ws_dir, "modules", "b_src")) - s.execute("git checkout rim/testbr") - check_not_dirty(s) - log = s.execute("git log | grep \" module \"").split("\n").sort - assert log.size == 1 - assert log[0].include?("modules/b_src") - assert File.exist?(File.join(@ws_dir, "modules", "b_src", "file_b.c")) - end - end - - - def test_files_are_synchronized_on_existing_branch - mod1_info = create_module_git("mod1") - mod2_info = create_module_git("mod2") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) - cut.sync - `echo ' changed' >> #{File.join(@ws_dir, "readme")}` - RIM::git_session(@ws_dir) do |s| - s.execute("git commit . -m \"Changed ws file\"") - end - remote_path = path_from_module_info(mod1_info) - `echo ' changed' >> #{File.join(remote_path, "readme.txt")}` - RIM::git_session(remote_path) do |f| - f.execute("git commit . -m \"Changed mod1 file\"") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git checkout rim/testbr") - check_not_dirty(s) - log = s.execute("git log | grep \" module \"").split("\n").sort - assert log.size == 3 - assert log[0].include?("mod1") - assert log[1].include?("mod1") - assert log[2].include?("mod2") - assert File.exist?(File.join(@ws_dir, "mod1")) - `cat #{File.join(@ws_dir, "mod1/readme.txt")}`.start_with?("Content. changed") - assert File.exist?(File.join(@ws_dir, "mod2")) - end - end - - def test_files_are_synchronized_on_new_branch_if_behind_last_remote_commit - mod1_info = create_module_git("mod1") - mod2_info = create_module_git("mod2") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) - cut.sync - `echo ' changed' >> #{File.join(@ws_remote_dir, "readme")}` - RIM::git_session(@ws_remote_dir) do |s| - s.execute("git commit . -m \"Changed ws file\"") - end - RIM::git_session(@ws_dir) do |s| - s.execute("git pull") - assert !has_ancestor?(s, "rim/testbr", "testbr") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - assert has_ancestor?(s, "rim/testbr", "testbr") - end - end - - def test_existing_non_ignored_files_are_removed_during_sync - mod1_info = create_module_git("mod1") - create_ws_git("testbr") do |s| - FileUtils.mkdir_p(File.join(@ws_remote_dir, "mod1")) - File.open(File.join(@ws_remote_dir, "mod1", "existing.txt"), "w") do |f| - f.write("Content") - end - s.execute("git add --all mod1") - s.execute("git commit -m \"Create existing file within mod1\"") - end - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git rebase rim/testbr") - assert !File.exists?(File.join(@ws_dir, "mod1", "existing.txt")) - end - end - - def test_case_change_in_filename_is_synced_correctly - mod1_info = create_module_git("mod1") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) - cut.sync - remote_path = path_from_module_info(mod1_info) - RIM::git_session(remote_path) do |s| - FileUtils.mv(File.join(remote_path, "readme.txt"), File.join(remote_path, "readme.tx_")) - s.execute("git add --all .") - s.execute("git commit -m \"Temporary change of filename within mod1\"") - FileUtils.mv(File.join(remote_path, "readme.tx_"), File.join(remote_path, "Readme.txt")) - s.execute("git add --all .") - s.execute("git commit -m \"Changed case in filename within mod1\"") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git rebase rim/testbr") - out = s.execute("git show --name-only") - assert out.include?("readme.txt") - assert out.include?("Readme.txt") - end - end - - def test_sync_on_different_branches - mod1_info = create_module_git("mod1") - create_ws_git("testbr") - cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) - cut.sync - remote_path = path_from_module_info(mod1_info) - RIM::git_session(remote_path) do |s| - FileUtils.mv(File.join(remote_path, "readme.txt"), File.join(remote_path, "readme.tx_")) - s.execute("git add --all .") - s.execute("git commit -m \"Temporary change of filename within mod1\"") - FileUtils.mv(File.join(remote_path, "readme.tx_"), File.join(remote_path, "Readme.txt")) - s.execute("git add --all .") - s.execute("git commit -m \"Changed case in filename within mod1\"") - end - RIM::git_session(@ws_dir) do |s| - s.execute("git checkout -b branch2") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git rebase rim/branch2") - out = s.execute("git show --name-only") - assert out.include?("Readme.txt") - end - RIM::git_session(remote_path) do |s| - `echo ' changed' >> #{File.join(remote_path, "Readme.txt")}` - s.execute("git commit . -m \"Changed module file\"") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git rebase rim/branch2") - s.execute("git checkout testbr") - s.execute("git reset --hard branch2~1") - s.execute("git push origin branch2:branch2") - end - cut.sync - RIM::git_session(@ws_dir) do |s| - s.execute("git reset --hard rim/testbr") - out = s.execute("git show --name-only") - assert out.include?("Readme.txt") - end - end - -private - def create_ws_git(branch = "master") - FileUtils.mkdir_p(@ws_remote_dir) - RIM::git_session(@ws_remote_dir) do |s| - s.execute("git init") - s.execute("git checkout -B #{branch}") - File.open(File.join(@ws_remote_dir, ".gitignore"), "w") do |f| - f.write(".rim") - end - File.open(File.join(@ws_remote_dir, "readme"), "w") do |f| - f.write("Content") - end - s.execute("git add .") - s.execute("git commit -m \"Initial commit\"") - yield s if block_given? - end - FileUtils.mkdir_p(@ws_dir) - RIM::git_session(@ws_dir) do |s| - s.execute("git clone #{@ws_remote_dir} #{@ws_dir}") - end - end - - def create_module_git(name, branch = "master") - git_dir = File.join(@remote_git_dir, name) - FileUtils.mkdir_p(git_dir) - RIM::git_session(git_dir) do |s| - s.execute("git init") - s.execute("git checkout -B #{branch}") - File.open(File.join(git_dir, "readme.txt"), "w") do |f| - f.write("Content.") - end - s.execute("git add .") - s.execute("git commit -m \"Initial commit\"") - end - return RIM::ModuleInfo.new("file://" + git_dir, name, branch) - end - - def create_all_module_git(name, branch = "master") - git_dir = File.join(@remote_git_dir, name) - FileUtils.mkdir_p(File.join(git_dir,"mod_a")) - FileUtils.mkdir_p(File.join(git_dir,"mod_b","src")) - RIM::git_session(git_dir) do |s| - s.execute("git init") - s.execute("git checkout -B #{branch}") - File.open(File.join(git_dir, "readme.txt"), "w") do |f| - f.write("Content.") - end - File.open(File.join(git_dir, "mod_a", "file_a.c"), "w") do |f| - f.write("Content.") - end - File.open(File.join(git_dir, "mod_b", "src", "file_b.c"), "w") do |f| - f.write("Content.") - end - s.execute("git add .") - s.execute("git commit -m \"Initial commit\"") - end - return git_dir - end - - def path_from_module_info(module_info) - module_info.remote_url.gsub(/^file:\/\//, "") - end - - def check_not_dirty(session) - status = RIM::StatusBuilder.new.rev_status(session, "HEAD") - status.modules.each do |m| - assert !m.dirty? - end - end - - def has_ancestor?(session, rev, ancestor) - rev = session.execute("git rev-list #{rev}").include?(session.rev_sha1(ancestor)) - end - -end +$:.unshift File.join(File.dirname(__FILE__),"..","lib") +$:.unshift File.join(File.dirname(__FILE__)) + +require 'minitest/autorun' +require 'rim/git' +require 'rim/module_info' +require 'rim/status_builder' +require 'rim/sync_helper' +require 'test_helper' +require 'fileutils' + +class SyncHelperTest < Minitest::Test + include FileUtils + include TestHelper + + def setup + test_dir = empty_test_dir("sync_helper_test") + @remote_git_dir = File.join(test_dir, "remote_git") + @ws_remote_dir = File.join(test_dir, "remote_ws") + @ws_dir = File.join(test_dir, "ws") + @logger = Logger.new($stdout) + @logger.level = Logger::ERROR unless ARGV.include? "debug" + RIM::GitSession.logger = @logger + end + + def teardown + remove_test_dirs + end + + def test_files_are_synchronized + mod1_info = create_module_git("mod1") + mod2_info = create_module_git("mod2") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) + cut.sync + RIM::git_session(@ws_dir) do |s| + assert !File.exist?(File.join(@ws_dir, "mod1")) + assert !File.exist?(File.join(@ws_dir, "mod2")) + s.execute("git checkout rim/testbr") + check_not_dirty(s) + log = s.execute("git log | grep \" module \"").split("\n").sort + assert log.size == 2 + assert log[0].include?("mod1") + assert log[1].include?("mod2") + assert File.exist?(File.join(@ws_dir, "mod1")) + assert File.exist?(File.join(@ws_dir, "mod2")) + assert File.exist?(File.join(@ws_dir, "mod1", "readme.txt")) + assert File.exist?(File.join(@ws_dir, "mod2", "readme.txt")) + end + end + + def test_files_are_synchronized_subtree + mod_git_dir = create_all_module_git("mod_all") + mod_a_info = RIM::ModuleInfo.new("file://" + mod_git_dir, "modules/a", "master", nil, nil, "mod_a") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod_a_info]) + cut.sync + RIM::git_session(@ws_dir) do |s| + assert !File.exist?(File.join(@ws_dir, "modules", "a")) + s.execute("git checkout rim/testbr") + check_not_dirty(s) + log = s.execute("git log | grep \" module \"").split("\n").sort + assert log.size == 1 + assert log[0].include?("modules/a") + assert !File.exist?(File.join(@ws_dir, "modules", "b")) + assert File.exist?(File.join(@ws_dir, "modules", "a")) + assert File.exist?(File.join(@ws_dir, "modules", "a", "file_a.c")) + end + end + + def test_files_are_synchronized_subtree_deep + mod_git_dir = create_all_module_git("mod_all") + mod_a_info = RIM::ModuleInfo.new("file://" + mod_git_dir, "modules/b_src", "master", nil, nil, "mod_b/src") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod_a_info]) + cut.sync + RIM::git_session(@ws_dir) do |s| + assert !File.exist?(File.join(@ws_dir, "modules", "b_src")) + s.execute("git checkout rim/testbr") + check_not_dirty(s) + log = s.execute("git log | grep \" module \"").split("\n").sort + assert log.size == 1 + assert log[0].include?("modules/b_src") + assert File.exist?(File.join(@ws_dir, "modules", "b_src", "file_b.c")) + end + end + + + def test_files_are_synchronized_on_existing_branch + mod1_info = create_module_git("mod1") + mod2_info = create_module_git("mod2") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) + cut.sync + `echo ' changed' >> #{File.join(@ws_dir, "readme")}` + RIM::git_session(@ws_dir) do |s| + s.execute("git commit . -m \"Changed ws file\"") + end + remote_path = path_from_module_info(mod1_info) + `echo ' changed' >> #{File.join(remote_path, "readme.txt")}` + RIM::git_session(remote_path) do |f| + f.execute("git commit . -m \"Changed mod1 file\"") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git checkout rim/testbr") + check_not_dirty(s) + log = s.execute("git log | grep \" module \"").split("\n").sort + assert log.size == 3 + assert log[0].include?("mod1") + assert log[1].include?("mod1") + assert log[2].include?("mod2") + assert File.exist?(File.join(@ws_dir, "mod1")) + `cat #{File.join(@ws_dir, "mod1/readme.txt")}`.start_with?("Content. changed") + assert File.exist?(File.join(@ws_dir, "mod2")) + end + end + + def test_files_are_synchronized_on_new_branch_if_behind_last_remote_commit + mod1_info = create_module_git("mod1") + mod2_info = create_module_git("mod2") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info, mod2_info]) + cut.sync + `echo ' changed' >> #{File.join(@ws_remote_dir, "readme")}` + RIM::git_session(@ws_remote_dir) do |s| + s.execute("git commit . -m \"Changed ws file\"") + end + RIM::git_session(@ws_dir) do |s| + s.execute("git pull") + assert !has_ancestor?(s, "rim/testbr", "testbr") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + assert has_ancestor?(s, "rim/testbr", "testbr") + end + end + + def test_existing_non_ignored_files_are_removed_during_sync + mod1_info = create_module_git("mod1") + create_ws_git("testbr") do |s| + FileUtils.mkdir_p(File.join(@ws_remote_dir, "mod1")) + File.open(File.join(@ws_remote_dir, "mod1", "existing.txt"), "w") do |f| + f.write("Content") + end + s.execute("git add --all mod1") + s.execute("git commit -m \"Create existing file within mod1\"") + end + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git rebase rim/testbr") + assert !File.exists?(File.join(@ws_dir, "mod1", "existing.txt")) + end + end + + def test_case_change_in_filename_is_synced_correctly + mod1_info = create_module_git("mod1") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) + cut.sync + remote_path = path_from_module_info(mod1_info) + RIM::git_session(remote_path) do |s| + FileUtils.mv(File.join(remote_path, "readme.txt"), File.join(remote_path, "readme.tx_")) + s.execute("git add --all .") + s.execute("git commit -m \"Temporary change of filename within mod1\"") + FileUtils.mv(File.join(remote_path, "readme.tx_"), File.join(remote_path, "Readme.txt")) + s.execute("git add --all .") + s.execute("git commit -m \"Changed case in filename within mod1\"") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git rebase rim/testbr") + out = s.execute("git show --name-only") + assert out.include?("readme.txt") + assert out.include?("Readme.txt") + end + end + + def test_sync_on_different_branches + mod1_info = create_module_git("mod1") + create_ws_git("testbr") + cut = RIM::SyncHelper.new(@ws_dir, @logger, [mod1_info]) + cut.sync + remote_path = path_from_module_info(mod1_info) + RIM::git_session(remote_path) do |s| + FileUtils.mv(File.join(remote_path, "readme.txt"), File.join(remote_path, "readme.tx_")) + s.execute("git add --all .") + s.execute("git commit -m \"Temporary change of filename within mod1\"") + FileUtils.mv(File.join(remote_path, "readme.tx_"), File.join(remote_path, "Readme.txt")) + s.execute("git add --all .") + s.execute("git commit -m \"Changed case in filename within mod1\"") + end + RIM::git_session(@ws_dir) do |s| + s.execute("git checkout -b branch2") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git rebase rim/branch2") + out = s.execute("git show --name-only") + assert out.include?("Readme.txt") + end + RIM::git_session(remote_path) do |s| + `echo ' changed' >> #{File.join(remote_path, "Readme.txt")}` + s.execute("git commit . -m \"Changed module file\"") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git rebase rim/branch2") + s.execute("git checkout testbr") + s.execute("git reset --hard branch2~1") + s.execute("git push origin branch2:branch2") + end + cut.sync + RIM::git_session(@ws_dir) do |s| + s.execute("git reset --hard rim/testbr") + out = s.execute("git show --name-only") + assert out.include?("Readme.txt") + end + end + +private + def create_ws_git(branch = "master") + FileUtils.mkdir_p(@ws_remote_dir) + RIM::git_session(@ws_remote_dir) do |s| + s.execute("git init") + s.execute("git checkout -B #{branch}") + File.open(File.join(@ws_remote_dir, ".gitignore"), "w") do |f| + f.write(".rim") + end + File.open(File.join(@ws_remote_dir, "readme"), "w") do |f| + f.write("Content") + end + s.execute("git add .") + s.execute("git commit -m \"Initial commit\"") + yield s if block_given? + end + FileUtils.mkdir_p(@ws_dir) + RIM::git_session(@ws_dir) do |s| + s.execute("git clone #{@ws_remote_dir} #{@ws_dir}") + end + end + + def create_module_git(name, branch = "master") + git_dir = File.join(@remote_git_dir, name) + FileUtils.mkdir_p(git_dir) + RIM::git_session(git_dir) do |s| + s.execute("git init") + s.execute("git checkout -B #{branch}") + File.open(File.join(git_dir, "readme.txt"), "w") do |f| + f.write("Content.") + end + s.execute("git add .") + s.execute("git commit -m \"Initial commit\"") + end + return RIM::ModuleInfo.new("file://" + git_dir, name, branch) + end + + def create_all_module_git(name, branch = "master") + git_dir = File.join(@remote_git_dir, name) + FileUtils.mkdir_p(File.join(git_dir,"mod_a")) + FileUtils.mkdir_p(File.join(git_dir,"mod_b","src")) + RIM::git_session(git_dir) do |s| + s.execute("git init") + s.execute("git checkout -B #{branch}") + File.open(File.join(git_dir, "readme.txt"), "w") do |f| + f.write("Content.") + end + File.open(File.join(git_dir, "mod_a", "file_a.c"), "w") do |f| + f.write("Content.") + end + File.open(File.join(git_dir, "mod_b", "src", "file_b.c"), "w") do |f| + f.write("Content.") + end + s.execute("git add .") + s.execute("git commit -m \"Initial commit\"") + end + return git_dir + end + + def path_from_module_info(module_info) + module_info.remote_url.gsub(/^file:\/\//, "") + end + + def check_not_dirty(session) + status = RIM::StatusBuilder.new.rev_status(session, "HEAD") + status.modules.each do |m| + assert !m.dirty? + end + end + + def has_ancestor?(session, rev, ancestor) + rev = session.execute("git rev-list #{rev}").include?(session.rev_sha1(ancestor)) + end + +end