add integration test to verify cache is written if a builder fails

This commit is contained in:
Josh Holtrop 2017-02-16 19:08:03 -05:00
parent 3601359c08
commit 551b8fa365
2 changed files with 45 additions and 2 deletions

View File

@ -2,7 +2,6 @@ require "digest/md5"
require "fileutils" require "fileutils"
require "json" require "json"
require "set" require "set"
require "singleton"
require "rscons/version" require "rscons/version"
module Rscons module Rscons
@ -51,7 +50,6 @@ module Rscons
# }, # },
# } # }
class Cache class Cache
include Singleton
# Name of the file to store cache information in # Name of the file to store cache information in
CACHE_FILE = ".rsconscache" CACHE_FILE = ".rsconscache"
@ -59,6 +57,18 @@ module Rscons
# Prefix for phony cache entries. # Prefix for phony cache entries.
PHONY_PREFIX = ":PHONY:" PHONY_PREFIX = ":PHONY:"
class << self
# Access the singleton instance.
def instance
@instance ||= Cache.new
end
# Reset the cache (for unit/integration test purposes)
def reset!
@instance = nil
end
end
# Create a Cache object and load in the previous contents from the cache # Create a Cache object and load in the previous contents from the cache
# file. # file.
def initialize def initialize

View File

@ -54,6 +54,7 @@ describe Rscons do
def test_dir(build_test_directory) def test_dir(build_test_directory)
FileUtils.cp_r("build_tests/#{build_test_directory}", BUILD_TEST_RUN_DIR) FileUtils.cp_r("build_tests/#{build_test_directory}", BUILD_TEST_RUN_DIR)
Dir.chdir(BUILD_TEST_RUN_DIR) Dir.chdir(BUILD_TEST_RUN_DIR)
@saved_stderr.reopen(".stderr")
end end
def file_sub(fname) def file_sub(fname)
@ -798,6 +799,38 @@ EOF
]) ])
end end
it "does not re-run previously successful builders if one fails" do
test_dir('simple')
File.open("two.c", "w") do |fh|
fh.puts("FOO")
end
expect do
Rscons::Environment.new do |env|
env.Program("simple", %w[simple.c two.c])
end
end.to raise_error /Failed to build simple/
result = lines
expect(result.size).to be > 2
expect(result[0, 2]).to eq [
"CC simple.o",
"CC two.o",
]
expect(File.exists?("simple.o")).to be_truthy
expect(File.exists?("two.o")).to be_falsey
expect(File.exists?("two_sources#{Rscons::Environment.new["PROGSUFFIX"]}")).to be_falsey
Rscons::Cache.reset!
File.open("two.c", "w") {|fh|}
Rscons::Environment.new do |env|
env.Program("simple", %w[simple.c two.c])
end
expect(lines).to eq [
"CC two.o",
"LD simple",
]
end
context "Directory builder" do context "Directory builder" do
it "creates the requested directory" do it "creates the requested directory" do
test_dir("simple") test_dir("simple")