Skip to content

Commit a9e8aff

Browse files
committed
Add Instrumentation::Gateway#pushed? method
1 parent 1e9d70f commit a9e8aff

File tree

3 files changed

+51
-23
lines changed

3 files changed

+51
-23
lines changed

lib/datadog/appsec/instrumentation/gateway.rb

+11-22
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,23 @@
11
# frozen_string_literal: true
22

3+
require_relative 'gateway/middleware'
4+
35
module Datadog
46
module AppSec
57
# Instrumentation for AppSec
68
module Instrumentation
79
# Instrumentation gateway implementation
810
class Gateway
9-
# Instrumentation gateway middleware
10-
class Middleware
11-
attr_reader :key, :block
12-
13-
def initialize(key, &block)
14-
@key = key
15-
@block = block
16-
end
17-
18-
def call(stack, env)
19-
@block.call(stack, env)
20-
end
21-
end
22-
23-
private_constant :Middleware
24-
2511
def initialize
2612
@middlewares = Hash.new { |h, k| h[k] = [] }
13+
@pushed_events = {}
2714
end
2815

2916
def push(name, env, &block)
30-
block ||= -> {}
17+
@pushed_events[name] = true
3118

32-
middlewares_for_name = middlewares[name]
19+
block ||= -> {}
20+
middlewares_for_name = @middlewares[name]
3321

3422
return [block.call, nil] if middlewares_for_name.empty?
3523

@@ -48,14 +36,15 @@ def push(name, env, &block)
4836
end
4937

5038
def watch(name, key, &block)
51-
@middlewares[name] << Middleware.new(key, &block) unless middlewares[name].any? { |m| m.key == key }
39+
@middlewares[name] << Middleware.new(key, &block) unless @middlewares[name].any? { |m| m.key == key }
5240
end
5341

54-
private
55-
56-
attr_reader :middlewares
42+
def pushed?(name)
43+
@pushed_events.key?(name)
44+
end
5745
end
5846

47+
# NOTE: This left as-is and will be depricated soon.
5948
def self.gateway
6049
@gateway ||= Gateway.new # TODO: not thread safe
6150
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# frozen_string_literal: true
2+
3+
module Datadog
4+
module AppSec
5+
module Instrumentation
6+
class Gateway
7+
# NOTE: This class extracted as-is and will be deprecated
8+
# Instrumentation gateway middleware
9+
class Middleware
10+
attr_reader :key, :block
11+
12+
def initialize(key, &block)
13+
@key = key
14+
@block = block
15+
end
16+
17+
def call(stack, env)
18+
@block.call(stack, env)
19+
end
20+
end
21+
end
22+
end
23+
end
24+
end

spec/datadog/appsec/instrumentation/gateway_spec.rb

+16-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
RSpec.describe Datadog::AppSec::Instrumentation::Gateway do
77
subject(:gateway) { described_class.new }
8-
let(:middlewares) { gateway.send(:middlewares) }
8+
let(:middlewares) { gateway.instance_variable_get(:@middlewares) }
99

1010
describe '#watch' do
1111
it 'stores middleware' do
@@ -81,4 +81,19 @@
8181
expect(env_2).to eq({ a: :b, c: :d })
8282
end
8383
end
84+
85+
describe '#pushed?' do
86+
it { expect(gateway.pushed?('event.0')).to be(false) }
87+
88+
it 'returns true if event was pushed' do
89+
expect { gateway.push('event.1', {}) }.to change { gateway.pushed?('event.1') }
90+
.from(false).to(true)
91+
92+
expect { gateway.push('event.2', {}) }.to change { gateway.pushed?('event.2') }
93+
.from(false).to(true)
94+
95+
expect { gateway.push('event.2', {}) }.not_to change { gateway.pushed?('event.2') }
96+
.from(true)
97+
end
98+
end
8499
end

0 commit comments

Comments
 (0)