diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-20 21:06:38 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-20 21:06:38 +0000 |
commit | 2477ab5553eabc6c4579cb23aba620ffc8cba228 (patch) | |
tree | 72d34d8135c6318130e9697b900507dace9cb035 | |
parent | fdffdcf1abaa2cab903f1d32610eb562cdf53906 (diff) | |
download | gitlab-ce-2477ab5553eabc6c4579cb23aba620ffc8cba228.tar.gz |
Add latest changes from gitlab-org/gitlab@master
-rw-r--r-- | changelogs/unreleased/36483-move-the-confidence-column-in-the-security-dashboard.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/add_missing_add_index_rubocop_spec.yml | 5 | ||||
-rw-r--r-- | config/initializers/sidekiq.rb | 23 | ||||
-rw-r--r-- | lib/gitlab/sidekiq_middleware.rb | 34 | ||||
-rw-r--r-- | lib/tasks/gettext.rake | 2 | ||||
-rw-r--r-- | spec/frontend/vue_shared/components/notes/system_note_spec.js | 24 | ||||
-rw-r--r-- | spec/lib/gitlab/google_code_import/client_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/google_code_import/importer_spec.rb | 4 | ||||
-rw-r--r-- | spec/lib/gitlab/google_code_import/project_creator_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/sidekiq_middleware_spec.rb | 135 | ||||
-rw-r--r-- | spec/rubocop/cop/migration/add_index_spec.rb | 39 |
11 files changed, 248 insertions, 27 deletions
diff --git a/changelogs/unreleased/36483-move-the-confidence-column-in-the-security-dashboard.yml b/changelogs/unreleased/36483-move-the-confidence-column-in-the-security-dashboard.yml new file mode 100644 index 00000000000..6651facf809 --- /dev/null +++ b/changelogs/unreleased/36483-move-the-confidence-column-in-the-security-dashboard.yml @@ -0,0 +1,5 @@ +--- +title: Move confidence column in the security dashboard +merge_request: 20435 +author: Dheeraj Joshi +type: changed diff --git a/changelogs/unreleased/add_missing_add_index_rubocop_spec.yml b/changelogs/unreleased/add_missing_add_index_rubocop_spec.yml new file mode 100644 index 00000000000..b1ae864ae35 --- /dev/null +++ b/changelogs/unreleased/add_missing_add_index_rubocop_spec.yml @@ -0,0 +1,5 @@ +--- +title: add missing test for add_index rubocop rule +merge_request: 20464 +author: Eric Thomas +type: other diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index b5d98399015..c3ca9bf3e05 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -31,21 +31,17 @@ enable_json_logs = Gitlab.config.sidekiq.log_format == 'json' enable_sidekiq_memory_killer = ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'].to_i.nonzero? use_sidekiq_daemon_memory_killer = ENV["SIDEKIQ_DAEMON_MEMORY_KILLER"].to_i.nonzero? use_sidekiq_legacy_memory_killer = !use_sidekiq_daemon_memory_killer +use_request_store = ENV['SIDEKIQ_REQUEST_STORE'].to_i.nonzero? Sidekiq.configure_server do |config| config.redis = queues_config_hash - config.server_middleware do |chain| - chain.add Gitlab::SidekiqMiddleware::Monitor - chain.add Gitlab::SidekiqMiddleware::Metrics if Settings.monitoring.sidekiq_exporter - chain.add Gitlab::SidekiqMiddleware::ArgumentsLogger if ENV['SIDEKIQ_LOG_ARGUMENTS'] && !enable_json_logs - chain.add Gitlab::SidekiqMiddleware::MemoryKiller if enable_sidekiq_memory_killer && use_sidekiq_legacy_memory_killer - chain.add Gitlab::SidekiqMiddleware::RequestStoreMiddleware unless ENV['SIDEKIQ_REQUEST_STORE'] == '0' - chain.add Gitlab::SidekiqMiddleware::BatchLoader - chain.add Gitlab::SidekiqMiddleware::CorrelationLogger - chain.add Gitlab::SidekiqMiddleware::InstrumentationLogger - chain.add Gitlab::SidekiqStatus::ServerMiddleware - end + config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator({ + metrics: Settings.monitoring.sidekiq_exporter, + arguments_logger: ENV['SIDEKIQ_LOG_ARGUMENTS'] && !enable_json_logs, + memory_killer: enable_sidekiq_memory_killer && use_sidekiq_legacy_memory_killer, + request_store: use_request_store + })) if enable_json_logs Sidekiq.logger.formatter = Gitlab::SidekiqLogging::JSONFormatter.new @@ -56,10 +52,7 @@ Sidekiq.configure_server do |config| config.error_handlers << Gitlab::SidekiqLogging::ExceptionHandler.new end - config.client_middleware do |chain| - chain.add Gitlab::SidekiqStatus::ClientMiddleware - chain.add Gitlab::SidekiqMiddleware::CorrelationInjector - end + config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator) config.on :startup do # Clear any connections that might have been obtained before starting diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb new file mode 100644 index 00000000000..c6726dcfa67 --- /dev/null +++ b/lib/gitlab/sidekiq_middleware.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Gitlab + # The SidekiqMiddleware class is responsible for configuring the + # middleware stacks used in the client and server middlewares + module SidekiqMiddleware + # The result of this method should be passed to + # Sidekiq's `config.server_middleware` method + # eg: `config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator)` + def self.server_configurator(metrics: true, arguments_logger: true, memory_killer: true, request_store: true) + lambda do |chain| + chain.add Gitlab::SidekiqMiddleware::Monitor + chain.add Gitlab::SidekiqMiddleware::Metrics if metrics + chain.add Gitlab::SidekiqMiddleware::ArgumentsLogger if arguments_logger + chain.add Gitlab::SidekiqMiddleware::MemoryKiller if memory_killer + chain.add Gitlab::SidekiqMiddleware::RequestStoreMiddleware if request_store + chain.add Gitlab::SidekiqMiddleware::BatchLoader + chain.add Gitlab::SidekiqMiddleware::CorrelationLogger + chain.add Gitlab::SidekiqMiddleware::InstrumentationLogger + chain.add Gitlab::SidekiqStatus::ServerMiddleware + end + end + + # The result of this method should be passed to + # Sidekiq's `config.client_middleware` method + # eg: `config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator)` + def self.client_configurator + lambda do |chain| + chain.add Gitlab::SidekiqStatus::ClientMiddleware + chain.add Gitlab::SidekiqMiddleware::CorrelationInjector + end + end + end +end diff --git a/lib/tasks/gettext.rake b/lib/tasks/gettext.rake index dfc0047e753..a192293fae6 100644 --- a/lib/tasks/gettext.rake +++ b/lib/tasks/gettext.rake @@ -94,7 +94,7 @@ namespace :gettext do if pot_diff.present? raise <<~MSG - Newly translated strings found, please add them to `#{pot_file}` by running: + Changes in translated strings found, please update file `#{pot_file}` by running: bin/rake gettext:regenerate diff --git a/spec/frontend/vue_shared/components/notes/system_note_spec.js b/spec/frontend/vue_shared/components/notes/system_note_spec.js index c2e8359f78d..603c37c6c49 100644 --- a/spec/frontend/vue_shared/components/notes/system_note_spec.js +++ b/spec/frontend/vue_shared/components/notes/system_note_spec.js @@ -1,10 +1,12 @@ -import Vue from 'vue'; -import issueSystemNote from '~/vue_shared/components/notes/system_note.vue'; +import { createLocalVue, mount } from '@vue/test-utils'; +import IssueSystemNote from '~/vue_shared/components/notes/system_note.vue'; import createStore from '~/notes/stores'; import initMRPopovers from '~/mr_popover/index'; jest.mock('~/mr_popover/index', () => jest.fn()); +const localVue = createLocalVue(); + describe('system note component', () => { let vm; let props; @@ -30,34 +32,36 @@ describe('system note component', () => { const store = createStore(); store.dispatch('setTargetNoteHash', `note_${props.note.id}`); - const Component = Vue.extend(issueSystemNote); - vm = new Component({ + vm = mount(IssueSystemNote, { store, + localVue, propsData: props, - }).$mount(); + attachToDocument: true, + sync: false, + }); }); afterEach(() => { - vm.$destroy(); + vm.destroy(); }); it('should render a list item with correct id', () => { - expect(vm.$el.getAttribute('id')).toEqual(`note_${props.note.id}`); + expect(vm.attributes('id')).toEqual(`note_${props.note.id}`); }); it('should render target class is note is target note', () => { - expect(vm.$el.classList).toContain('target'); + expect(vm.classes()).toContain('target'); }); it('should render svg icon', () => { - expect(vm.$el.querySelector('.timeline-icon svg')).toBeDefined(); + expect(vm.find('.timeline-icon svg').exists()).toBe(true); }); // Redcarpet Markdown renderer wraps text in `<p>` tags // we need to strip them because they break layout of commit lists in system notes: // https://gitlab.com/gitlab-org/gitlab-foss/uploads/b07a10670919254f0220d3ff5c1aa110/jqzI.png it('removes wrapping paragraph from note HTML', () => { - expect(vm.$el.querySelector('.system-note-message').innerHTML).toContain('<span>closed</span>'); + expect(vm.find('.system-note-message').html()).toContain('<span>closed</span>'); }); it('should initMRPopovers onMount', () => { diff --git a/spec/lib/gitlab/google_code_import/client_spec.rb b/spec/lib/gitlab/google_code_import/client_spec.rb index 37985c062b4..bd63cabecd6 100644 --- a/spec/lib/gitlab/google_code_import/client_spec.rb +++ b/spec/lib/gitlab/google_code_import/client_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "spec_helper" describe Gitlab::GoogleCodeImport::Client do diff --git a/spec/lib/gitlab/google_code_import/importer_spec.rb b/spec/lib/gitlab/google_code_import/importer_spec.rb index 031f57dbc65..7055df89c09 100644 --- a/spec/lib/gitlab/google_code_import/importer_spec.rb +++ b/spec/lib/gitlab/google_code_import/importer_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "spec_helper" describe Gitlab::GoogleCodeImport::Importer do @@ -37,7 +39,7 @@ describe Gitlab::GoogleCodeImport::Importer do Performance Usability Maintainability Component-Panel Component-Taskbar Component-Battery Component-Systray Component-Clock Component-Launcher Component-Tint2conf Component-Docs Component-New ).each do |label| - label.sub!("-", ": ") + label = label.sub("-", ": ") expect(project.labels.find_by(name: label)).not_to be_nil end end diff --git a/spec/lib/gitlab/google_code_import/project_creator_spec.rb b/spec/lib/gitlab/google_code_import/project_creator_spec.rb index b959e006292..2353c24f77b 100644 --- a/spec/lib/gitlab/google_code_import/project_creator_spec.rb +++ b/spec/lib/gitlab/google_code_import/project_creator_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spec_helper' describe Gitlab::GoogleCodeImport::ProjectCreator do diff --git a/spec/lib/gitlab/sidekiq_middleware_spec.rb b/spec/lib/gitlab/sidekiq_middleware_spec.rb new file mode 100644 index 00000000000..43b77fdf94a --- /dev/null +++ b/spec/lib/gitlab/sidekiq_middleware_spec.rb @@ -0,0 +1,135 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'sidekiq/testing' + +describe Gitlab::SidekiqMiddleware do + class TestWorker + include Sidekiq::Worker + + def perform(_arg) + end + end + + around do |example| + Sidekiq::Testing.inline! { example.run } + end + + let(:worker_class) { TestWorker } + let(:job_args) { [0.01] } + + # The test sets up a new server middleware stack, ensuring that the + # appropriate middlewares, as passed into server_configurator, + # are invoked. + # Additionally the test ensure that each middleware is + # 1) not failing + # 2) yielding exactly once + describe '.server_configurator' do + let(:middleware_expected_args) { [a_kind_of(worker_class), hash_including({ 'args' => job_args }), anything] } + let(:all_sidekiq_middlewares) do + [ + Gitlab::SidekiqMiddleware::Monitor, + Gitlab::SidekiqMiddleware::BatchLoader, + Gitlab::SidekiqMiddleware::CorrelationLogger, + Gitlab::SidekiqMiddleware::InstrumentationLogger, + Gitlab::SidekiqStatus::ServerMiddleware, + Gitlab::SidekiqMiddleware::Metrics, + Gitlab::SidekiqMiddleware::ArgumentsLogger, + Gitlab::SidekiqMiddleware::MemoryKiller, + Gitlab::SidekiqMiddleware::RequestStoreMiddleware + ] + end + let(:enabled_sidekiq_middlewares) { all_sidekiq_middlewares - disabled_sidekiq_middlewares } + + before do + Sidekiq::Testing.server_middleware.clear + Sidekiq::Testing.server_middleware(&described_class.server_configurator( + metrics: metrics, + arguments_logger: arguments_logger, + memory_killer: memory_killer, + request_store: request_store + )) + + enabled_sidekiq_middlewares.each do |middleware| + expect_any_instance_of(middleware).to receive(:call).with(*middleware_expected_args).once.and_call_original + end + + disabled_sidekiq_middlewares.each do |middleware| + expect_any_instance_of(Gitlab::SidekiqMiddleware::ArgumentsLogger).not_to receive(:call) + end + end + + context "all optional middlewares off" do + let(:metrics) { false } + let(:arguments_logger) { false } + let(:memory_killer) { false } + let(:request_store) { false } + let(:disabled_sidekiq_middlewares) do + [ + Gitlab::SidekiqMiddleware::Metrics, + Gitlab::SidekiqMiddleware::ArgumentsLogger, + Gitlab::SidekiqMiddleware::MemoryKiller, + Gitlab::SidekiqMiddleware::RequestStoreMiddleware + ] + end + + it "passes through server middlewares" do + worker_class.perform_async(*job_args) + end + end + + context "all optional middlewares on" do + let(:metrics) { true } + let(:arguments_logger) { true } + let(:memory_killer) { true } + let(:request_store) { true } + let(:disabled_sidekiq_middlewares) { [] } + + it "passes through server middlewares" do + worker_class.perform_async(*job_args) + end + end + end + + # The test sets up a new client middleware stack. The test ensures + # that each middleware is: + # 1) not failing + # 2) yielding exactly once + describe '.client_configurator' do + let(:chain) { Sidekiq::Middleware::Chain.new } + let(:job) { { 'args' => job_args } } + let(:queue) { 'default' } + let(:redis_pool) { Sidekiq.redis_pool } + let(:middleware_expected_args) { [worker_class_arg, job, queue, redis_pool] } + + before do + described_class.client_configurator.call(chain) + end + + shared_examples "a client middleware chain" do + # Its possible that a middleware could accidentally omit a yield call + # this will prevent the full middleware chain from being executed. + # This test ensures that this does not happen + it "invokes the chain" do + expect_any_instance_of(Gitlab::SidekiqStatus::ClientMiddleware).to receive(:call).with(*middleware_expected_args).once.and_call_original + expect_any_instance_of(Gitlab::SidekiqMiddleware::CorrelationInjector).to receive(:call).with(*middleware_expected_args).once.and_call_original + + expect { |b| chain.invoke(worker_class_arg, job, queue, redis_pool, &b) }.to yield_control.once + end + end + + # Sidekiq documentation states that the worker class could be a string + # or a class reference. We should test for both + context "handles string worker_class values" do + let(:worker_class_arg) { worker_class.to_s } + + it_behaves_like "a client middleware chain" + end + + context "handles string worker_class values" do + let(:worker_class_arg) { worker_class } + + it_behaves_like "a client middleware chain" + end + end +end diff --git a/spec/rubocop/cop/migration/add_index_spec.rb b/spec/rubocop/cop/migration/add_index_spec.rb new file mode 100644 index 00000000000..0c3f87e5bf8 --- /dev/null +++ b/spec/rubocop/cop/migration/add_index_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require 'rubocop' +require 'rubocop/rspec/support' + +require_relative '../../../../rubocop/cop/migration/add_index' + +describe RuboCop::Cop::Migration::AddIndex do + include CopHelper + + subject(:cop) { described_class.new } + + context 'in migration' do + before do + allow(cop).to receive(:in_migration?).and_return(true) + end + + it 'registers an offense when add_index is used' do + expect_offense(<<~PATTERN.strip_indent) + def change + add_index :table, :column + ^^^^^^^^^ `add_index` requires downtime, use `add_concurrent_index` instead + end + PATTERN + end + end + + context 'outside of migration' do + it 'registers no offense' do + expect_no_offenses(<<~PATTERN.strip_indent) + def change + add_index :table, :column + end + PATTERN + end + end +end |