diff options
Diffstat (limited to 'spec/lib/gitlab/usage_data_spec.rb')
-rw-r--r-- | spec/lib/gitlab/usage_data_spec.rb | 191 |
1 files changed, 162 insertions, 29 deletions
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb index 833bf260019..cf544c07195 100644 --- a/spec/lib/gitlab/usage_data_spec.rb +++ b/spec/lib/gitlab/usage_data_spec.rb @@ -80,6 +80,12 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do end end end + + it 'allows indifferent access' do + allow(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:unique_events).and_return(1) + expect(subject[:search_unique_visits][:search_unique_visits_for_any_target_monthly]).to eq(1) + expect(subject[:search_unique_visits]['search_unique_visits_for_any_target_monthly']).to eq(1) + end end describe 'usage_activity_by_stage_package' do @@ -187,6 +193,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do end describe 'usage_activity_by_stage_manage' do + let_it_be(:error_rate) { Gitlab::Database::PostgresHll::BatchDistinctCounter::ERROR_RATE } + it 'includes accurate usage_activity_by_stage data' do stub_config( omniauth: @@ -207,14 +215,14 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do end expect(described_class.usage_activity_by_stage_manage({})).to include( - events: 2, + events: -1, groups: 2, users_created: 6, omniauth_providers: ['google_oauth2'], user_auth_by_provider: { 'group_saml' => 2, 'ldap' => 4, 'standard' => 0, 'two-factor' => 0, 'two-factor-via-u2f-device' => 0, "two-factor-via-webauthn-device" => 0 } ) expect(described_class.usage_activity_by_stage_manage(described_class.monthly_time_range_db_params)).to include( - events: 1, + events: be_within(error_rate).percent_of(1), groups: 1, users_created: 3, omniauth_providers: ['google_oauth2'], @@ -367,9 +375,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do def omniauth_providers [ - OpenStruct.new(name: 'google_oauth2'), - OpenStruct.new(name: 'ldapmain'), - OpenStruct.new(name: 'group_saml') + double('provider', name: 'google_oauth2'), + double('provider', name: 'ldapmain'), + double('provider', name: 'group_saml') ] end end @@ -428,7 +436,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do end expect(described_class.usage_activity_by_stage_plan({})).to include( - issues: 3, notes: 2, projects: 2, todos: 2, @@ -439,7 +446,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do projects_jira_dvcs_server_active: 2 ) expect(described_class.usage_activity_by_stage_plan(described_class.monthly_time_range_db_params)).to include( - issues: 2, notes: 1, projects: 1, todos: 1, @@ -450,6 +456,44 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do projects_jira_dvcs_server_active: 1 ) end + + context 'with usage_data_instrumentation feature flag' do + context 'when enabled' do + it 'merges the data from instrumentation classes' do + stub_feature_flags(usage_data_instrumentation: true) + + for_defined_days_back do + user = create(:user) + project = create(:project, creator: user) + create(:issue, project: project, author: user) + create(:issue, project: project, author: User.support_bot) + end + + expect(described_class.usage_activity_by_stage_plan({})).to include(issues: Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + expect(described_class.usage_activity_by_stage_plan(described_class.monthly_time_range_db_params)).to include(issues: Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + + uncached_data = described_class.uncached_data + expect(uncached_data[:usage_activity_by_stage][:plan]).to include(issues: 3) + expect(uncached_data[:usage_activity_by_stage_monthly][:plan]).to include(issues: 2) + end + end + + context 'when disabled' do + it 'does not merge the data from instrumentation classes' do + stub_feature_flags(usage_data_instrumentation: false) + + for_defined_days_back do + user = create(:user) + project = create(:project, creator: user) + create(:issue, project: project, author: user) + create(:issue, project: project, author: User.support_bot) + end + + expect(described_class.usage_activity_by_stage_plan({})).to include(issues: 3) + expect(described_class.usage_activity_by_stage_plan(described_class.monthly_time_range_db_params)).to include(issues: 2) + end + end + end end describe 'usage_activity_by_stage_release' do @@ -466,17 +510,53 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do deployments: 2, failed_deployments: 2, releases: 2, - successful_deployments: 2, - releases_with_milestones: 2 + successful_deployments: 2 ) expect(described_class.usage_activity_by_stage_release(described_class.monthly_time_range_db_params)).to include( deployments: 1, failed_deployments: 1, releases: 1, - successful_deployments: 1, - releases_with_milestones: 1 + successful_deployments: 1 ) end + + context 'with usage_data_instrumentation feature flag' do + before do + for_defined_days_back do + user = create(:user) + create(:deployment, :failed, user: user) + release = create(:release, author: user) + create(:milestone, project: release.project, releases: [release]) + create(:deployment, :success, user: user) + end + end + + context 'when enabled' do + before do + stub_feature_flags(usage_data_instrumentation: true) + end + + it 'merges data from instrumentation classes' do + expect(described_class.usage_activity_by_stage_release({})).to include(releases_with_milestones: Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + expect(described_class.usage_activity_by_stage_release(described_class.monthly_time_range_db_params)).to include(releases_with_milestones: Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + + uncached_data = described_class.uncached_data + expect(uncached_data[:usage_activity_by_stage][:release]).to include(releases_with_milestones: 2) + expect(uncached_data[:usage_activity_by_stage_monthly][:release]).to include(releases_with_milestones: 1) + end + end + + context 'when disabled' do + before do + stub_feature_flags(usage_data_instrumentation: false) + end + + it 'does not merge data from instrumentation classes' do + expect(described_class.usage_activity_by_stage_release({})).to include(releases_with_milestones: 2) + expect(described_class.usage_activity_by_stage_release(described_class.monthly_time_range_db_params)).to include(releases_with_milestones: 1) + end + end + end end describe 'usage_activity_by_stage_verify' do @@ -525,16 +605,16 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do subject { described_class.data } it 'gathers usage data' do - expect(subject.keys).to include(*UsageDataHelpers::USAGE_DATA_KEYS) + expect(subject.keys).to include(*UsageDataHelpers::USAGE_DATA_KEYS.map(&:to_s)) end it 'gathers usage counts', :aggregate_failures do count_data = subject[:counts] - expect(count_data[:boards]).to eq(1) expect(count_data[:projects]).to eq(4) - expect(count_data.keys).to include(*UsageDataHelpers::COUNTS_KEYS) - expect(UsageDataHelpers::COUNTS_KEYS - count_data.keys).to be_empty + count_keys = UsageDataHelpers::COUNTS_KEYS.map(&:to_s) + expect(count_data.keys).to include(*count_keys) + expect(count_keys - count_data.keys).to be_empty expect(count_data.values).to all(be_a_kind_of(Integer)) end @@ -619,7 +699,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do external_diffs: { enabled: false }, lfs: { enabled: true, object_store: { enabled: false, direct_upload: true, background_upload: false, provider: "AWS" } }, uploads: { enabled: nil, object_store: { enabled: false, direct_upload: true, background_upload: false, provider: "AWS" } }, - packages: { enabled: true, object_store: { enabled: false, direct_upload: false, background_upload: true, provider: "AWS" } } } + packages: { enabled: true, object_store: { enabled: false, direct_upload: false, background_upload: true, provider: "AWS" } } }.with_indifferent_access ) end @@ -793,12 +873,37 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do subject { described_class.license_usage_data } it 'gathers license data' do - expect(subject[:uuid]).to eq(Gitlab::CurrentSettings.uuid) expect(subject[:version]).to eq(Gitlab::VERSION) expect(subject[:installation_type]).to eq('gitlab-development-kit') - expect(subject[:active_user_count]).to eq(User.active.size) expect(subject[:recorded_at]).to be_a(Time) end + + context 'with usage_data_instrumentation feature flag' do + context 'when enabled' do + it 'merges uuid and hostname data from instrumentation classes' do + stub_feature_flags(usage_data_instrumentation: true) + + expect(subject[:uuid]).to eq(Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + expect(subject[:hostname]).to eq(Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + expect(subject[:active_user_count]).to eq(Gitlab::Utils::UsageData::INSTRUMENTATION_CLASS_FALLBACK) + + uncached_data = described_class.data + expect(uncached_data[:uuid]).to eq(Gitlab::CurrentSettings.uuid) + expect(uncached_data[:hostname]).to eq(Gitlab.config.gitlab.host) + expect(uncached_data[:active_user_count]).to eq(User.active.size) + end + end + + context 'when disabled' do + it 'does not merge uuid and hostname data from instrumentation classes' do + stub_feature_flags(usage_data_instrumentation: false) + + expect(subject[:uuid]).to eq(Gitlab::CurrentSettings.uuid) + expect(subject[:hostname]).to eq(Gitlab.config.gitlab.host) + expect(subject[:active_user_count]).to eq(User.active.size) + end + end + end end context 'when not relying on database records' do @@ -873,9 +978,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do expect(subject[:gitlab_pages][:enabled]).to eq(Gitlab.config.pages.enabled) expect(subject[:gitlab_pages][:version]).to eq(Gitlab::Pages::VERSION) expect(subject[:git][:version]).to eq(Gitlab::Git.version) - expect(subject[:database][:adapter]).to eq(Gitlab::Database.main.adapter_name) - expect(subject[:database][:version]).to eq(Gitlab::Database.main.version) - expect(subject[:database][:pg_system_id]).to eq(Gitlab::Database.main.system_id) + expect(subject[:database][:adapter]).to eq(ApplicationRecord.database.adapter_name) + expect(subject[:database][:version]).to eq(ApplicationRecord.database.version) + expect(subject[:database][:pg_system_id]).to eq(ApplicationRecord.database.system_id) expect(subject[:mail][:smtp_server]).to eq(ActionMailer::Base.smtp_settings[:address]) expect(subject[:gitaly][:version]).to be_present expect(subject[:gitaly][:servers]).to be >= 1 @@ -1061,18 +1166,46 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do expect(subject[:settings][:gitaly_apdex]).to be_within(0.001).of(0.95) end - it 'reports collected data categories' do - expected_value = %w[standard subscription operational optional] + context 'with usage_data_instrumentation feature flag' do + context 'when enabled' do + before do + stub_feature_flags(usage_data_instrumentation: true) + end + + it 'reports collected data categories' do + expected_value = %w[standard subscription operational optional] + + allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance| + expect(instance).to receive(:execute).and_return(expected_value) + end + + expect(described_class.data[:settings][:collected_data_categories]).to eq(expected_value) + end - allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance| - expect(instance).to receive(:execute).and_return(expected_value) + it 'gathers service_ping_features_enabled' do + expect(described_class.data[:settings][:service_ping_features_enabled]).to eq(Gitlab::CurrentSettings.usage_ping_features_enabled) + end end - expect(subject[:settings][:collected_data_categories]).to eq(expected_value) - end + context 'when disabled' do + before do + stub_feature_flags(usage_data_instrumentation: false) + end + + it 'reports collected data categories' do + expected_value = %w[standard subscription operational optional] - it 'gathers service_ping_features_enabled' do - expect(subject[:settings][:service_ping_features_enabled]).to eq(Gitlab::CurrentSettings.usage_ping_features_enabled) + allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance| + expect(instance).to receive(:execute).and_return(expected_value) + end + + expect(subject[:settings][:collected_data_categories]).to eq(expected_value) + end + + it 'gathers service_ping_features_enabled' do + expect(subject[:settings][:service_ping_features_enabled]).to eq(Gitlab::CurrentSettings.usage_ping_features_enabled) + end + end end it 'gathers user_cap_feature_enabled' do |