#!/usr/bin/env python # # Copyright (C) 2020 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # """Unit testing paycheck.py.""" # This test requires new (Y) and old (X) images, as well as a full payload # from image Y and a delta payload from Y to X for each partition. # Payloads are from sample_images/generate_payloads. # # The test performs the following: # # - It statically applies the full and delta payloads. # # - It applies full_payload to yield a new kernel (kern.part) and rootfs # (root.part) and compares them to the new image partitions. # # - It applies delta_payload to the old image to yield a new kernel and rootfs # and compares them to the new image partitions. # # Previously test_paycheck.sh. Run with update_payload ebuild. # Disable check for function names to avoid errors based on old code # pylint: disable=invalid-name import filecmp import os import subprocess import unittest class PaycheckTest(unittest.TestCase): """Test paycheck functions.""" def setUp(self): self.tmpdir = os.getenv('T') self._full_payload = os.path.join(self.tmpdir, 'full_payload.bin') self._delta_payload = os.path.join(self.tmpdir, 'delta_payload.bin') self._new_kernel = os.path.join(self.tmpdir, 'disk_ext2_4k.img') self._new_root = os.path.join(self.tmpdir, 'disk_sqfs_default.img') self._old_kernel = os.path.join(self.tmpdir, 'disk_ext2_4k_empty.img') self._old_root = os.path.join(self.tmpdir, 'disk_sqfs_empty.img') # Temp output files. self._kernel_part = os.path.join(self.tmpdir, 'kern.part') self._root_part = os.path.join(self.tmpdir, 'root.part') def checkPayload(self, type_arg, payload): """Checks Payload.""" self.assertEqual(0, subprocess.check_call(['./paycheck.py', '-t', type_arg, payload])) def testFullPayload(self): """Checks the full payload statically.""" self.checkPayload('full', self._full_payload) def testDeltaPayload(self): """Checks the delta payload statically.""" self.checkPayload('delta', self._delta_payload) def testApplyFullPayload(self): """Applies full payloads and compares results to new sample images.""" self.assertEqual(0, subprocess.check_call(['./paycheck.py', self._full_payload, '--part_names', 'kernel', 'root', '--out_dst_part_paths', self._kernel_part, self._root_part])) # Check if generated full image is equal to sample image. self.assertTrue(filecmp.cmp(self._kernel_part, self._new_kernel)) self.assertTrue(filecmp.cmp(self._root_part, self._new_root)) def testApplyDeltaPayload(self): """Applies delta to old image and checks against new sample images.""" self.assertEqual(0, subprocess.check_call(['./paycheck.py', self._delta_payload, '--part_names', 'kernel', 'root', '--src_part_paths', self._old_kernel, self._old_root, '--out_dst_part_paths', self._kernel_part, self._root_part])) self.assertTrue(filecmp.cmp(self._kernel_part, self._new_kernel)) self.assertTrue(filecmp.cmp(self._root_part, self._new_root)) if __name__ == '__main__': unittest.main()