From 0dc0c0cec97cbdea04e278143e4711cfa0d3bd03 Mon Sep 17 00:00:00 2001 From: mo khan Date: Mon, 14 Sep 2020 16:40:00 -0600 Subject: test: add spec to run gemnasium-maven scanner --- .gitignore | 1 + spec/fixtures/java/maven/custom-tls/pom.xml | 27 +++++++++++++++++++ spec/gemnasium_maven_spec.rb | 26 +++++++++++------- spec/spec_helper.rb | 3 +++ spec/support/docker.rb | 29 ++++++++++++++++++++ spec/support/fixture_file_helper.rb | 15 +++++++++++ spec/support/project.rb | 42 +++++++++++++++++++++++++++++ tmp/.keep | 0 8 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 spec/fixtures/java/maven/custom-tls/pom.xml create mode 100644 spec/support/docker.rb create mode 100644 spec/support/fixture_file_helper.rb create mode 100644 spec/support/project.rb create mode 100644 tmp/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9a5aec --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +tmp diff --git a/spec/fixtures/java/maven/custom-tls/pom.xml b/spec/fixtures/java/maven/custom-tls/pom.xml new file mode 100644 index 0000000..6c647c0 --- /dev/null +++ b/spec/fixtures/java/maven/custom-tls/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + com.gitlab.secure + license-scanning + jar + 1.0-SNAPSHOT + example + + + com.fasterxml.jackson.core + jackson-core + 2.10.0 + + + + + custom + https://maven.test/maven2 + + + + + custom + https://maven.test/maven2 + + + diff --git a/spec/gemnasium_maven_spec.rb b/spec/gemnasium_maven_spec.rb index 63c9aae..5dac7bc 100644 --- a/spec/gemnasium_maven_spec.rb +++ b/spec/gemnasium_maven_spec.rb @@ -1,20 +1,28 @@ RSpec.describe 'gemnasium-maven' do context "when scanning a java project with packages from a custom source" do subject do - Dir.chdir Pathname.pwd.join('src/gemnasium-maven') do - system("docker build --network=host -t #{docker_image} .") - - if system([ :docker, :run, '-it', '--rm', '--volume', "#{project_path}:/tmp/app", '--network=host', '--env', 'CI_PROJECT_DIR=/tmp/app', docker_image, '/analyzer run' ].map(&:to_s).join(' ')) - report_path = project_path.join('gl-license-scanning-report.json') - report_path.exist? ? JSON.parse(report_path.read) : {} - else - {} - end + docker.build(tag: docker_image) + if docker.run(image: docker_image, project_path: project_path, env: env) + report_path = project_path.join('gl-license-scanning-report.json') + report_path.exist? ? JSON.parse(report_path.read) : {} + else + {} end end + let(:docker) { Docker.new(pwd: Pathname.pwd.join('src/gemnasium-maven')) } let(:project_path) { Dir.pwd } let(:docker_image) { 'gemnasium-maven:latest' } + let(:env) { { 'ADDITIONAL_CA_CERT_BUNDLE' => '' } } + let(:project) { Project.new } + + before do + project.mount(dir: fixture_file('java/maven/custom-tls')) + end + + after do + project.cleanup + end specify { expect(subject.count).to eql(1) } end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8cfc067..0280338 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,6 +14,9 @@ # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration require 'json' +require 'support/docker' +require 'support/project' +require 'support/fixture_file_helper' RSpec.configure do |config| # rspec-expectations config goes here. You can use an alternate diff --git a/spec/support/docker.rb b/spec/support/docker.rb new file mode 100644 index 0000000..331ee17 --- /dev/null +++ b/spec/support/docker.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +class Docker + DEFAULT_ENV = { 'CI_PROJECT_DIR' => '/tmp/app' }.freeze + attr_reader :pwd + + def initialize(pwd: Pathname.pwd) + @pwd = pwd + end + + def build(tag:) + Dir.chdir pwd do + system("docker build --network=host -t #{tag} .") + end + end + + def run(image:, project_path: Pathname.pwd, env: {}) + env_options = DEFAULT_ENV.merge(env).map { |(key, value)| "--env #{key}=#{value}" } + Dir.chdir pwd do + system([ + :docker, :run, '-it', '--rm', + '--volume', "#{project_path}:/tmp/app", + '--network=host', + env_options, + image, '/analyzer run' + ].flatten.map(&:to_s).join(' ')) + end + end +end diff --git a/spec/support/fixture_file_helper.rb b/spec/support/fixture_file_helper.rb new file mode 100644 index 0000000..e5b8bde --- /dev/null +++ b/spec/support/fixture_file_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module FixtureFileHelper + def fixture_file_content(path, data = {}) + fixture_file(path).read + end + + def fixture_file(path) + Pathname.pwd.join("spec/fixtures/#{path}") + end +end + +RSpec.configure do |config| + config.include(FixtureFileHelper) +end diff --git a/spec/support/project.rb b/spec/support/project.rb new file mode 100644 index 0000000..a90dfd6 --- /dev/null +++ b/spec/support/project.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +require 'securerandom' + +class Project + attr_reader :path + + def initialize(path = Pathname.pwd.join('tmp').join(SecureRandom.uuid)) + FileUtils.mkdir_p(path) + @path = Pathname(path) + end + + def mount(dir:) + FileUtils.cp_r("#{dir}/.", path) + end + + def chdir + Dir.chdir path do + yield + end + end + + def clone(repo, branch: 'master') + if branch.match?(/\b[0-9a-f]{5,40}\b/) + execute({}, 'git', 'clone', '--quiet', repo, path.to_s) + chdir do + execute({}, 'git', 'checkout', branch) + end + else + execute({}, 'git', 'clone', '--quiet', '--depth=1', '--single-branch', '--branch', branch, repo, path.to_s) + end + end + + def execute(env = {}, *args) + Bundler.with_unbundled_env do + system(env, *args, exception: true) + end + end + + def cleanup + FileUtils.rm_rf(path) if path.exist? + end +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3