housekeeping_service_spec.rb 3.02 KB
Newer Older
1 2 3
require 'spec_helper'

describe Projects::HousekeepingService do
4
  subject { described_class.new(project) }
5
  let(:project) { create(:project, :repository) }
6

7 8 9 10
  before do
    project.reset_pushes_since_gc
  end

Yorick Peterse's avatar
Yorick Peterse committed
11 12 13
  after do
    project.reset_pushes_since_gc
  end
14

Yorick Peterse's avatar
Yorick Peterse committed
15
  describe '#execute' do
16
    it 'enqueues a sidekiq job' do
Jacob Vosmaer's avatar
Jacob Vosmaer committed
17 18 19 20
      expect(subject).to receive(:try_obtain_lease).and_return(:the_uuid)
      expect(subject).to receive(:lease_key).and_return(:the_lease_key)
      expect(subject).to receive(:task).and_return(:the_task)
      expect(GitGarbageCollectWorker).to receive(:perform_async).with(project.id, :the_task, :the_lease_key, :the_uuid)
21

22
      subject.execute
23

24
      expect(project.reload.pushes_since_gc).to eq(0)
25 26
    end

Lin Jen-Shin's avatar
Lin Jen-Shin committed
27
    it 'yields the block if given' do
Lin Jen-Shin's avatar
Lin Jen-Shin committed
28 29
      expect do |block|
        subject.execute(&block)
Lin Jen-Shin's avatar
Lin Jen-Shin committed
30 31 32
      end.to yield_with_no_args
    end

33
    context 'when no lease can be obtained' do
34
      before do
35 36
        expect(subject).to receive(:try_obtain_lease).and_return(false)
      end
37

38 39 40 41 42 43 44 45 46
      it 'does not enqueue a job' do
        expect(GitGarbageCollectWorker).not_to receive(:perform_async)

        expect { subject.execute }.to raise_error(Projects::HousekeepingService::LeaseTaken)
      end

      it 'does not reset pushes_since_gc' do
        expect do
          expect { subject.execute }.to raise_error(Projects::HousekeepingService::LeaseTaken)
Yorick Peterse's avatar
Yorick Peterse committed
47
        end.not_to change { project.pushes_since_gc }
48
      end
Lin Jen-Shin's avatar
Lin Jen-Shin committed
49 50

      it 'does not yield' do
Lin Jen-Shin's avatar
Lin Jen-Shin committed
51 52
        expect do |block|
          expect { subject.execute(&block) }
Lin Jen-Shin's avatar
Lin Jen-Shin committed
53 54 55
            .to raise_error(Projects::HousekeepingService::LeaseTaken)
        end.not_to yield_with_no_args
      end
56 57 58
    end
  end

Yorick Peterse's avatar
Yorick Peterse committed
59
  describe '#needed?' do
60 61 62 63 64 65 66 67 68
    it 'when the count is low enough' do
      expect(subject.needed?).to eq(false)
    end

    it 'when the count is high enough' do
      allow(project).to receive(:pushes_since_gc).and_return(10)
      expect(subject.needed?).to eq(true)
    end
  end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
69

Yorick Peterse's avatar
Yorick Peterse committed
70
  describe '#increment!' do
Jacob Vosmaer's avatar
Jacob Vosmaer committed
71
    it 'increments the pushes_since_gc counter' do
72 73 74 75
      expect do
        subject.increment!
      end.to change { project.pushes_since_gc }.from(0).to(1)
    end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
76
  end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
77

78
  it 'goes through all three housekeeping tasks, executing only the highest task when there is overlap' do
Jacob Vosmaer's avatar
Jacob Vosmaer committed
79 80 81 82
    allow(subject).to receive(:try_obtain_lease).and_return(:the_uuid)
    allow(subject).to receive(:lease_key).and_return(:the_lease_key)

    # At push 200
83 84
    expect(GitGarbageCollectWorker).to receive(:perform_async).with(project.id, :gc, :the_lease_key, :the_uuid)
      .exactly(1).times
Jacob Vosmaer's avatar
Jacob Vosmaer committed
85
    # At push 50, 100, 150
86 87
    expect(GitGarbageCollectWorker).to receive(:perform_async).with(project.id, :full_repack, :the_lease_key, :the_uuid)
      .exactly(3).times
Jacob Vosmaer's avatar
Jacob Vosmaer committed
88
    # At push 10, 20, ... (except those above)
89 90
    expect(GitGarbageCollectWorker).to receive(:perform_async).with(project.id, :incremental_repack, :the_lease_key, :the_uuid)
      .exactly(16).times
Jacob Vosmaer's avatar
Jacob Vosmaer committed
91 92 93 94 95 96 97 98

    201.times do
      subject.increment!
      subject.execute if subject.needed?
    end

    expect(project.pushes_since_gc).to eq(1)
  end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
99
end