summaryrefslogtreecommitdiff
path: root/spec/tasks
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-09-28 12:45:46 +0200
committerRémy Coutable <remy@rymai.me>2016-11-30 10:34:59 +0100
commitfbbf177e3b604bebce3b10f8eea8920ff5606fca (patch)
tree0767679c9a58b642ebbd54499c0ad6f824610d18 /spec/tasks
parent098066050d148deb024fdec6c36bfe9320c674bd (diff)
downloadgitlab-ce-fbbf177e3b604bebce3b10f8eea8920ff5606fca.tar.gz
New `gitlab:workhorse:install` rake task
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'spec/tasks')
-rw-r--r--spec/tasks/gitlab/task_helpers_spec.rb87
-rw-r--r--spec/tasks/gitlab/workhorse_rake_spec.rb117
2 files changed, 204 insertions, 0 deletions
diff --git a/spec/tasks/gitlab/task_helpers_spec.rb b/spec/tasks/gitlab/task_helpers_spec.rb
new file mode 100644
index 00000000000..2a2d4a39ba8
--- /dev/null
+++ b/spec/tasks/gitlab/task_helpers_spec.rb
@@ -0,0 +1,87 @@
+require 'spec_helper'
+require 'rake'
+
+describe 'gitlab:workhorse namespace rake task' do
+ before :all do
+ Rake.application.rake_require 'tasks/gitlab/task_helpers'
+
+ # empty task as env is already loaded
+ Rake::Task.define_task :environment
+ end
+
+ describe '#checkout_or_clone_tag' do
+ let(:repo) { 'https://gitlab.com/gitlab-org/gitlab-test.git' }
+ let(:clone_path) { Rails.root.join('tmp/tests/task_helpers_tests').to_s }
+ let(:tag) { 'v1.1.0' }
+ before do
+ FileUtils.rm_rf(clone_path)
+ allow_any_instance_of(Object).to receive(:run_command)
+ expect_any_instance_of(Object).to receive(:reset_to_tag).with(tag)
+ end
+
+ after do
+ FileUtils.rm_rf(clone_path)
+ end
+
+ context 'target_dir does not exist' do
+ it 'clones the repo, retrieve the tag from origin, and checkout the tag' do
+ expect(Dir).to receive(:chdir).and_call_original
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} clone -- #{repo} #{clone_path}]) { FileUtils.mkdir_p(clone_path) } # Fake the cloning
+
+ checkout_or_clone_tag(tag: tag, repo: repo, target_dir: clone_path)
+ end
+ end
+
+ context 'target_dir exists' do
+ before do
+ FileUtils.mkdir_p(clone_path)
+ end
+
+ it 'fetch and checkout the tag' do
+ expect(Dir).to receive(:chdir).twice.and_call_original
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} fetch --tags --quiet])
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} checkout --quiet #{tag}])
+
+ checkout_or_clone_tag(tag: tag, repo: repo, target_dir: clone_path)
+ end
+ end
+ end
+
+ describe '#reset_to_tag' do
+ let(:tag) { 'v1.1.0' }
+ before do
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} reset --hard #{tag}])
+ end
+
+ context 'when the tag is not checked out locally' do
+ before do
+ expect(Gitlab::Popen).
+ to receive(:popen).with(%W[#{Gitlab.config.git.bin_path} describe -- #{tag}]).and_return(['', 42])
+ end
+
+ it 'fetch origin, ensure the tag exists, and resets --hard to the given tag' do
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} fetch origin])
+ expect_any_instance_of(Object).
+ to receive(:run_command).with(%W[#{Gitlab.config.git.bin_path} describe -- origin/#{tag}]).and_return(tag)
+
+ reset_to_tag(tag)
+ end
+ end
+
+ context 'when the tag is checked out locally' do
+ before do
+ expect(Gitlab::Popen).
+ to receive(:popen).with(%W[#{Gitlab.config.git.bin_path} describe -- #{tag}]).and_return([tag, 0])
+ end
+
+ it 'resets --hard to the given tag' do
+ reset_to_tag(tag)
+ end
+ end
+ end
+end
diff --git a/spec/tasks/gitlab/workhorse_rake_spec.rb b/spec/tasks/gitlab/workhorse_rake_spec.rb
new file mode 100644
index 00000000000..c8ad004282a
--- /dev/null
+++ b/spec/tasks/gitlab/workhorse_rake_spec.rb
@@ -0,0 +1,117 @@
+require 'spec_helper'
+require 'rake'
+
+describe 'gitlab:workhorse namespace rake task' do
+ before :all do
+ Rake.application.rake_require 'tasks/gitlab/task_helpers'
+ Rake.application.rake_require 'tasks/gitlab/workhorse'
+
+ # empty task as env is already loaded
+ Rake::Task.define_task :environment
+ end
+
+ def run_rake_task(task_name, *args)
+ Rake::Task[task_name].reenable
+ Rake.application.invoke_task("#{task_name}[#{args.join(',')}]")
+ end
+
+ describe 'install' do
+ let(:repo) { 'https://gitlab.com/gitlab-org/gitlab-workhorse.git' }
+ let(:clone_path) { Rails.root.join('tmp/tests/gitlab-workhorse').to_s }
+ let(:tag) { "v#{File.read(Rails.root.join(Gitlab::Workhorse::VERSION_FILE)).chomp}" }
+ before do
+ # avoid writing task output to spec progress
+ allow($stdout).to receive :write
+ allow(ENV).to receive(:[])
+ end
+
+ context 'no dir given' do
+ it 'aborts and display a help message' do
+ expect { run_rake_task('gitlab:workhorse:install') }.to raise_error /Please specify the directory where you want to install gitlab-workhorse/
+ end
+ end
+
+ context 'when an underlying Git command fail' do
+ it 'aborts and display a help message' do
+ expect_any_instance_of(Object).
+ to receive(:checkout_or_clone_tag).and_raise 'Git error'
+
+ expect { run_rake_task('gitlab:workhorse:install', clone_path) }.to raise_error 'Git error'
+ end
+ end
+
+ describe 'checkout or clone' do
+ before do
+ expect(Dir).to receive(:chdir).with(clone_path)
+ end
+
+ it 'calls checkout_or_clone_tag with the right arguments' do
+ expect_any_instance_of(Object).
+ to receive(:checkout_or_clone_tag).with(tag: tag, repo: repo, target_dir: clone_path)
+
+ run_rake_task('gitlab:workhorse:install', clone_path)
+ end
+
+ context 'given a specific repo' do
+ before do
+ expect(ENV).to receive(:[]).with('GITLAB_WORKHORSE_REPO').and_return('https://gitlab.com/user1/gitlab-workhorse.git')
+ end
+
+ it 'calls checkout_or_clone_tag with the given repo' do
+ expect_any_instance_of(Object).
+ to receive(:checkout_or_clone_tag).with(tag: tag, repo: 'https://gitlab.com/user1/gitlab-workhorse.git', target_dir: clone_path)
+
+ run_rake_task('gitlab:workhorse:install', clone_path)
+ end
+ end
+
+ context 'given a specific version' do
+ before do
+ allow(ENV).to receive(:[]).with('GITLAB_WORKHORSE_VERSION').and_return('42.42.0')
+ end
+
+ it 'calls checkout_or_clone_tag with the given repo' do
+ expect_any_instance_of(Object).
+ to receive(:checkout_or_clone_tag).with(tag: 'v42.42.0', repo: repo, target_dir: clone_path)
+
+ run_rake_task('gitlab:workhorse:install', clone_path)
+ end
+ end
+ end
+
+ describe 'gmake/make' do
+ before do
+ FileUtils.mkdir_p(clone_path)
+ expect(Dir).to receive(:chdir).with(clone_path).and_call_original
+ end
+
+ context 'gmake is available' do
+ before do
+ expect_any_instance_of(Object).to receive(:checkout_or_clone_tag)
+ allow_any_instance_of(Object).to receive(:run_command).with(['gmake']).and_return(true)
+ end
+
+ it 'calls gmake in the gitlab-workhorse directory' do
+ expect(Gitlab::Popen).to receive(:popen).with(%w[which gmake]).and_return(['/usr/bin/gmake', 0])
+ expect_any_instance_of(Object).to receive(:run_command).with(['gmake']).and_return(true)
+
+ run_rake_task('gitlab:workhorse:install', clone_path)
+ end
+ end
+
+ context 'gmake is not available' do
+ before do
+ expect_any_instance_of(Object).to receive(:checkout_or_clone_tag)
+ allow_any_instance_of(Object).to receive(:run_command).with(['make']).and_return(true)
+ end
+
+ it 'calls make in the gitlab-workhorse directory' do
+ expect(Gitlab::Popen).to receive(:popen).with(%w[which gmake]).and_return(['', 42])
+ expect_any_instance_of(Object).to receive(:run_command).with(['make']).and_return(true)
+
+ run_rake_task('gitlab:workhorse:install', clone_path)
+ end
+ end
+ end
+ end
+end