brew/Library/Homebrew/test/utils/analytics_spec.rb

172 lines
7.3 KiB
Ruby
Raw Normal View History

2020-10-10 14:16:11 +02:00
# typed: false
# frozen_string_literal: true
2017-07-27 04:41:49 +05:30
require "utils/analytics"
require "formula_installer"
2017-07-27 04:41:49 +05:30
describe Utils::Analytics do
describe "::os_arch_prefix_ci" do
context "when os_arch_prefix_ci is not set" do
before do
described_class.clear_os_arch_prefix_ci
end
2021-12-05 13:03:38 -05:00
let(:ci) { ", CI" if ENV["CI"] }
2021-12-04 12:29:31 -05:00
it "returns OS_VERSION and prefix when HOMEBREW_PREFIX is a custom prefix on intel" do
allow(Hardware::CPU).to receive(:type).and_return(:intel)
allow(Hardware::CPU).to receive(:in_rosetta2?).and_return(false)
allow(Homebrew).to receive(:default_prefix?).and_return(false)
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
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
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)
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
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
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)
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
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)
expect(described_class.os_arch_prefix_ci).not_to have_key(:prefix)
end
2017-07-27 04:41:49 +05:30
it "includes CI when ENV['CI'] is set" do
ENV["CI"] = "true"
expect(described_class.os_arch_prefix_ci).to have_key(:ci)
2017-07-27 04:41:49 +05:30
end
end
end
describe "::report_event" do
let(:f) { formula { url "foo-1.0" } }
let(:options) { ["--head"].join }
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"
expect(described_class).not_to receive(:report_google)
expect(described_class).not_to receive(:report_influx)
described_class.report_event("install", action)
end
it "returns nil when HOMEBREW_NO_ANALYTICS_THIS_RUN is true" do
ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "true"
expect(described_class).not_to receive(:report_google)
expect(described_class).not_to receive(:report_influx)
described_class.report_event("install", action)
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")
ENV["HOMEBREW_ANALYTICS_DEBUG"] = "true"
expect(described_class).to receive(:report_google)
expect(described_class).to receive(:report_influx)
described_class.report_event("install", action)
end
end
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(described_class).to receive(:defered_curl).once
described_class.report_influx(:install, action, true, developer: true, CI: true)
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
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
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)
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
end