def test_growing_current_inputs(self): cr = compile_rule.find_compile_rule('genfiles/computed_inputs/curr2') self._write_to('a1', '') self.assertEqual([], cr.input_files('genfiles/computed_inputs/curr2')) self.assertEqual( ['a1'], cr.input_trigger_files('genfiles/computed_inputs/curr2')) self._write_to('a1', 'b1,number3') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['b1', 'number3'], cr.input_files('genfiles/computed_inputs/curr2')) self.assertEqual( ['a1', 'b1', 'number3'], cr.input_trigger_files('genfiles/computed_inputs/curr2')) # Let's keep going! self._write_to('b1', 'b2') filemod_db.clear_mtime_cache() # Since a1 and number3 didn't change, we should only judge based on b1. self.assertEqual(['b2'], cr.input_files('genfiles/computed_inputs/curr2')) self.assertEqual( ['a1', 'b2'], cr.input_trigger_files('genfiles/computed_inputs/curr2'))
def test_compute_crc_flag(self): self._add_to_db('o1', 'i1', compute_crc=True) self._change_mtime('i1') filemod_db.clear_mtime_cache() self._maybe_update('o1', ['i1'], compute_crc=True) with open(self._abspath('o1')) as f: self.assertEqual('o1o1o1o1o1', f.read())
def test_recompute_inputs_if_changed(self): cr = compile_rule.find_compile_rule('genfiles/a.ii') self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'], cr.input_files('genfiles/a.ii')) self._write_to('a.h', '#include "includes/d.h" /* new include */ \n') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a.c', 'a.h', 'includes/d.h', 'a1'], cr.input_files('genfiles/a.ii'))
def test_trigger_changes_on_genfiles(self): cr = compile_rule.find_compile_rule('genfiles/computed_inputs/a2') with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a2'], cr.input_files('genfiles/computed_inputs/a2')) self._write_to('number3', '') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a2'], cr.input_files('genfiles/computed_inputs/a2'))
def test_recompute_inputs_even_if_mtime_doesnt_change(self): cr = compile_rule.find_compile_rule('genfiles/a.ii') self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'], cr.input_files('genfiles/a.ii')) # modify includes/a.h without modifying its mtime mtime = os.path.getmtime(self._abspath('a.h')) self._write_to('a.h', '#include "includes/d.h" // change the include') os.utime(self._abspath('a.h'), (mtime, mtime)) filemod_db.clear_mtime_cache() self.assertEqual(['a.c', 'a.h', 'includes/d.h', 'a1'], cr.input_files('genfiles/a.ii'))
def test_computed_inputs_from_file(self): self._write_to('a1', 'a1,a2,genfiles/fnumber') cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content') self.assertEqual(['a1', 'a2', 'genfiles/fnumber'], cr.input_files('genfiles/computed_inputs/content')) self._write_to('a1', 'b1,genfiles/fletter') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual( ['b1', 'genfiles/fletter'], cr.input_files('genfiles/computed_inputs/content'))
def test_trigger_changes(self): cr = compile_rule.find_compile_rule('genfiles/computed_inputs/static') with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a1', 'a2'], cr.input_files('genfiles/computed_inputs/static')) # a1 is one of the trigger files for this rule. self._write_to('a1', '') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a1', 'a2'], cr.input_files('genfiles/computed_inputs/static'))
def test_current_inputs(self): cr = compile_rule.find_compile_rule('genfiles/computed_inputs/curr') self.assertEqual(['a1', 'a2'], cr.input_files('genfiles/computed_inputs/curr')) self.assertEqual( ['a1', 'a2'], cr.input_trigger_files('genfiles/computed_inputs/curr')) self._write_to('a1', '') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a1', 'a2'], cr.input_files('genfiles/computed_inputs/curr'))
def test_include_cache(self): cr = compile_rule.find_compile_rule('genfiles/a.ii') self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'], cr.input_files('genfiles/a.ii')) self._write_to('includes/b.h', '#include "d.h" /* new include */ \n') filemod_db.clear_mtime_cache() with mock.patch('kake.log.v3') as logger: actual = cr.input_files('genfiles/a.ii') self.assertEqual([ mock.call('extracting includes from %s', 'includes/b.h'), mock.call('extracting includes from %s', 'includes/d.h') ], logger.call_args_list) self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/d.h', 'a1'], actual)
def test_compute_crc(self): self._write_to('a1', 'a1,a2,genfiles/fnumber') cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content') self.assertEqual(['a1', 'a2', 'genfiles/fnumber'], cr.input_files('genfiles/computed_inputs/content')) # Adjust the mtime of this file to sometime in the distant past. os.utime(os.path.join(self.tmpdir, 'a1'), (1, 1)) filemod_db.clear_mtime_cache() # This should not cause a recompute even though the mtime has # changed, because we used compute_crc. cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content') with self.assertCalled(cr.input_patterns.input_patterns, 0): self.assertEqual( ['a1', 'a2', 'genfiles/fnumber'], cr.input_files('genfiles/computed_inputs/content'))
def test_trigger_depends_on_output(self): cr = compile_rule.find_compile_rule('genfiles/computed_inputs/b2') with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a2'], cr.input_files('genfiles/computed_inputs/b2')) self._write_to('b2', '') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 1): self.assertEqual(['a2'], cr.input_files('genfiles/computed_inputs/b2')) # But if we touch b1, it doesn't cause a new call self._write_to('b1', '') filemod_db.clear_mtime_cache() with self.assertCalled(cr.input_patterns.input_patterns, 0): self.assertEqual(['a2'], cr.input_files('genfiles/computed_inputs/b2'))
def test_recompute_inputs_when_a_bad_include_is_fixed(self): # Have a.c have a bad include. self._write_to( 'a.c', '#include <stdio.h>\n' '#include "includes/non_existent_file.h"\n' 'int main() { return 0; }\n') cr = compile_rule.find_compile_rule('genfiles/a.ii') with self.assertRaises(IOError): # 'file not found' cr.input_files('genfiles/a.ii') # Now fix up a.c. self._write_to( 'a.c', '#include <stdio.h>\n' '#include "a.h"\n' 'int main() { return 0; }\n') filemod_db.clear_mtime_cache() # We should be able to calculate the new trigger files, even # though the last, failed request cached a non-existent file. self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h'], list(cr.input_trigger_files('genfiles/a.ii')))
def _build_many(outfile_names_and_contexts, num_processes=1, force=False, checkpoint_interval=None): filemod_db.clear_mtime_cache() return build.build_with_optional_checkpoints( outfile_names_and_contexts, num_processes, force, checkpoint_interval)