summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/checks/timed_logger_spec.rb
blob: 726f2bf21449101e63a984f3ed7977360a9b3cc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# frozen_string_literal: true

require 'spec_helper'

describe Gitlab::Checks::TimedLogger do
  let(:log_messages) do
    {
      foo: "Foo message..."
    }
  end

  class FooCheck
    attr_accessor :logger

    INTERNAL_TIMEOUT = 50.seconds.freeze

    def initialize(start_time, ref)
      @logger = Gitlab::Checks::TimedLogger.new(start_time: start_time, timeout: INTERNAL_TIMEOUT)
      @logger.log << "Checking ref: #{ref}"
    end

    def bar_check
      2 + 2
    end

    def grpc_check
      raise GRPC::DeadlineExceeded
    end
  end

  describe '#log_timed' do
    it 'logs message' do
      start = Time.now
      check = FooCheck.new(start, "bar")

      Timecop.freeze(start + 30.seconds) do
        check.logger.log_timed(log_messages[:foo], start) { check.bar_check }
      end

      expect(check.logger.log).to eq(["Checking ref: bar", "Foo message... (30000.0ms)"])
    end

    context 'when time limit was reached' do
      it 'cancels action' do
        start = Time.now
        check = FooCheck.new(start, "bar")

        Timecop.freeze(start + 50.seconds) do
          expect do
            check.logger.log_timed(log_messages[:foo], start) do
              check.bar_check
            end
          end.to raise_error(described_class::TimeoutError)
        end

        expect(check.logger.log).to eq(["Checking ref: bar", "Foo message... (cancelled)"])
      end

      it 'cancels action with time elapsed if work was performed' do
        start = Time.now
        check = FooCheck.new(start, "bar")

        Timecop.freeze(start + 30.seconds) do
          expect do
            check.logger.log_timed(log_messages[:foo], start) do
              check.grpc_check
            end
          end.to raise_error(described_class::TimeoutError)

          expect(check.logger.log).to eq(["Checking ref: bar", "Foo message... (cancelled after 30000.0ms)"])
        end
      end
    end
  end
end