backup_rake_spec.rb 3.04 KB
Newer Older
Hugo Duksis's avatar
Hugo Duksis committed
1 2 3 4 5
require 'spec_helper'
require 'rake'

describe 'gitlab:app namespace rake task' do
  before :all do
6
    Rake.application.rake_require "tasks/gitlab/task_helpers"
Hugo Duksis's avatar
Hugo Duksis committed
7
    Rake.application.rake_require "tasks/gitlab/backup"
Andrew Kumanyaev's avatar
Andrew Kumanyaev committed
8
    Rake.application.rake_require "tasks/gitlab/shell"
Hugo Duksis's avatar
Hugo Duksis committed
9 10 11 12
    # empty task as env is already loaded
    Rake::Task.define_task :environment
  end

13 14 15 16 17
  def run_rake_task(task_name)
    Rake::Task[task_name].reenable
    Rake.application.invoke_task task_name
  end

Hugo Duksis's avatar
Hugo Duksis committed
18 19 20
  describe 'backup_restore' do
    before do
      # avoid writing task output to spec progress
21
      allow($stdout).to receive :write
Hugo Duksis's avatar
Hugo Duksis committed
22 23 24 25
    end

    context 'gitlab version' do
      before do
26
        Dir.stub glob: []
27
        allow(Dir).to receive :chdir
28 29
        File.stub exists?: true
        Kernel.stub system: true
Andrew Kumanyaev's avatar
Andrew Kumanyaev committed
30 31 32
        FileUtils.stub cp_r: true
        FileUtils.stub mv: true
        Rake::Task["gitlab:shell:setup"].stub invoke: true
Hugo Duksis's avatar
Hugo Duksis committed
33 34
      end

35
      let(:gitlab_version) { Gitlab::VERSION }
Hugo Duksis's avatar
Hugo Duksis committed
36

Johannes Schleifenbaum's avatar
Johannes Schleifenbaum committed
37
      it 'should fail on mismatch' do
38
        YAML.stub load_file: {gitlab_version: "not #{gitlab_version}" }
39 40 41
        expect { run_rake_task('gitlab:backup:restore') }.to(
          raise_error SystemExit
        )
Hugo Duksis's avatar
Hugo Duksis committed
42 43 44
      end

      it 'should invoke restoration on mach' do
45
        YAML.stub load_file: {gitlab_version: gitlab_version}
46 47 48
        expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke
        expect(Rake::Task["gitlab:backup:repo:restore"]).to receive :invoke
        expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke
49
        expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error
Hugo Duksis's avatar
Hugo Duksis committed
50 51 52 53
      end
    end

  end # backup_restore task
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

  describe 'backup_create' do
    def tars_glob
      Dir.glob(File.join(Gitlab.config.backup.path, '*_gitlab_backup.tar'))
    end

    before :all do
      # Record the existing backup tars so we don't touch them
      existing_tars = tars_glob

      # Redirect STDOUT and run the rake task
      orig_stdout = $stdout
      $stdout = StringIO.new
      run_rake_task('gitlab:backup:create')
      $stdout = orig_stdout

      @backup_tar = (tars_glob - existing_tars).first
    end

    after :all do
      FileUtils.rm(@backup_tar)
    end

    it 'should set correct permissions on the tar file' do
      expect(File.exist?(@backup_tar)).to be_truthy
      expect(File::Stat.new(@backup_tar).mode.to_s(8)).to eq('100600')
    end

    it 'should set correct permissions on the tar contents' do
      tar_contents, exit_status = Gitlab::Popen.popen(
        %W{tar -tvf #{@backup_tar} db uploads repositories}
      )
      expect(exit_status).to eq(0)
      expect(tar_contents).to match('db/')
      expect(tar_contents).to match('uploads/')
      expect(tar_contents).to match('repositories/')
90
      expect(tar_contents).not_to match(/^.{4,9}[rwx].*(db|uploads|repositories)\/$/)
91 92 93 94 95 96 97 98 99 100
    end

    it 'should delete temp directories' do
      temp_dirs = Dir.glob(
        File.join(Gitlab.config.backup.path, '{db,repositories,uploads}')
      )

      expect(temp_dirs).to be_empty
    end
  end # backup_create task
Hugo Duksis's avatar
Hugo Duksis committed
101
end # gitlab:app namespace