spec/functional/licensing_spec.rb (192 lines of code) (raw):

require "spec_helper" module Omnibus describe Licensing do let(:license) { nil } let(:license_file_path) { nil } let(:license_file) { nil } let(:zlib_version_override) { nil } let(:install_dir) { File.join(tmp_path, "install_dir") } let(:software_project_dir) { File.join(tmp_path, "software_project_dir") } let(:expected_project_license_path) { "LICENSE" } let(:expected_project_license) { "Unspecified" } let(:expected_project_license_content) { "" } before do FileUtils.mkdir_p(install_dir) FileUtils.mkdir_p(software_project_dir) allow_any_instance_of(Software).to receive(:project_dir).and_return(software_project_dir) %w{LICENSE NOTICE APACHE}.each do |file| File.open(File.join(software_project_dir, file), "w+") do |f| f.puts "This file is #{file}." end end end let(:project) do Project.new.tap do |project| project.name("test-project") project.install_dir(install_dir) project.license(license) unless license.nil? project.license_file_path(license_file_path) unless license_file_path.nil? project.license_file(license_file) unless license_file.nil? project.build_version("1.2.3") if zlib_version_override project.override :zlib, version: zlib_version_override end end end let(:private_code) do Software.new(project, "private_code.rb").evaluate do name "private_code" default_version "1.7.2" skip_transitive_dependency_licensing true end end let(:zlib) do Software.new(project, "zlib.rb").evaluate do name "zlib" default_version "1.7.2" skip_transitive_dependency_licensing true license "Zlib" license_file "LICENSE" version "1.8.0" do license "Apache-2.0" license_file "APACHE" end end end let(:snoopy) do Software.new(project, "snoopy.rb").evaluate do name "snoopy" default_version "1.0.0" skip_transitive_dependency_licensing true license "GPL v2" license_file "http://dev.perl.org/licenses/artistic.html" license_file "NOTICE" end end let(:preparation) do Software.new(project, "preparation.rb").evaluate do name "preparation" default_version "1.0.0" license :project_license skip_transitive_dependency_licensing true end end let(:software_with_warnings) { nil } let(:softwares) do s = [preparation, snoopy, zlib, private_code] s << software_with_warnings if software_with_warnings s end def create_licenses softwares.each { |s| project.library.component_added(s) } Licensing.create_incrementally(project) do |licensing| yield licensing if block_given? project.softwares.each do |software| licensing.execute_post_build(software) end end end describe "prepare step" do let(:licenses_dir) { File.join(install_dir, "LICENSES") } let(:dot_gitkeep) { File.join(licenses_dir, ".gitkeep") } let(:cache_dir) { File.join(install_dir, "license-cache") } let(:cache_dot_gitkeep) { File.join(cache_dir, ".gitkeep") } it "creates a LICENSES dir with a .gitkeep file inside the install directory" do Licensing.new(project).prepare expect(File).to exist(licenses_dir) expect(File).to exist(dot_gitkeep) end it "creates a licenses-cache dir with a .gitkeep file inside the install directory" do Licensing.new(project).prepare expect(File).to exist(cache_dir) expect(File).to exist(cache_dot_gitkeep) end end describe "without license definitions in the project" do it "warns for missing project license" do output = capture_logging { create_licenses } expect(output).to include("Project 'test-project' does not contain licensing information.") end end describe "with license definitions in the project" do let(:license) { "Custom Chef" } let(:license_file_path) { "CHEF.LICENSE" } let(:license_file) { "CUSTOM_CHEF" } let(:expected_project_license_path) { license_file_path } let(:expected_project_license) { license } let(:expected_project_license_content) { "Chef Custom License" } before do File.open(File.join(Config.project_root, license_file), "w+") do |f| f.puts "Chef Custom License is awesome." end end after do FileUtils.rm_rf(license_file) end it "warns for non-standard project license" do output = capture_logging { create_licenses } expect(output).to include("Project 'test-project' is using 'Custom Chef' which is not one of the standard licenses") end end describe "with a local license file that does not exist" do let(:software_with_warnings) do Software.new(project, "problematic.rb").evaluate do name "problematic" default_version "0.10.2" license_file "NOT_EXISTS" skip_transitive_dependency_licensing true end end it "should log a warning for the missing file" do output = capture_logging { create_licenses } expect(output).to match /License file (.*)NOT_EXISTS' does not exist for software 'problematic'./ end end describe "with a remote license file that does not exist" do before do Omnibus::Config.fetcher_retries(1) end let(:software_with_warnings) do Software.new(project, "problematic.rb").evaluate do name "problematic" default_version "0.10.2" license_file "https://downloads.chef.io/LICENSE" skip_transitive_dependency_licensing true end end it "should log a warning for the missing file" do output = capture_logging { create_licenses } expect(output).to match(/Retrying failed download/) expect(output).to match(%r{Can not download license file 'https://downloads.chef.io/LICENSE' for software 'problematic'.}) end end describe "with a software with no license files" do let(:software_with_warnings) do Software.new(project, "problematic.rb").evaluate do name "problematic" default_version "0.10.2" license "Zlib" skip_transitive_dependency_licensing true end end it "should log a warning for the missing file pointers" do output = capture_logging { create_licenses } expect(output).to include("Software 'problematic' does not point to any license files.") end end describe "with a project with no license files" do let(:license) { "Zlib" } let(:expected_project_license_path) { "LICENSE" } let(:expected_project_license) { license } let(:expected_project_license_content) { "" } it "warns for missing license files" do output = capture_logging { create_licenses } expect(output).to include("Project 'test-project' does not point to a license file.") end end describe "with :fatal_licensing_warnings set and without license definitions in the project" do before do Omnibus::Config.fatal_licensing_warnings(true) end it "fails the omnibus build" do expect { create_licenses }.to raise_error(Omnibus::LicensingError, /Project 'test-project' does not contain licensing information.\s{1,}Software 'private_code' does not contain licensing information./) end end describe "when all software is setting skip_transitive_dependency_licensing " do # This is achieved by the default values of the let() parameters it "does not collect transitive licensing info for any software" do softwares.each { |s| project.library.component_added(s) } create_licenses do |licensing| expect(licensing).not_to receive(:collect_transitive_dependency_licenses_for) end end end describe "when a project has transitive dependencies" do let(:license) { "Custom Chef" } let(:license_file_path) { "CHEF.LICENSE" } let(:license_file) { "CUSTOM_CHEF" } let(:expected_project_license_path) { license_file_path } let(:softwares) { [zlib] } before do File.open(File.join(Config.project_root, license_file), "w+") do |f| f.puts "Chef Custom License is awesome." end end after do FileUtils.rm_rf(license_file) end let(:zlib) do Software.new(project, "zlib.rb").evaluate do name "zlib" default_version "1.7.2" license "Zlib" license_file "LICENSE" end end let(:snoopy) do Software.new(project, "snoopy.rb").evaluate do name "snoopy" default_version "1.0.0" license "GPL v2" license_file "NOTICE" end end end end end