| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 18:25:08 +09:00
										 |  |  | require "cli/parser" | 
					
						
							| 
									
										
										
										
											2016-01-18 15:33:59 +01:00
										 |  |  | require "fileutils" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 22:41:47 -05:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(CLI::Parser) } | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |   def tests_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							| 
									
										
										
										
											2021-01-15 15:04:02 -05:00
										 |  |  |       description <<~EOS | 
					
						
							| 
									
										
										
										
											2018-10-08 22:49:03 -04:00
										 |  |  |         Run Homebrew's unit and integration tests. | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       EOS | 
					
						
							|  |  |  |       switch "--coverage", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Generate code coverage reports." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--generic", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Run only OS-agnostic tests." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--no-compat", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Do not load the compatibility layer when running tests." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--online", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Include tests that use the GitHub API and tests that use any of the taps for "\ | 
					
						
							|  |  |  |                           "official external commands." | 
					
						
							| 
									
										
										
										
											2020-05-18 16:28:43 +05:30
										 |  |  |       switch "--byebug", | 
					
						
							|  |  |  |              description: "Enable debugging using byebug." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       flag   "--only=", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Run only <test_script>`_spec.rb`. Appending `:`<line_number> will start at a "\ | 
					
						
							|  |  |  |                           "specific line." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       flag   "--seed=", | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |              description: "Randomise tests with the specified <value> instead of a random seed." | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 14:26:40 -05:00
										 |  |  |       named_args :none | 
					
						
							| 
									
										
										
										
											2018-03-25 17:48:22 +05:30
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2018-09-08 22:21:04 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |   def tests | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  |     args = tests_args.parse | 
					
						
							| 
									
										
										
										
											2018-03-25 13:18:23 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     Homebrew.install_bundler_gems! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-18 16:28:43 +05:30
										 |  |  |     require "byebug" if args.byebug? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-21 08:57:39 +02:00
										 |  |  |     HOMEBREW_LIBRARY_PATH.cd do | 
					
						
							| 
									
										
										
										
											2021-01-28 09:57:08 +00:00
										 |  |  |       # Cleanup any unwanted user configuration. | 
					
						
							|  |  |  |       allowed_test_env = [ | 
					
						
							|  |  |  |         "HOMEBREW_GITHUB_API_TOKEN", | 
					
						
							|  |  |  |         "HOMEBREW_TEMP", | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |       Homebrew::EnvConfig::ENVS.keys.map(&:to_s).each do |env| | 
					
						
							|  |  |  |         next if allowed_test_env.include?(env) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ENV.delete(env) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 18:26:44 +01:00
										 |  |  |       ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "1" | 
					
						
							| 
									
										
										
										
											2018-03-25 13:18:23 +05:30
										 |  |  |       ENV["HOMEBREW_NO_COMPAT"] = "1" if args.no_compat? | 
					
						
							|  |  |  |       ENV["HOMEBREW_TEST_GENERIC_OS"] = "1" if args.generic? | 
					
						
							| 
									
										
										
										
											2018-06-06 13:13:45 +02:00
										 |  |  |       ENV["HOMEBREW_TEST_ONLINE"] = "1" if args.online? | 
					
						
							| 
									
										
										
										
											2020-10-09 12:11:23 +02:00
										 |  |  |       ENV["HOMEBREW_SORBET_RUNTIME"] = "1" | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 11:33:00 -08:00
										 |  |  |       ENV["USER"] ||= system_command!("id", args: ["-nu"]).stdout.chomp | 
					
						
							| 
									
										
										
										
											2019-02-20 09:33:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 12:47:15 -04:00
										 |  |  |       # Avoid local configuration messing with tests, e.g. git being configured | 
					
						
							| 
									
										
										
										
											2018-09-02 12:56:31 +01:00
										 |  |  |       # to use GPG to sign by default | 
					
						
							|  |  |  |       ENV["HOME"] = "#{HOMEBREW_LIBRARY_PATH}/test" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-27 15:04:13 +00:00
										 |  |  |       # Print verbose output when requesting debug or verbose output. | 
					
						
							|  |  |  |       ENV["HOMEBREW_VERBOSE_TESTS"] = "1" if args.debug? || args.verbose? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 13:18:23 +05:30
										 |  |  |       if args.coverage? | 
					
						
							| 
									
										
										
										
											2016-01-18 15:33:59 +01:00
										 |  |  |         ENV["HOMEBREW_TESTS_COVERAGE"] = "1" | 
					
						
							| 
									
										
										
										
											2016-09-19 23:00:58 +01:00
										 |  |  |         FileUtils.rm_f "test/coverage/.resultset.json" | 
					
						
							| 
									
										
										
										
											2016-01-18 15:33:59 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-12-23 00:34:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-04 14:54:09 +01:00
										 |  |  |       # Override author/committer as global settings might be invalid and thus | 
					
						
							|  |  |  |       # will cause silent failure during the setup of dummy Git repositories. | 
					
						
							|  |  |  |       %w[AUTHOR COMMITTER].each do |role| | 
					
						
							|  |  |  |         ENV["GIT_#{role}_NAME"] = "brew tests" | 
					
						
							|  |  |  |         ENV["GIT_#{role}_EMAIL"] = "brew-tests@localhost" | 
					
						
							| 
									
										
										
										
											2017-01-22 20:54:37 +00:00
										 |  |  |         ENV["GIT_#{role}_DATE"]  = "Sun Jan 22 19:59:13 2017 +0000" | 
					
						
							| 
									
										
										
										
											2016-01-04 14:54:09 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |       parallel = true | 
					
						
							| 
									
										
										
										
											2016-09-20 14:57:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 13:18:23 +05:30
										 |  |  |       files = if args.only | 
					
						
							|  |  |  |         test_name, line = args.only.split(":", 2) | 
					
						
							| 
									
										
										
										
											2016-09-20 14:57:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |         if line.nil? | 
					
						
							|  |  |  |           Dir.glob("test/{#{test_name},#{test_name}/**/*}_spec.rb") | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           parallel = false | 
					
						
							|  |  |  |           ["test/#{test_name}_spec.rb:#{line}"] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2019-02-21 15:41:42 +00:00
										 |  |  |         Dir.glob("test/**/*_spec.rb") | 
					
						
							| 
									
										
										
										
											2016-01-20 07:06:09 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-09-20 14:57:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 09:38:37 +09:00
										 |  |  |       parallel_rspec_log_name = "parallel_runtime_rspec" | 
					
						
							|  |  |  |       parallel_rspec_log_name = "#{parallel_rspec_log_name}.no_compat" if args.no_compat? | 
					
						
							|  |  |  |       parallel_rspec_log_name = "#{parallel_rspec_log_name}.generic" if args.generic? | 
					
						
							|  |  |  |       parallel_rspec_log_name = "#{parallel_rspec_log_name}.online" if args.online? | 
					
						
							|  |  |  |       parallel_rspec_log_name = "#{parallel_rspec_log_name}.log" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-03 19:03:35 +09:00
										 |  |  |       parallel_rspec_log_path = if ENV["CI"] | 
					
						
							| 
									
										
										
										
											2021-04-06 09:38:37 +09:00
										 |  |  |         "tests/#{parallel_rspec_log_name}" | 
					
						
							| 
									
										
										
										
											2021-04-01 23:15:51 +09:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2021-04-06 09:38:37 +09:00
										 |  |  |         "#{HOMEBREW_CACHE}/#{parallel_rspec_log_name}" | 
					
						
							| 
									
										
										
										
											2021-04-01 23:15:51 +09:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-27 14:02:38 +00:00
										 |  |  |       parallel_args = if ENV["CI"] | 
					
						
							| 
									
										
										
										
											2021-04-01 23:15:51 +09:00
										 |  |  |         %W[
 | 
					
						
							| 
									
										
										
										
											2017-05-08 08:38:25 +01:00
										 |  |  |           --combine-stderr | 
					
						
							|  |  |  |           --serialize-stdout | 
					
						
							| 
									
										
										
										
											2021-04-08 20:23:50 +09:00
										 |  |  |           --runtime-log #{parallel_rspec_log_path} | 
					
						
							| 
									
										
										
										
											2017-05-08 08:38:25 +01:00
										 |  |  |         ] | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         %w[
 | 
					
						
							|  |  |  |           --nice | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-10 21:21:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 09:14:44 +00:00
										 |  |  |       # Generate seed ourselves and output later to avoid multiple different | 
					
						
							|  |  |  |       # seeds being output when running parallel tests. | 
					
						
							| 
									
										
										
										
											2018-06-06 23:34:19 -04:00
										 |  |  |       seed = args.seed || rand(0xFFFF).to_i | 
					
						
							| 
									
										
										
										
											2017-12-15 09:14:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |       bundle_args = ["-I", HOMEBREW_LIBRARY_PATH/"test"] | 
					
						
							|  |  |  |       bundle_args += %W[
 | 
					
						
							| 
									
										
										
										
											2017-12-15 09:14:44 +00:00
										 |  |  |         --seed #{seed} | 
					
						
							| 
									
										
										
										
											2017-05-08 08:38:25 +01:00
										 |  |  |         --color | 
					
						
							|  |  |  |         --require spec_helper | 
					
						
							| 
									
										
										
										
											2017-12-15 09:14:44 +00:00
										 |  |  |         --format NoSeedProgressFormatter | 
					
						
							| 
									
										
										
										
											2017-05-08 08:38:25 +01:00
										 |  |  |         --format ParallelTests::RSpec::RuntimeLogger | 
					
						
							| 
									
										
										
										
											2021-04-01 23:15:51 +09:00
										 |  |  |         --out #{parallel_rspec_log_path} | 
					
						
							| 
									
										
										
										
											2017-02-10 21:21:57 +01:00
										 |  |  |       ] | 
					
						
							| 
									
										
										
										
											2017-02-21 21:55:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-07 19:49:39 +02:00
										 |  |  |       bundle_args << "--format" << "RSpec::Github::Formatter" if ENV["GITHUB_ACTIONS"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |       unless OS.mac? | 
					
						
							| 
									
										
										
										
											2018-08-09 15:00:19 +02:00
										 |  |  |         bundle_args << "--tag" << "~needs_macos" << "--tag" << "~cask" | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |         files = files.reject { |p| p =~ %r{^test/(os/mac|cask)(/.*|_spec\.rb)$} } | 
					
						
							| 
									
										
										
										
											2015-07-22 16:04:59 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 20:45:48 -08:00
										 |  |  |       unless OS.linux? | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |         bundle_args << "--tag" << "~needs_linux" | 
					
						
							| 
									
										
										
										
											2017-03-05 20:45:48 -08:00
										 |  |  |         files = files.reject { |p| p =~ %r{^test/os/linux(/.*|_spec\.rb)$} } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 09:14:44 +00:00
										 |  |  |       puts "Randomized with seed #{seed}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 16:09:10 +01:00
										 |  |  |       # Let tests find `bundle` in the actual location. | 
					
						
							|  |  |  |       ENV["HOMEBREW_TESTS_GEM_USER_DIR"] = gem_user_dir | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |       # Let `bundle` in PATH find its gem. | 
					
						
							|  |  |  |       ENV["GEM_PATH"] = "#{ENV["GEM_PATH"]}:#{gem_user_dir}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-07 17:28:39 +01:00
										 |  |  |       if parallel | 
					
						
							| 
									
										
										
										
											2019-02-27 14:02:38 +00:00
										 |  |  |         system "bundle", "exec", "parallel_rspec", *parallel_args, "--", *bundle_args, "--", *files | 
					
						
							| 
									
										
										
										
											2017-05-07 17:28:39 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |         system "bundle", "exec", "rspec", *bundle_args, "--", *files | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-10 20:12:55 +03:00
										 |  |  |       return if $CHILD_STATUS.success? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 14:33:39 +01:00
										 |  |  |       Homebrew.failed = true | 
					
						
							| 
									
										
										
										
											2012-04-16 16:44:11 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-03-25 00:49:18 +11:00
										 |  |  | end |