Commit c8861da7 authored by Tomasz Maczukin's avatar Tomasz Maczukin

Update specs - add mocks to simulate old versions

parent e2e8ec60
...@@ -117,10 +117,6 @@ class ApplicationController < ActionController::Base ...@@ -117,10 +117,6 @@ class ApplicationController < ActionController::Base
render file: Rails.root.join("public", "404"), layout: false, status: "404" render file: Rails.root.join("public", "404"), layout: false, status: "404"
end end
def render_410
render file: Rails.root.join("public", "410"), layout: false, status: "410"
end
def no_cache_headers def no_cache_headers
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache" response.headers["Pragma"] = "no-cache"
......
...@@ -79,9 +79,9 @@ class Projects::BuildsController < Projects::ApplicationController ...@@ -79,9 +79,9 @@ class Projects::BuildsController < Projects::ApplicationController
def raw def raw
if @build.has_trace_file? if @build.has_trace_file?
send_file @build.path_to_trace, type: 'text/plain; charset=utf-8', disposition: 'inline' send_file @build.trace_file_path, type: 'text/plain; charset=utf-8', disposition: 'inline'
else else
render_410 render_404
end end
end end
......
...@@ -217,7 +217,7 @@ module Ci ...@@ -217,7 +217,7 @@ module Ci
end end
def raw_trace def raw_trace
if File.file?(path_to_trace) if File.exist?(path_to_trace)
File.read(path_to_trace) File.read(path_to_trace)
elsif has_old_trace_file? elsif has_old_trace_file?
# Temporary fix for build trace data integrity # Temporary fix for build trace data integrity
...@@ -274,6 +274,14 @@ module Ci ...@@ -274,6 +274,14 @@ module Ci
end end
end end
def trace_file_path
if has_old_trace_file?
old_path_to_trace
else
path_to_trace
end
end
def dir_to_trace def dir_to_trace
File.join( File.join(
Settings.gitlab_ci.builds_path, Settings.gitlab_ci.builds_path,
......
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<title>The page you're looking for is gone (410)</title>
<style>
body {
color: #666;
text-align: center;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
margin: auto;
font-size: 14px;
}
h1 {
font-size: 56px;
line-height: 100px;
font-weight: normal;
color: #456;
}
h2 {
font-size: 24px;
color: #666;
line-height: 1.5em;
}
h3 {
color: #456;
font-size: 20px;
font-weight: normal;
line-height: 28px;
}
hr {
max-width: 800px;
margin: 18px auto;
border: 0;
border-top: 1px solid #EEE;
border-bottom: 1px solid white;
}
img {
max-width: 40vw;
}
.container {
margin: auto 20px;
}
</style>
</head>
<body>
<h1>
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" alt="GitLab Logo" /><br />
410
</h1>
<div class="container">
<h3>The page you're looking for is gone.</h3>
<hr />
<p>Make sure the address is correct and that the page hasn't moved.</p>
<p>Please contact your GitLab administrator if you think this is a mistake.</p>
</div>
</body>
</html>
require 'spec_helper' require 'spec_helper'
require 'tempfile'
describe "Builds" do describe "Builds" do
let(:artifacts_file) { fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') } let(:artifacts_file) { fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') }
...@@ -6,7 +7,7 @@ describe "Builds" do ...@@ -6,7 +7,7 @@ describe "Builds" do
before do before do
login_as(:user) login_as(:user)
@commit = FactoryGirl.create :ci_pipeline @commit = FactoryGirl.create :ci_pipeline
@build = FactoryGirl.create :ci_build, pipeline: @commit @build = FactoryGirl.create :ci_build, :trace, pipeline: @commit
@build2 = FactoryGirl.create :ci_build @build2 = FactoryGirl.create :ci_build
@project = @commit.project @project = @commit.project
@project.team << [@user, :developer] @project.team << [@user, :developer]
...@@ -156,7 +157,6 @@ describe "Builds" do ...@@ -156,7 +157,6 @@ describe "Builds" do
context 'Build raw trace' do context 'Build raw trace' do
before do before do
@build.run! @build.run!
@build.trace = 'BUILD TRACE'
visit namespace_project_build_path(@project.namespace, @project, @build) visit namespace_project_build_path(@project.namespace, @project, @build)
end end
...@@ -255,12 +255,12 @@ describe "Builds" do ...@@ -255,12 +255,12 @@ describe "Builds" do
end end
end end
describe "GET /:project/builds/:id/raw" do describe 'GET /:project/builds/:id/raw' do
context "Build from project" do context 'access source' do
context 'build from project' do
before do before do
Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile') Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile')
@build.run! @build.run!
@build.trace = 'BUILD TRACE'
visit namespace_project_build_path(@project.namespace, @project, @build) visit namespace_project_build_path(@project.namespace, @project, @build)
page.within('.js-build-sidebar') { click_link 'Raw' } page.within('.js-build-sidebar') { click_link 'Raw' }
end end
...@@ -272,14 +272,11 @@ describe "Builds" do ...@@ -272,14 +272,11 @@ describe "Builds" do
end end
end end
context "Build from other project" do context 'build from other project' do
before do before do
Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile') Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile')
@build2.run! @build2.run!
@build2.trace = 'BUILD TRACE'
visit raw_namespace_project_build_path(@project.namespace, @project, @build2) visit raw_namespace_project_build_path(@project.namespace, @project, @build2)
puts page.status_code
puts current_url
end end
it 'sends the right headers' do it 'sends the right headers' do
...@@ -288,6 +285,75 @@ describe "Builds" do ...@@ -288,6 +285,75 @@ describe "Builds" do
end end
end end
context 'storage form' do
let (:existing_file) { Tempfile.new('existing-trace-file').path }
let (:non_existing_file) do
file = Tempfile.new('non-existing-trace-file')
path = file.path
file.unlink
path
end
context 'when build has trace in file' do
before do
Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile')
@build.run!
visit namespace_project_build_path(@project.namespace, @project, @build)
allow_any_instance_of(Project).to receive(:ci_id).and_return(nil)
allow_any_instance_of(Ci::Build).to receive(:path_to_trace).and_return(existing_file)
allow_any_instance_of(Ci::Build).to receive(:old_path_to_trace).and_return(non_existing_file)
page.within('.js-build-sidebar') { click_link 'Raw' }
end
it 'sends the right headers' do
expect(page.status_code).to eq(200)
expect(page.response_headers['Content-Type']).to eq('text/plain; charset=utf-8')
expect(page.response_headers['X-Sendfile']).to eq(existing_file)
end
end
context 'when build has trace in old file' do
before do
Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile')
@build.run!
visit namespace_project_build_path(@project.namespace, @project, @build)
allow_any_instance_of(Project).to receive(:ci_id).and_return(999)
allow_any_instance_of(Ci::Build).to receive(:path_to_trace).and_return(non_existing_file)
allow_any_instance_of(Ci::Build).to receive(:old_path_to_trace).and_return(existing_file)
page.within('.js-build-sidebar') { click_link 'Raw' }
end
it 'sends the right headers' do
expect(page.status_code).to eq(200)
expect(page.response_headers['Content-Type']).to eq('text/plain; charset=utf-8')
expect(page.response_headers['X-Sendfile']).to eq(existing_file)
end
end
context 'when build has trace in DB' do
before do
Capybara.current_session.driver.header('X-Sendfile-Type', 'X-Sendfile')
@build.run!
visit namespace_project_build_path(@project.namespace, @project, @build)
allow_any_instance_of(Project).to receive(:ci_id).and_return(nil)
allow_any_instance_of(Ci::Build).to receive(:path_to_trace).and_return(non_existing_file)
allow_any_instance_of(Ci::Build).to receive(:old_path_to_trace).and_return(non_existing_file)
page.within('.js-build-sidebar') { click_link 'Raw' }
end
it 'sends the right headers' do
expect(page.status_code).to eq(404)
end
end
end
end
describe "GET /:project/builds/:id/trace.json" do describe "GET /:project/builds/:id/trace.json" do
context "Build from project" do context "Build from project" do
before do before do
......
...@@ -28,46 +28,55 @@ describe Ci::Build, models: true do ...@@ -28,46 +28,55 @@ describe Ci::Build, models: true do
context 'when there is a trace' do context 'when there is a trace' do
context 'when trace is stored in file' do context 'when trace is stored in file' do
let(:build_with_trace) { create(:ci_build, :trace) }
it { expect(build_with_trace.has_trace_file?).to be_truthy }
it { expect(build_with_trace.trace).to eq('BUILD TRACE') }
end
context 'when trace is stored in old file' do
before do before do
build.trace = test_trace allow(build.project).to receive(:ci_id).and_return(999)
build.save allow(File).to receive(:exist?).with(build.path_to_trace).and_return(false)
allow(File).to receive(:exist?).with(build.old_path_to_trace).and_return(true)
allow(File).to receive(:read).with(build.old_path_to_trace).and_return(test_trace)
end end
it { expect(build.has_trace_file?).to be_truthy } it { expect(build.has_trace_file?).to be_truthy }
it { expect(build.trace).to eq(test_trace) } it { expect(build.trace).to eq(test_trace) }
end end
context 'when trace is stored in old file' do context 'when trace is stored in DB' do
before do before do
build.trace = test_trace allow(build.project).to receive(:ci_id).and_return(nil)
build.save allow(build).to receive(:read_attribute).with(:trace).and_return(test_trace)
allow(File).to receive(:exist?).with(build.path_to_trace).and_return(false)
build.project.ci_id = 999 allow(File).to receive(:exist?).with(build.old_path_to_trace).and_return(false)
build.project.save
FileUtils.mkdir_p(build.old_dir_to_trace)
FileUtils.mv(build.path_to_trace, build.old_path_to_trace)
end end
it { expect(build.has_trace_file?).to be_truthy } it { expect(build.has_trace_file?).to be_falsey }
it { expect(build.trace).to eq(test_trace) } it { expect(build.trace).to eq(test_trace) }
end end
context 'when there is stored in DB' do
class Ci::Build
def write_db_trace=(trace)
write_attribute :trace, trace
end end
end end
describe '#trace_file_path' do
context 'when trace is stored in file' do
before do before do
build.write_db_trace = test_trace allow(build).to receive(:has_trace_file?).and_return(true)
build.save allow(build).to receive(:has_old_trace_file?).and_return(false)
end end
it { expect(build.has_trace_file?).to be_falsey } it { expect(build.trace_file_path).to eq(build.path_to_trace) }
it { expect(build.trace).to eq(test_trace) }
end end
context 'when trace is stored in old file' do
before do
allow(build).to receive(:has_trace_file?).and_return(true)
allow(build).to receive(:has_old_trace_file?).and_return(true)
end
it { expect(build.trace_file_path).to eq(build.old_path_to_trace) }
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment