diff --git a/lib/coverband.rb b/lib/coverband.rb index e1b4d07b..8d943cae 100644 --- a/lib/coverband.rb +++ b/lib/coverband.rb @@ -5,6 +5,7 @@ require 'redis' require 'coverband/version' +require 'coverband/at_exit' require 'coverband/configuration' require 'coverband/adapters/base' require 'coverband/adapters/redis_store' @@ -51,6 +52,7 @@ def self.configuration def self.start Coverband::Collectors::Coverage.instance + AtExit.register Background.start if configuration.background_reporting_enabled && !RackServerCheck.running? end diff --git a/lib/coverband/at_exit.rb b/lib/coverband/at_exit.rb new file mode 100644 index 00000000..e0698baf --- /dev/null +++ b/lib/coverband/at_exit.rb @@ -0,0 +1,18 @@ +module Coverband + class AtExit + @semaphore = Mutex.new + + def self.register + return if @at_exit_registered + @semaphore.synchronize do + return if @at_exit_registered + @at_exit_registered = true + at_exit do + ::Coverband::Background.stop + Coverband::Collectors::Coverage.instance.report_coverage(true) + Coverband.configuration.logger&.debug('Coverband: Reported coverage before exit') + end + end + end + end +end diff --git a/lib/coverband/integrations/background.rb b/lib/coverband/integrations/background.rb index 95aea130..1da4126d 100644 --- a/lib/coverband/integrations/background.rb +++ b/lib/coverband/integrations/background.rb @@ -29,11 +29,6 @@ def self.start end end end - at_exit do - stop - Coverband::Collectors::Coverage.instance.report_coverage(true) - logger&.debug('Coverband: Reported coverage before exit') - end end end end diff --git a/lib/coverband/integrations/middleware.rb b/lib/coverband/integrations/middleware.rb index 41a201bc..8e562e69 100644 --- a/lib/coverband/integrations/middleware.rb +++ b/lib/coverband/integrations/middleware.rb @@ -9,10 +9,11 @@ def initialize(app) def call(env) @app.call(env) ensure + AtExit.register if Coverband.configuration.background_reporting_enabled - Coverband::Background.start + Background.start else - Coverband::Collectors::Coverage.instance.report_coverage + Collectors::Coverage.instance.report_coverage end end end diff --git a/test/unit/at_exit_test.rb b/test/unit/at_exit_test.rb new file mode 100644 index 00000000..5ffe426d --- /dev/null +++ b/test/unit/at_exit_test.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require File.expand_path('../test_helper', File.dirname(__FILE__)) + +class AtExitTest < Minitest::Test + test 'only registers once' do + Coverband::AtExit.instance_eval { @at_exit_registered = nil } + Coverband::AtExit.expects(:at_exit).yields.once.returns(true) + 2.times { Coverband::AtExit.register } + end +end + + diff --git a/test/unit/background_test.rb b/test/unit/background_test.rb index f829038b..21849e69 100644 --- a/test/unit/background_test.rb +++ b/test/unit/background_test.rb @@ -22,7 +22,6 @@ def test_start Thread.expects(:new).yields.returns(ThreadDouble.new) Coverband::Background.expects(:loop).yields Coverband::Background.expects(:sleep).with(30) - Coverband::Background.expects(:at_exit).returns(false) Coverband::Collectors::Coverage.instance.expects(:report_coverage).once 2.times { Coverband::Background.start } end