Merge branch 'fix/add-specs-for-request-profiler' into 'master'
Add specs for Gitlab::RequestProfiler Closes #31513 See merge request !11005
This commit is contained in:
commit
3d318f3c92
3 changed files with 140 additions and 0 deletions
69
spec/features/admin/admin_requests_profiles_spec.rb
Normal file
69
spec/features/admin/admin_requests_profiles_spec.rb
Normal file
|
@ -0,0 +1,69 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe 'Admin::RequestsProfilesController', feature: true do
|
||||
before do
|
||||
FileUtils.mkdir_p(Gitlab::RequestProfiler::PROFILES_DIR)
|
||||
login_as(:admin)
|
||||
end
|
||||
|
||||
after do
|
||||
Gitlab::RequestProfiler.remove_all_profiles
|
||||
end
|
||||
|
||||
describe 'GET /admin/requests_profiles' do
|
||||
it 'shows the current profile token' do
|
||||
allow(Rails).to receive(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
|
||||
|
||||
visit admin_requests_profiles_path
|
||||
|
||||
expect(page).to have_content("X-Profile-Token: #{Gitlab::RequestProfiler.profile_token}")
|
||||
end
|
||||
|
||||
it 'lists all available profiles' do
|
||||
time1 = 1.hour.ago
|
||||
time2 = 2.hours.ago
|
||||
time3 = 3.hours.ago
|
||||
profile1 = "|gitlab-org|gitlab-ce_#{time1.to_i}.html"
|
||||
profile2 = "|gitlab-org|gitlab-ce_#{time2.to_i}.html"
|
||||
profile3 = "|gitlab-com|infrastructure_#{time3.to_i}.html"
|
||||
|
||||
FileUtils.touch("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile1}")
|
||||
FileUtils.touch("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile2}")
|
||||
FileUtils.touch("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile3}")
|
||||
|
||||
visit admin_requests_profiles_path
|
||||
|
||||
within('.panel', text: '/gitlab-org/gitlab-ce') do
|
||||
expect(page).to have_selector("a[href='#{admin_requests_profile_path(profile1)}']", text: time1.to_s(:long))
|
||||
expect(page).to have_selector("a[href='#{admin_requests_profile_path(profile2)}']", text: time2.to_s(:long))
|
||||
end
|
||||
|
||||
within('.panel', text: '/gitlab-com/infrastructure') do
|
||||
expect(page).to have_selector("a[href='#{admin_requests_profile_path(profile3)}']", text: time3.to_s(:long))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET /admin/requests_profiles/:profile' do
|
||||
context 'when a profile exists' do
|
||||
it 'displays the content of the profile' do
|
||||
content = 'This is a request profile'
|
||||
profile = "|gitlab-org|gitlab-ce_#{Time.now.to_i}.html"
|
||||
|
||||
File.write("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile}", content)
|
||||
|
||||
visit admin_requests_profile_path(profile)
|
||||
|
||||
expect(page).to have_content(content)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a profile does not exist' do
|
||||
it 'shows an error message' do
|
||||
visit admin_requests_profile_path('|non|existent_12345.html')
|
||||
|
||||
expect(page).to have_content('Profile not found')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
27
spec/lib/gitlab/request_profiler_spec.rb
Normal file
27
spec/lib/gitlab/request_profiler_spec.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::RequestProfiler, lib: true do
|
||||
describe '.profile_token' do
|
||||
it 'returns a token' do
|
||||
expect(described_class.profile_token).to be_present
|
||||
end
|
||||
|
||||
it 'caches the token' do
|
||||
expect(Rails.cache).to receive(:fetch).with('profile-token')
|
||||
|
||||
described_class.profile_token
|
||||
end
|
||||
end
|
||||
|
||||
describe '.remove_all_profiles' do
|
||||
it 'removes Gitlab::RequestProfiler::PROFILES_DIR directory' do
|
||||
dir = described_class::PROFILES_DIR
|
||||
FileUtils.mkdir_p(dir)
|
||||
|
||||
expect(Dir.exist?(dir)).to be true
|
||||
|
||||
described_class.remove_all_profiles
|
||||
expect(Dir.exist?(dir)).to be false
|
||||
end
|
||||
end
|
||||
end
|
44
spec/requests/request_profiler_spec.rb
Normal file
44
spec/requests/request_profiler_spec.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe 'Request Profiler' do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
shared_examples 'profiling a request' do
|
||||
before do
|
||||
allow(Rails).to receive(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
|
||||
allow(RubyProf::Profile).to receive(:profile) do |&blk|
|
||||
blk.call
|
||||
RubyProf::Profile.new
|
||||
end
|
||||
end
|
||||
|
||||
it 'creates a profile of the request' do
|
||||
project = create(:project, namespace: user.namespace)
|
||||
time = Time.now
|
||||
path = "/#{project.path_with_namespace}"
|
||||
|
||||
Timecop.freeze(time) do
|
||||
get path, nil, 'X-Profile-Token' => Gitlab::RequestProfiler.profile_token
|
||||
end
|
||||
|
||||
profile_path = "#{Gitlab.config.shared.path}/tmp/requests_profiles/#{path.tr('/', '|')}_#{time.to_i}.html"
|
||||
expect(File.exist?(profile_path)).to be true
|
||||
end
|
||||
|
||||
after do
|
||||
Gitlab::RequestProfiler.remove_all_profiles
|
||||
end
|
||||
end
|
||||
|
||||
context "when user is logged-in" do
|
||||
before do
|
||||
login_as(user)
|
||||
end
|
||||
|
||||
include_examples 'profiling a request'
|
||||
end
|
||||
|
||||
context "when user is not logged-in" do
|
||||
include_examples 'profiling a request'
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue