| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  | require "utils/analytics" | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  | require "formula_installer" | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | describe Utils::Analytics do | 
					
						
							| 
									
										
										
										
											2021-01-07 09:12:11 +00:00
										 |  |  |   describe "::os_arch_prefix_ci" do | 
					
						
							|  |  |  |     context "when os_arch_prefix_ci is not set" do | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2021-01-07 09:12:11 +00:00
										 |  |  |         described_class.clear_os_arch_prefix_ci | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-05 13:03:38 -05:00
										 |  |  |       let(:ci) { ", CI" if ENV["CI"] } | 
					
						
							| 
									
										
										
										
											2021-12-04 12:29:31 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |       it "returns OS_VERSION and prefix when HOMEBREW_PREFIX is a custom prefix on intel" do | 
					
						
							| 
									
										
										
										
											2021-06-15 20:35:21 -07:00
										 |  |  |         allow(Hardware::CPU).to receive(:type).and_return(:intel) | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |         allow(Hardware::CPU).to receive(:in_rosetta2?).and_return(false) | 
					
						
							| 
									
										
										
										
											2019-01-21 14:33:56 +00:00
										 |  |  |         allow(Homebrew).to receive(:default_prefix?).and_return(false) | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class.os_arch_prefix_ci).to have_key(:prefix) | 
					
						
							|  |  |  |         expect(described_class.os_arch_prefix_ci[:prefix]).to eq described_class.custom_prefix_label | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-05 13:03:38 -05:00
										 |  |  |       it "returns OS_VERSION, ARM and prefix when HOMEBREW_PREFIX is a custom prefix on arm" do | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |         allow(Hardware::CPU).to receive(:type).and_return(:arm) | 
					
						
							|  |  |  |         allow(Hardware::CPU).to receive(:in_rosetta2?).and_return(false) | 
					
						
							|  |  |  |         allow(Homebrew).to receive(:default_prefix?).and_return(false) | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class.os_arch_prefix_ci).to have_key(:arch) | 
					
						
							|  |  |  |         expect(described_class.os_arch_prefix_ci[:arch]).to eq described_class.arch_label | 
					
						
							|  |  |  |         expect(described_class.os_arch_prefix_ci).to have_key(:prefix) | 
					
						
							|  |  |  |         expect(described_class.os_arch_prefix_ci[:prefix]).to eq described_class.custom_prefix_label | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-05 13:03:38 -05:00
										 |  |  |       it "returns OS_VERSION, Rosetta and prefix when HOMEBREW_PREFIX is a custom prefix on Rosetta", :needs_macos do | 
					
						
							| 
									
										
										
										
											2021-12-03 22:29:10 -05:00
										 |  |  |         allow(Hardware::CPU).to receive(:type).and_return(:intel) | 
					
						
							|  |  |  |         allow(Hardware::CPU).to receive(:in_rosetta2?).and_return(true) | 
					
						
							|  |  |  |         allow(Homebrew).to receive(:default_prefix?).and_return(false) | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class.os_arch_prefix_ci).to have_key(:prefix) | 
					
						
							|  |  |  |         expect(described_class.os_arch_prefix_ci[:prefix]).to eq described_class.custom_prefix_label | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-21 14:33:56 +00:00
										 |  |  |       it "does not include prefix when HOMEBREW_PREFIX is the default prefix" do | 
					
						
							| 
									
										
										
										
											2021-01-29 09:11:35 +00:00
										 |  |  |         allow(Homebrew).to receive(:default_prefix?).and_return(true) | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class.os_arch_prefix_ci).not_to have_key(:prefix) | 
					
						
							| 
									
										
										
										
											2019-01-21 14:33:56 +00:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  |       it "includes CI when ENV['CI'] is set" do | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |         ENV["CI"] = "true" | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class.os_arch_prefix_ci).to have_key(:ci) | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |   describe "::report_event" do | 
					
						
							|  |  |  |     let(:f) { formula { url "foo-1.0" } } | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |     let(:options) { ["--head"].join } | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |     let(:action)  { "#{f.full_name} #{options}".strip } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when ENV vars is set" do | 
					
						
							|  |  |  |       it "returns nil when HOMEBREW_NO_ANALYTICS is true" do | 
					
						
							|  |  |  |         ENV["HOMEBREW_NO_ANALYTICS"] = "true" | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class).not_to receive(:report_google) | 
					
						
							|  |  |  |         expect(described_class).not_to receive(:report_influx) | 
					
						
							|  |  |  |         described_class.report_event("install", action) | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns nil when HOMEBREW_NO_ANALYTICS_THIS_RUN is true" do | 
					
						
							|  |  |  |         ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "true" | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class).not_to receive(:report_google) | 
					
						
							|  |  |  |         expect(described_class).not_to receive(:report_influx) | 
					
						
							|  |  |  |         described_class.report_event("install", action) | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns nil when HOMEBREW_ANALYTICS_DEBUG is true" do | 
					
						
							| 
									
										
										
										
											2017-08-20 22:04:09 +05:30
										 |  |  |         ENV.delete("HOMEBREW_NO_ANALYTICS_THIS_RUN") | 
					
						
							|  |  |  |         ENV.delete("HOMEBREW_NO_ANALYTICS") | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |         ENV["HOMEBREW_ANALYTICS_DEBUG"] = "true" | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class).to receive(:report_google) | 
					
						
							|  |  |  |         expect(described_class).to receive(:report_influx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         described_class.report_event("install", action) | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it "passes to the influxdb and google methods" do | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS_THIS_RUN") | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS") | 
					
						
							|  |  |  |       ENV["HOMEBREW_ANALYTICS_DEBUG"] = "true" | 
					
						
							|  |  |  |       expect(described_class).to receive(:report_google).with(:event, hash_including(ea: action)).once | 
					
						
							|  |  |  |       expect(described_class).to receive(:report_influx).with(:install, "formula_name --head", false, | 
					
						
							|  |  |  |                                                               hash_including(developer: false)).once | 
					
						
							|  |  |  |       described_class.report_event(:install, action) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "sends to google twice on request" do | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS_THIS_RUN") | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS") | 
					
						
							|  |  |  |       ENV["HOMEBREW_ANALYTICS_DEBUG"] = "true" | 
					
						
							|  |  |  |       expect(described_class).to receive(:report_google).with(:event, hash_including(ea: action, ec: :install)).once | 
					
						
							|  |  |  |       expect(described_class).to receive(:report_google).with(:event, | 
					
						
							|  |  |  |                                                               hash_including(ea: action, | 
					
						
							|  |  |  |                                                                              ec: :install_on_request)).once | 
					
						
							|  |  |  |       expect(described_class).to receive(:report_influx).with(:install, "formula_name --head", true, | 
					
						
							|  |  |  |                                                               hash_including(developer: false)).once | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       described_class.report_event(:install, action, on_request: true) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "::report_influx" do | 
					
						
							|  |  |  |     let(:f) { formula { url "foo-1.0" } } | 
					
						
							|  |  |  |     let(:options) { ["--head"].join } | 
					
						
							|  |  |  |     let(:action)  { "#{f.full_name} #{options}".strip } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "outputs in debug mode" do | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS_THIS_RUN") | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_NO_ANALYTICS") | 
					
						
							|  |  |  |       ENV["HOMEBREW_ANALYTICS_DEBUG"] = "true" | 
					
						
							|  |  |  |       ENV["HOMEBREW_ANALYTICS_ENABLE_INFLUX"] = "true" | 
					
						
							|  |  |  |       expect do | 
					
						
							|  |  |  |         described_class.report_influx(:install, action, true, developer: true, CI: true) | 
					
						
							|  |  |  |       end.to output(/--data-raw install,[a-zA-Z=,]*,action=formula_name\\ --head/).to_stdout | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-07-27 04:41:49 +05:30
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "::report_build_error" do | 
					
						
							|  |  |  |     context "when tap is installed" do | 
					
						
							|  |  |  |       let(:err) { BuildError.new(f, "badprg", %w[arg1 arg2], {}) } | 
					
						
							|  |  |  |       let(:f) { formula { url "foo-1.0" } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "reports event if BuildError raised for a formula with a public remote repository" do | 
					
						
							|  |  |  |         allow_any_instance_of(Tap).to receive(:custom_remote?).and_return(false) | 
					
						
							|  |  |  |         expect(described_class).to respond_to(:report_event) | 
					
						
							|  |  |  |         described_class.report_build_error(err) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "does not report event if BuildError raised for a formula with a private remote repository" do | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         allow_any_instance_of(Tap).to receive(:private?).and_return(true) | 
					
						
							|  |  |  |         expect(described_class).not_to receive(:report_event) | 
					
						
							|  |  |  |         described_class.report_build_error(err) | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when formula does not have a tap" do | 
					
						
							|  |  |  |       let(:err) { BuildError.new(f, "badprg", %w[arg1 arg2], {}) } | 
					
						
							| 
									
										
										
										
											2023-01-22 17:08:50 -08:00
										 |  |  |       let(:f) { instance_double(Formula, name: "foo", path: "blah", tap: nil) } | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |       it "does not report event if BuildError is raised" do | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class).not_to receive(:report_event) | 
					
						
							|  |  |  |         described_class.report_build_error(err) | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when tap for a formula is not installed" do | 
					
						
							|  |  |  |       let(:err) { BuildError.new(f, "badprg", %w[arg1 arg2], {}) } | 
					
						
							| 
									
										
										
										
											2023-01-22 17:08:50 -08:00
										 |  |  |       let(:f) { instance_double(Formula, name: "foo", path: "blah", tap: CoreTap.instance) } | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |       it "does not report event if BuildError is raised" do | 
					
						
							|  |  |  |         allow_any_instance_of(Pathname).to receive(:directory?).and_return(false) | 
					
						
							| 
									
										
										
										
											2022-05-31 18:03:48 +02:00
										 |  |  |         expect(described_class).not_to receive(:report_event) | 
					
						
							|  |  |  |         described_class.report_build_error(err) | 
					
						
							| 
									
										
										
										
											2017-08-15 21:05:52 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   specify "::table_output" do | 
					
						
							|  |  |  |     results = { ack: 10, wget: 100 } | 
					
						
							|  |  |  |     expect { described_class.table_output("install", "30", results) } | 
					
						
							|  |  |  |       .to output(/110 |  100.00%/).to_stdout | 
					
						
							|  |  |  |       .and not_to_output.to_stderr | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-07-27 17:47:28 +05:30
										 |  |  | end |