def test_build_closure_different_versions_restricted(self): '''Computes a CompatibilityClosure in which two versions of blockA actually point to the same unmodified resource with the typical diamond layout Also computes and checks the BlockClosure for that layout''' ref_translator = Mock() depA1 = BlockVersion(BRLBlock('user/user/blockA/branch'), 4) depA2 = BlockVersion(BRLBlock('user/user/blockA/branch'), 5) baseB = BlockVersion(BRLBlock('user/user/blockB/branch'), 2) baseC = BlockVersion(BRLBlock('user/user/blockC/branch'), 3) full_graph = BlockVersionGraph() full_graph.add_nodes([baseB, baseC, depA1, depA2]) full_graph.add_edge(baseB, depA1) full_graph.add_edge(baseC, depA2) def res_method(*args): depsb = [BlockCellName('user/blockA/a.h')] depsc = [BlockCellName('user/blockA/a.h')] result = ReferencedResources() for ref in args[0].explode(): result[ref.block_version][ref.ref] = \ {Reference(depA1, 'a.h'): ((0, 0), 0, []), Reference(depA2, 'a.h'): ((0, 0), 0, []), Reference(baseB, 'b.h'): ((1, 4), 1, depsb), Reference(baseC, 'c.h'): ((2, 3), 2, depsc)}[ref] return result ref_translator.get_published_min_refs.side_effect = res_method missing = References() missing.add(Reference(baseB, 'b.h')) missing.add(Reference(baseC, 'c.h')) closure = CompatibilityClosure(missing) build_compatibility_closure(ref_translator, closure, {baseC}, full_graph) self.assertEqual(References(), closure.broken) self.assertEqual({BlockCellName('user/blockC/c.h')}, closure.block_cell_names) #self.assertIn(Reference(depA1, 'a.h'), closure.references) self.assertNotIn(baseB, closure.references) self.assertNotIn(depA1, closure.references) self.assertNotIn(depA2, closure.references) self.assertIn(baseC, closure.references) expected_frontier = References() expected_frontier[baseB].add('b.h') expected_frontier[depA2].add('a.h') self.assertEqual(expected_frontier, closure.frontier)
def test_virtual_no_settings(self): '''builds a very simple closure in which virtual cells are involved. Maybe it is not very useful, as now virtuality is not handled at this level, only at the MemServerStore level, so this test might be redundant''' ref_translator, depA, depB, baseC, full_graph = self._virtual_setup() missing = References() missing.add(Reference(baseC, 'c.h')) closure = CompatibilityClosure(missing) build_compatibility_closure(ref_translator, closure, full_graph.nodes, full_graph) self.assertEqual(References(), closure.broken) self.assertEqual(set([BlockCellName('user/blockA/a.h'), BlockCellName('user/blockB/b.h'), BlockCellName('user/blockC/c.h'), BlockCellName('user/blockC/win/c.h'), BlockCellName('user/blockC/nix/c.h')]), closure.block_cell_names)
def test_broken_closure(self): '''computes a closure in which cell blockB/b.h depends on blockA/a.h, but that a.h is not found. The algorithms of closures must return that as a missing or broken dependency ''' ref_translator = Mock() baseB = BlockVersion(BRLBlock('user/user/blockB/branch'), 2) depA1 = BlockVersion(BRLBlock('user/user/blockA/branch'), 4) full_graph = BlockVersionGraph() full_graph.add_nodes([baseB, depA1]) full_graph.add_edge(baseB, depA1) def res_method(*args): depsb = [BlockCellName('user/blockA/a.h')] result = ReferencedResources() for ref in args[0].explode(): try: result[ref.block_version][ref.ref] = \ { Reference(baseB, 'b.h'): ((0, 0), 0, depsb), }[ref] except KeyError: pass return result ref_translator.get_published_min_refs.side_effect = res_method missing = References() missing.add(Reference(baseB, 'b.h')) closure = CompatibilityClosure(missing) build_compatibility_closure(ref_translator, closure, full_graph.nodes, full_graph) self.assertEqual({BlockCellName('user/blockB/b.h')}, closure.block_cell_names) self.assertIn(baseB, closure.references) expected_missing = References() expected_missing[depA1].add('a.h') self.assertEqual(closure.broken, expected_missing)