Skip to content

Commit 706a4c1

Browse files
committed
Log to stderr when we encounter an unsupported vulnerability
1 parent eb07c75 commit 706a4c1

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

lib/cc/engine/bundler_audit/analyzer.rb

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@ module BundlerAudit
44
class Analyzer
55
GemfileLockNotFound = Class.new(StandardError)
66

7-
def initialize(directory:, io: STDOUT)
7+
def initialize(directory:, stdout: STDOUT, stderr: STDERR)
88
@directory = directory
9-
@io = io
9+
@stdout = stdout
10+
@stderr = stderr
1011
end
1112

1213
def run
1314
if gemfile_lock_exists?
1415
Dir.chdir(directory) do
1516
Bundler::Audit::Scanner.new.scan do |vulnerability|
16-
issue = issue_for_vulerability(vulnerability)
17-
18-
io.print("#{issue.to_json}\0")
17+
if issue = issue_for_vulerability(vulnerability)
18+
stdout.print("#{issue.to_json}\0")
19+
else
20+
stderr.print("Unsupported vulnerability: #{vulnerability.class.name}")
21+
end
1922
end
2023
end
2124
else
@@ -25,7 +28,7 @@ def run
2528

2629
private
2730

28-
attr_reader :directory, :io
31+
attr_reader :directory, :stdout, :stderr
2932

3033
def issue_for_vulerability(vulnerability)
3134
case vulnerability

spec/cc/engine/bundler_audit/analyzer_spec.rb

+25-9
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,51 @@ module CC::Engine::BundlerAudit
55
describe "#run" do
66
it "raises an error when no Gemfile.lock exists" do
77
directory = fixture_directory("no_gemfile_lock")
8-
io = StringIO.new
98

10-
expect { Analyzer.new(directory: directory, io: io).run }.
9+
expect { Analyzer.new(directory: directory).run }.
1110
to raise_error(Analyzer::GemfileLockNotFound)
1211
end
1312

1413
it "emits issues for unpatched gems in Gemfile.lock" do
15-
io = StringIO.new
1614
directory = fixture_directory("unpatched_versions")
1715

18-
issues = analyze_directory(directory, io)
16+
issues = analyze_directory(directory)
1917

2018
expect(issues).to eq(expected_issues("unpatched_versions"))
2119
end
2220

2321
it "emits issues for insecure sources in Gemfile.lock" do
24-
io = StringIO.new
2522
directory = fixture_directory("insecure_source")
2623

27-
issues = analyze_directory(directory, io)
24+
issues = analyze_directory(directory)
2825

2926
expect(issues).to eq(expected_issues("insecure_source"))
3027
end
3128

32-
def analyze_directory(directory, io)
33-
audit = Analyzer.new(directory: directory, io: io)
29+
it "logs to stderr when we encounter an unsupported vulnerability" do
30+
directory = fixture_directory("unpatched_versions")
31+
stderr = StringIO.new
32+
33+
stub_vulnerability("UnhandledVulnerability")
34+
35+
analyze_directory(directory, stderr: stderr)
36+
37+
expect(stderr.string).to eq("Unsupported vulnerability: UnhandledVulnerability")
38+
end
39+
40+
def analyze_directory(directory, stdout: StringIO.new, stderr: StringIO.new)
41+
audit = Analyzer.new(directory: directory, stdout: stdout, stderr: stderr)
3442
audit.run
3543

36-
io.string.split("\0").map { |issue| JSON.load(issue) }
44+
stdout.string.split("\0").map { |issue| JSON.load(issue) }
45+
end
46+
47+
def stub_vulnerability(name)
48+
scanner = double(:scanner)
49+
vulnerability = double(:vulnerability, class: double(name: name))
50+
51+
allow(Bundler::Audit::Scanner).to receive(:new).and_return(scanner)
52+
allow(scanner).to receive(:scan).and_yield(vulnerability)
3753
end
3854

3955
def expected_issues(fixture)

0 commit comments

Comments
 (0)