Recipes/Topology: test_topology.py

File test_topology.py, 12.6 kB (added by guest, 5 years ago)

Unit test cases for topology.py

Line 
1import unittest
2
3from elixir import *
4
5from topology import *
6
7class PriorityNode(TraceNode):
8    using_options(inheritance='multi')
9    # priority of this task
10    priority = Field(Float, default=1.0)
11           
12    def __repr__(self):
13        pattern = '<PriorityNode id: %s, priority: %s, version: %s, changed: %s>'
14        return pattern % (self.id, self.priority, self.version, self.changed)
15       
16    def __cmp__(self, other):
17        if self.priority < other.priority:
18            return -1
19        elif self.priority > other.priority:
20            return 1
21        return TraceNode.__cmp__(self, other)
22
23class TestTopology(unittest.TestCase):
24   
25    def setUp(self):
26        metadata.bind = 'sqlite:///'
27        #metadata.bind.echo = True
28        setup_all(True)
29   
30    def tearDown(self):
31        session.clear()
32        drop_all()
33       
34    def testDetectCycle1(self):
35        """
36        B -> A
37        |    | \
38        C <- D<-E
39       
40        B -> A
41        E -> A
42        D -> A
43        C -> B
44        D -> C
45        E -> D
46        """
47        a = TraceNode()
48        b = TraceNode()
49        c = TraceNode()
50        d = TraceNode()
51        e = TraceNode()
52       
53        ba = TraceLink(fromNode=b, toNode=a)
54        ea = TraceLink(fromNode=e, toNode=a)
55        da = TraceLink(fromNode=d, toNode=a)
56        cb = TraceLink(fromNode=c, toNode=b)
57        dc = TraceLink(fromNode=d, toNode=c)
58        ed = TraceLink(fromNode=e, toNode=d)
59       
60        session.commit()
61        self.assertFalse(detectCycle([a, b, c, d, e]))
62       
63    def testDetectCycle2(self):
64        """
65           A
66         /  \
67        B -> C
68       
69        A -> B
70        B -> C
71        C -> A
72       
73        """
74        a = TraceNode()
75        b = TraceNode()
76        c = TraceNode()
77       
78        ab = TraceLink(fromNode=a, toNode=b)
79        bc = TraceLink(fromNode=b, toNode=c)
80        ca = TraceLink(fromNode=c, toNode=a)
81       
82        session.commit()
83        self.assertTrue(detectCycle([a, b, c]))
84        self.assertFalse(detectCycle([a, b]))
85        self.assertFalse(detectCycle([a, c]))
86        self.assertFalse(detectCycle([b, c]))
87       
88    def testDetectCycle3(self):
89        """
90           A
91         /  \
92        B -> C
93        |    |
94        E <- F
95       
96        B -> A
97        C -> A
98        B -> C
99        E -> B
100        F -> E
101        C -> F
102       
103        """
104        a = TraceNode()
105        b = TraceNode()
106        c = TraceNode()
107        d = TraceNode()
108        e = TraceNode()
109        f = TraceNode()
110       
111        ba = TraceLink(fromNode=b, toNode=a)
112        ca = TraceLink(fromNode=c, toNode=a)
113        bc = TraceLink(fromNode=b, toNode=c)
114        eb = TraceLink(fromNode=e, toNode=b)
115        fe = TraceLink(fromNode=f, toNode=e)
116        cf = TraceLink(fromNode=c, toNode=f)
117       
118        session.commit()
119        self.assertTrue(detectCycle([a, b, c, d, e, f]))
120       
121    def testDetectCycle4(self):
122        """
123        A B C D E F
124       
125        """
126        a = TraceNode()
127        b = TraceNode()
128        c = TraceNode()
129        d = TraceNode()
130        e = TraceNode()
131        f = TraceNode()
132       
133        session.commit()
134        self.assertFalse(detectCycle([a, b, c, d, e, f]))
135       
136    def testDetectCycle5(self):
137        """
138                A
139              /   \
140             B---->C
141             \    /
142               D
143               
144        B -> A
145        C -> A
146        B -> C
147        C -> D
148        D -> B
149       
150        True
151        """
152        a = TraceNode(changed=False)
153        b = TraceNode(changed=False)
154        c = TraceNode(changed=False)
155        d = TraceNode(changed=False)
156       
157        ba = TraceLink(fromNode=b, toNode=a)
158        ca = TraceLink(fromNode=c, toNode=a)
159        bc = TraceLink(fromNode=b, toNode=c)
160        cd = TraceLink(fromNode=c, toNode=d)
161        db = TraceLink(fromNode=d, toNode=b)
162       
163        session.commit()
164        self.assertTrue(detectCycle([a, b, c, d]))
165       
166    def testDetectCycle6(self):
167        """
168                G
169              / | \
170             B->C  D
171            /\  | /
172           F->E<-A
173           
174        B -> G
175        B -> C
176        C -> G
177        D -> G
178        F -> B
179        F -> E
180        E -> B
181        A -> D
182        A -> C
183        A -> E
184       
185        The sorted nodes should be
186        G, C, D, B, E, A, F
187        """
188        a = TraceNode(changed=False)
189        b = TraceNode(changed=False)
190        c = TraceNode(changed=False)
191        d = TraceNode(changed=False)
192        e = TraceNode(changed=False)
193        f = TraceNode(changed=False)
194        g = TraceNode(changed=False)
195
196        bg = TraceLink(fromNode=b, toNode=g)
197        bc = TraceLink(fromNode=b, toNode=c)
198        cg = TraceLink(fromNode=c, toNode=g)
199        dg = TraceLink(fromNode=d, toNode=g)
200        fb = TraceLink(fromNode=f, toNode=b)
201        fe = TraceLink(fromNode=f, toNode=e)
202        eb = TraceLink(fromNode=e, toNode=b)
203        ad = TraceLink(fromNode=a, toNode=d)
204        ac = TraceLink(fromNode=a, toNode=c)
205        ae = TraceLink(fromNode=a, toNode=e)
206       
207        session.commit()
208        self.assertFalse(detectCycle([g, c, d, b, e, a, f]))
209       
210    def testSortNodes1(self):
211        """
212                A
213              / | \
214             B->C<-D
215             \  | /
216               E
217               
218        B -> A
219        B -> C
220        C -> A
221        D -> A
222        D -> C
223        E -> B
224        E -> C
225        E -> D
226       
227        The sorted nodes should be
228        A, C, B, D, E
229        """
230        e = TraceNode(changed=False)
231        c = TraceNode(changed=False)
232        a = TraceNode(changed=False)
233        b = TraceNode(changed=False)
234        d = TraceNode(changed=False)
235       
236        ba = TraceLink(fromNode=b, toNode=a)
237        bc = TraceLink(fromNode=b, toNode=c)
238        ca = TraceLink(fromNode=c, toNode=a)
239        da = TraceLink(fromNode=d, toNode=a)
240        dc = TraceLink(fromNode=d, toNode=c)
241        eb = TraceLink(fromNode=e, toNode=b)
242        ec = TraceLink(fromNode=e, toNode=c)
243        ed = TraceLink(fromNode=e, toNode=d)
244
245        nodes = TraceNode.query.all()
246        nodes = sortNodes(nodes)
247        self.assertEqual(nodes, [a, c, b, d, e])
248       
249    def testSortNodes2(self):
250        """
251            A
252          /  \
253         B   C
254          \ /
255           D
256           
257        C.priority = 10
258        B -> A
259        C -> A
260        D -> B
261        D -> C
262       
263        The sorted nodes should be
264        A, C, B, D
265        """
266        a = PriorityNode()
267        b = PriorityNode()
268        c = PriorityNode(priority=-10)
269        d = PriorityNode()
270       
271        ba = TraceLink(fromNode=b, toNode=a)
272        ca = TraceLink(fromNode=c, toNode=a)
273        db = TraceLink(fromNode=d, toNode=b)
274        dc = TraceLink(fromNode=d, toNode=c)
275
276        nodes = TraceNode.query.all()
277        nodes = sortNodes(nodes)
278        self.assertEqual(nodes, [a, c, b, d])
279       
280    def testSortNodes3(self):
281        """
282        A -> B
283        |    |
284        C <- D
285           
286        A -> B
287        C -> A
288        D -> C
289        D -> B
290       
291        The sorted nodes should be
292        B, A, C, D
293        """
294        a = PriorityNode()
295        b = PriorityNode()
296        c = PriorityNode(priority=-10)
297        d = PriorityNode()
298       
299        ab = TraceLink(fromNode=a, toNode=b)
300        ca = TraceLink(fromNode=c, toNode=a)
301        dc = TraceLink(fromNode=d, toNode=c)
302        db = TraceLink(fromNode=d, toNode=b)
303
304        nodes = TraceNode.query.all()
305        nodes = sortNodes(nodes)
306        self.assertEqual(nodes, [b, a, c, d])
307       
308    def testSortNodes4(self):
309        """
310        A -> B
311        |    | \
312        C <- D  E
313           
314        A -> B
315        C -> A
316        D -> C
317        D -> B
318        E -> B
319       
320        The sorted nodes should be
321        B, A, E, C, D
322        """
323        a = PriorityNode()
324        b = PriorityNode()
325        c = PriorityNode()
326        d = PriorityNode()
327        e = PriorityNode()
328       
329        ab = TraceLink(fromNode=a, toNode=b)
330        ca = TraceLink(fromNode=c, toNode=a)
331        dc = TraceLink(fromNode=d, toNode=c)
332        db = TraceLink(fromNode=d, toNode=b)
333        eb = TraceLink(fromNode=e, toNode=b)
334
335        nodes = TraceNode.query.all()
336        nodes = sortNodes(nodes)
337        self.assertEqual(nodes, [b, a, e, c, d])
338       
339    def testSortNodes5(self):
340        """
341                G
342              / | \
343             B->C  D
344            /\  | /
345           F->E<-A
346           
347        B -> G
348        B -> C
349        C -> G
350        D -> G
351        F -> B
352        F -> E
353        E -> B
354        A -> D
355        A -> C
356        A -> E
357       
358        The sorted nodes should be
359        G, C, D, B, E, A, F
360        """
361        a = TraceNode(changed=False)
362        b = TraceNode(changed=False)
363        c = TraceNode(changed=False)
364        d = TraceNode(changed=False)
365        e = TraceNode(changed=False)
366        f = TraceNode(changed=False)
367        g = TraceNode(changed=False)
368
369        bg = TraceLink(fromNode=b, toNode=g)
370        bc = TraceLink(fromNode=b, toNode=c)
371        cg = TraceLink(fromNode=c, toNode=g)
372        dg = TraceLink(fromNode=d, toNode=g)
373        fb = TraceLink(fromNode=f, toNode=b)
374        fe = TraceLink(fromNode=f, toNode=e)
375        eb = TraceLink(fromNode=e, toNode=b)
376        ad = TraceLink(fromNode=a, toNode=d)
377        ac = TraceLink(fromNode=a, toNode=c)
378        ae = TraceLink(fromNode=a, toNode=e)
379
380        nodes = TraceNode.query.all()
381        nodes = sortNodes(nodes)
382        self.assertEqual(nodes, [g, c, d, b, e, a, f])
383       
384    def testChangeTracer1(self):
385        """
386                G
387              / | \
388             B->C  D
389            /\  | /
390           F->E<-A
391           
392        B -> G
393        B -> C
394        C -> G
395        D -> G
396        F -> B
397        F -> E
398        E -> B
399        A -> D
400        A -> C
401        A -> E
402                   
403        Change G should be update in [G, C, D, B, E, A, F] order
404        Change B should be update in [B, E, A, F] order
405        Change C should be update in [C, B, E, A, F] order
406        """
407        a = TraceNode(changed=False)
408        b = TraceNode(changed=False)
409        c = TraceNode(changed=False)
410        d = TraceNode(changed=False)
411        e = TraceNode(changed=False)
412        f = TraceNode(changed=False)
413        g = TraceNode(changed=False)
414
415        bg = TraceLink(fromNode=b, toNode=g)
416        bc = TraceLink(fromNode=b, toNode=c)
417        cg = TraceLink(fromNode=c, toNode=g)
418        dg = TraceLink(fromNode=d, toNode=g)
419        fb = TraceLink(fromNode=f, toNode=b)
420        fe = TraceLink(fromNode=f, toNode=e)
421        eb = TraceLink(fromNode=e, toNode=b)
422        ad = TraceLink(fromNode=a, toNode=d)
423        ac = TraceLink(fromNode=a, toNode=c)
424        ae = TraceLink(fromNode=a, toNode=e)
425
426        tracer = ChangeTracer()
427
428        nodes = []
429        def handleNode(node):
430            nodes.append(node)
431           
432        # make some change here
433        g.changed = True
434        tracer.traceChange(handleNode)
435        self.assertEqual(nodes, [g, c, d, b, e, a, f])
436       
437        nodes = []
438        # make some change here
439        b.changed = True
440        tracer.traceChange(handleNode)
441        self.assertEqual(nodes, [b, e, a, f])
442       
443        nodes = []
444        # make some change here
445        c.changed = True
446        tracer.traceChange(handleNode)
447        self.assertEqual(nodes, [c, b, e, a, f])
448       
449    def testChangeTracer2(self):
450        """
451        A -> B
452        |    | \
453        C <- D  E
454           
455        A -> B
456        C -> A
457        D -> C
458        D -> B
459        E -> B
460                   
461        Change B should be update in [B, A, E, C, D] order
462        """
463        a = TraceNode(changed=False)
464        b = TraceNode(changed=False)
465        c = TraceNode(changed=False)
466        d = TraceNode(changed=False)
467        e = TraceNode(changed=False)
468
469        ab = TraceLink(fromNode=a, toNode=b)
470        ca = TraceLink(fromNode=c, toNode=a)
471        dc = TraceLink(fromNode=d, toNode=c)
472        db = TraceLink(fromNode=d, toNode=b)
473        eb = TraceLink(fromNode=e, toNode=b)
474
475        tracer = ChangeTracer()
476
477        nodes = []
478        def handleNode(node):
479            nodes.append(node)
480           
481        # make some change here
482        b.changed = True
483        tracer.traceChange(handleNode)
484        self.assertEqual(nodes, [b, a, e, c, d])