| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import unittest |
| |
| import resource_sack |
| from test_utils import (MakeRequest, |
| TestDependencyGraph) |
| |
| |
| class ResourceSackTestCase(unittest.TestCase): |
| def SimpleGraph(self, node_names): |
| """Create a simple graph from a list of nodes.""" |
| requests = [MakeRequest(node_names[0], 'null')] |
| for n in node_names[1:]: |
| requests.append(MakeRequest(n, node_names[0])) |
| return TestDependencyGraph(requests) |
| |
| def test_NodeMerge(self): |
| g1 = TestDependencyGraph([ |
| MakeRequest(0, 'null'), |
| MakeRequest(1, 0), |
| MakeRequest(2, 0), |
| MakeRequest(3, 1)]) |
| g2 = TestDependencyGraph([ |
| MakeRequest(0, 'null'), |
| MakeRequest(1, 0), |
| MakeRequest(2, 0), |
| MakeRequest(4, 2)]) |
| sack = resource_sack.GraphSack() |
| sack.ConsumeGraph(g1) |
| sack.ConsumeGraph(g2) |
| self.assertEqual(5, len(sack.bags)) |
| for bag in sack.bags: |
| if bag.label not in ('3/', '4/'): |
| self.assertEqual(2, bag.num_nodes) |
| else: |
| self.assertEqual(1, bag.num_nodes) |
| |
| def test_MultiParents(self): |
| g1 = TestDependencyGraph([ |
| MakeRequest(0, 'null'), |
| MakeRequest(2, 0)]) |
| g2 = TestDependencyGraph([ |
| MakeRequest(1, 'null'), |
| MakeRequest(2, 1)]) |
| sack = resource_sack.GraphSack() |
| sack.ConsumeGraph(g1) |
| sack.ConsumeGraph(g2) |
| self.assertEqual(3, len(sack.bags)) |
| labels = {bag.label: bag for bag in sack.bags} |
| def Predecessors(label): |
| bag = labels['%s/' % label] |
| return [e.from_node |
| for e in bag._sack._graph.InEdges(bag)] |
| self.assertEqual( |
| set(['0/', '1/']), |
| set([bag.label for bag in Predecessors(2)])) |
| self.assertFalse(Predecessors(0)) |
| self.assertFalse(Predecessors(1)) |
| |
| def test_Shortname(self): |
| root = MakeRequest(0, 'null') |
| shortname = MakeRequest(1, 0) |
| shortname.url = 'data:fake/content;' + 'lotsand' * 50 + 'lotsofdata' |
| g1 = TestDependencyGraph([root, shortname]) |
| sack = resource_sack.GraphSack() |
| sack.ConsumeGraph(g1) |
| self.assertEqual(set(['0/', 'data:fake/content']), |
| set([bag.label for bag in sack.bags])) |
| |
| def test_Core(self): |
| # We will use a core threshold of 0.5 to make it easier to define |
| # graphs. Resources 0 and 1 are core and others are not. We check full names |
| # and node counts as we output that for core set analysis. In subsequent |
| # tests we just check labels to make the tests easier to read. |
| graphs = [self.SimpleGraph([0, 1, 2]), |
| self.SimpleGraph([0, 1, 3]), |
| self.SimpleGraph([0, 1, 4]), |
| self.SimpleGraph([0, 5])] |
| sack = resource_sack.GraphSack() |
| sack.CORE_THRESHOLD = 0.5 |
| for g in graphs: |
| sack.ConsumeGraph(g) |
| self.assertEqual(set([('http://0', 4), ('http://1', 3)]), |
| set((b.name, b.num_nodes) for b in sack.CoreSet())) |
| |
| def test_IntersectingCore(self): |
| # Graph set A has core set {0, 1} and B {0, 2} so the final core set should |
| # be {0}. Set C makes sure we restrict core computation to tags A and B. |
| set_A = [self.SimpleGraph([0, 1, 2]), |
| self.SimpleGraph([0, 1, 3])] |
| set_B = [self.SimpleGraph([0, 2, 3]), |
| self.SimpleGraph([0, 2, 1])] |
| set_C = [self.SimpleGraph([2 * i + 4, 2 * i + 5]) for i in xrange(5)] |
| sack = resource_sack.GraphSack() |
| sack.CORE_THRESHOLD = 0.5 |
| for g in set_A + set_B + set_C: |
| sack.ConsumeGraph(g) |
| self.assertEqual(set(), sack.CoreSet()) |
| self.assertEqual(set(['0/', '1/']), |
| set(b.label for b in sack.CoreSet(set_A))) |
| self.assertEqual(set(['0/', '2/']), |
| set(b.label for b in sack.CoreSet(set_B))) |
| self.assertEqual(set(), sack.CoreSet(set_C)) |
| self.assertEqual(set(['0/']), |
| set(b.label for b in sack.CoreSet(set_A, set_B))) |
| self.assertEqual(set(), sack.CoreSet(set_A, set_B, set_C)) |
| |
| def test_Simililarity(self): |
| self.assertAlmostEqual( |
| 0.5, |
| resource_sack.GraphSack.CoreSimilarity( |
| set([1, 2, 3]), set([1, 3, 4]))) |
| self.assertEqual( |
| 0, resource_sack.GraphSack.CoreSimilarity(set(), set())) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |