1# 2# Copyright (C) 2016 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17from __future__ import print_function 18 19import common 20import unittest 21 22from collections import OrderedDict 23from blockimgdiff import BlockImageDiff, EmptyImage, DataImage, Transfer 24from rangelib import RangeSet 25 26class BlockImageDiffTest(unittest.TestCase): 27 28 def test_GenerateDigraphOrder(self): 29 """Make sure GenerateDigraph preserves the order. 30 31 t0: <0-5> => <...> 32 t1: <0-7> => <...> 33 t2: <0-4> => <...> 34 t3: <...> => <0-10> 35 36 t0, t1 and t2 must go before t3, i.e. t3.goes_after = 37 { t0:..., t1:..., t2:... }. But the order of t0-t2 must be preserved. 38 """ 39 40 src = EmptyImage() 41 tgt = EmptyImage() 42 block_image_diff = BlockImageDiff(tgt, src) 43 44 transfers = block_image_diff.transfers 45 t0 = Transfer( 46 "t1", "t1", RangeSet("10-15"), RangeSet("0-5"), "move", transfers) 47 t1 = Transfer( 48 "t2", "t2", RangeSet("20-25"), RangeSet("0-7"), "move", transfers) 49 t2 = Transfer( 50 "t3", "t3", RangeSet("30-35"), RangeSet("0-4"), "move", transfers) 51 t3 = Transfer( 52 "t4", "t4", RangeSet("0-10"), RangeSet("40-50"), "move", transfers) 53 54 block_image_diff.GenerateDigraph() 55 t3_goes_after_copy = t3.goes_after.copy() 56 57 # Elements in the set must be in the transfer evaluation order. 58 elements = list(t3_goes_after_copy) 59 self.assertEqual(t0, elements[0]) 60 self.assertEqual(t1, elements[1]) 61 self.assertEqual(t2, elements[2]) 62 63 # Now switch the order of t0, t1 and t2. 64 transfers[0], transfers[1], transfers[2] = ( 65 transfers[2], transfers[0], transfers[1]) 66 t3.goes_after.clear() 67 t3.goes_before.clear() 68 block_image_diff.GenerateDigraph() 69 70 # The goes_after must be different from last run. 71 self.assertNotEqual(t3_goes_after_copy, t3.goes_after) 72 73 # Assert that each element must agree with the transfer order. 74 elements = list(t3.goes_after) 75 self.assertEqual(t2, elements[0]) 76 self.assertEqual(t0, elements[1]) 77 self.assertEqual(t1, elements[2]) 78