#!/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-msg=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()
