140681896Sopenharmony_ci#!/usr/bin/env python
240681896Sopenharmony_ci# -*- coding: utf-8 -*-
340681896Sopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd.
440681896Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
540681896Sopenharmony_ci# you may not use this file except in compliance with the License.
640681896Sopenharmony_ci# You may obtain a copy of the License at
740681896Sopenharmony_ci#
840681896Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
940681896Sopenharmony_ci#
1040681896Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
1140681896Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
1240681896Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340681896Sopenharmony_ci# See the License for the specific language governing permissions and
1440681896Sopenharmony_ci# limitations under the License.
1540681896Sopenharmony_ci
1640681896Sopenharmony_ciimport os
1740681896Sopenharmony_ciimport subprocess
1840681896Sopenharmony_ciimport unittest
1940681896Sopenharmony_ci
2040681896Sopenharmony_cifrom image_class import IncUpdateImage
2140681896Sopenharmony_cifrom image_class import FullUpdateImage
2240681896Sopenharmony_cifrom test.create_package_data import create_input_package
2340681896Sopenharmony_cifrom test.create_package_data import clear_package
2440681896Sopenharmony_cifrom script_generator import VerseScript
2540681896Sopenharmony_cifrom utils import clear_resource
2640681896Sopenharmony_cifrom blocks_manager import BlocksManager
2740681896Sopenharmony_ci
2840681896Sopenharmony_ci
2940681896Sopenharmony_ciclass TestImage(unittest.TestCase):
3040681896Sopenharmony_ci
3140681896Sopenharmony_ci    def setUp(self):
3240681896Sopenharmony_ci        print("set up")
3340681896Sopenharmony_ci
3440681896Sopenharmony_ci    def tearDown(self):
3540681896Sopenharmony_ci        print("tear down")
3640681896Sopenharmony_ci
3740681896Sopenharmony_ci    def test_update_full_image(self):
3840681896Sopenharmony_ci        """
3940681896Sopenharmony_ci        update_full_image,raw image script content
4040681896Sopenharmony_ci        :return:
4140681896Sopenharmony_ci        """
4240681896Sopenharmony_ci        create_input_package("test_target_package", package_type="source")
4340681896Sopenharmony_ci        with open('vendor.img', 'wb') as w_f:
4440681896Sopenharmony_ci            with open('./test_target_package/vendor.img', "rb") as\
4540681896Sopenharmony_ci                    r_f:
4640681896Sopenharmony_ci                r_f.seek(10)
4740681896Sopenharmony_ci                content = r_f.read()
4840681896Sopenharmony_ci            w_f.write(content)
4940681896Sopenharmony_ci        verse_script = VerseScript()
5040681896Sopenharmony_ci        FullUpdateImage("", ["vendor"], verse_script, ["vendor.img"]).\
5140681896Sopenharmony_ci            update_full_image()
5240681896Sopenharmony_ci        clear_resource()
5340681896Sopenharmony_ci        check_re = len(verse_script.script) != 0
5440681896Sopenharmony_ci        print(verse_script.script)
5540681896Sopenharmony_ci        if os.path.exists('vendor.img'):
5640681896Sopenharmony_ci            os.remove('vendor.img')
5740681896Sopenharmony_ci        self.assertEqual(check_re, True)
5840681896Sopenharmony_ci        clear_package("test_target_package")
5940681896Sopenharmony_ci
6040681896Sopenharmony_ci    def test_get_file_data(self):
6140681896Sopenharmony_ci        """
6240681896Sopenharmony_ci        get_file_data,file_pos is None
6340681896Sopenharmony_ci        :return:
6440681896Sopenharmony_ci        """
6540681896Sopenharmony_ci        create_input_package("test_target_package", package_type="source")
6640681896Sopenharmony_ci        with open('./test_target_package/vendor.img', 'rb') as wo_f:
6740681896Sopenharmony_ci            f_r = wo_f
6840681896Sopenharmony_ci        default_zero_block = ('\0' * 4096).encode()
6940681896Sopenharmony_ci        fill_data = ('\0' * 4096).encode()[:4]
7040681896Sopenharmony_ci        check_re = IncUpdateImage.get_file_data(
7140681896Sopenharmony_ci            4096, 0, default_zero_block, 0,
7240681896Sopenharmony_ci            None, fill_data, f_r)
7340681896Sopenharmony_ci        self.assertEqual(check_re, default_zero_block)
7440681896Sopenharmony_ci
7540681896Sopenharmony_ci        fill_data = ('\1' * 4096).encode()[:4]
7640681896Sopenharmony_ci        check_re = IncUpdateImage.get_file_data(
7740681896Sopenharmony_ci            4096, 0, default_zero_block, 0,
7840681896Sopenharmony_ci            None, fill_data, f_r)
7940681896Sopenharmony_ci        self.assertEqual(check_re, None)
8040681896Sopenharmony_ci
8140681896Sopenharmony_ci        clear_resource()
8240681896Sopenharmony_ci        f_r.close()
8340681896Sopenharmony_ci        clear_package("test_target_package")
8440681896Sopenharmony_ci
8540681896Sopenharmony_ci    def test_get_blocks_list(self):
8640681896Sopenharmony_ci        """
8740681896Sopenharmony_ci        get_zero_nonzero_blocks_list,data == default_zero_block
8840681896Sopenharmony_ci        :return:
8940681896Sopenharmony_ci        """
9040681896Sopenharmony_ci        default_zero_block = ('\0' * 4096).encode()
9140681896Sopenharmony_ci        data = ('\0' * 4096).encode()
9240681896Sopenharmony_ci        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = [], [], []
9340681896Sopenharmony_ci        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
9440681896Sopenharmony_ci            IncUpdateImage.get_zero_nonzero_blocks_list(
9540681896Sopenharmony_ci                data, default_zero_block, 1, nonzero_blocks_list,
9640681896Sopenharmony_ci                nonzero_groups_list, zero_blocks_list)
9740681896Sopenharmony_ci        check_re = len(zero_blocks_list) != 0
9840681896Sopenharmony_ci        self.assertEqual(check_re, True)
9940681896Sopenharmony_ci
10040681896Sopenharmony_ci        data = ('\1' * 4096).encode()
10140681896Sopenharmony_ci        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
10240681896Sopenharmony_ci            [], [0] * 4096, []
10340681896Sopenharmony_ci        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
10440681896Sopenharmony_ci            IncUpdateImage.get_zero_nonzero_blocks_list(
10540681896Sopenharmony_ci                data, default_zero_block, 1, nonzero_blocks_list,
10640681896Sopenharmony_ci                nonzero_groups_list, zero_blocks_list)
10740681896Sopenharmony_ci        check_re = len(nonzero_groups_list) != 0
10840681896Sopenharmony_ci        self.assertEqual(check_re, True)
10940681896Sopenharmony_ci
11040681896Sopenharmony_ci        clear_resource()
11140681896Sopenharmony_ci
11240681896Sopenharmony_ci    def test_get_file_map(self):
11340681896Sopenharmony_ci        """
11440681896Sopenharmony_ci        get_file_map,if zero_blocks_list
11540681896Sopenharmony_ci        :return:
11640681896Sopenharmony_ci        """
11740681896Sopenharmony_ci        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
11840681896Sopenharmony_ci            [0] * 4096, [], []
11940681896Sopenharmony_ci        reserved_blocks = BlocksManager("0")
12040681896Sopenharmony_ci        temp_file_map = {}
12140681896Sopenharmony_ci        temp_file_map = \
12240681896Sopenharmony_ci            IncUpdateImage.get_file_map(
12340681896Sopenharmony_ci                nonzero_blocks_list, nonzero_groups_list, reserved_blocks,
12440681896Sopenharmony_ci                temp_file_map, zero_blocks_list)
12540681896Sopenharmony_ci        check_re = len(temp_file_map) != 0
12640681896Sopenharmony_ci        self.assertEqual(check_re, True)
12740681896Sopenharmony_ci
12840681896Sopenharmony_ci        clear_resource()
12940681896Sopenharmony_ci
13040681896Sopenharmony_ci    def test_read_ranges(self):
13140681896Sopenharmony_ci        """
13240681896Sopenharmony_ci        read_ranges, SparseImage reads ranges.
13340681896Sopenharmony_ci        :return:
13440681896Sopenharmony_ci        """
13540681896Sopenharmony_ci        create_input_package("test_target_package", package_type="source")
13640681896Sopenharmony_ci        image_path = "./test_target_package/vendor.img"
13740681896Sopenharmony_ci        map_path = "./test_target_package/vendor.map"
13840681896Sopenharmony_ci        cmd = ["e2fsdroid", "-B", map_path,
13940681896Sopenharmony_ci               "-a", "/vendor", image_path, "-e"]
14040681896Sopenharmony_ci        sub_p = subprocess.Popen(
14140681896Sopenharmony_ci            cmd, shell=False, stdout=subprocess.PIPE,
14240681896Sopenharmony_ci            stderr=subprocess.STDOUT)
14340681896Sopenharmony_ci        sub_p.wait()
14440681896Sopenharmony_ci        ranges_list = IncUpdateImage(image_path, map_path).\
14540681896Sopenharmony_ci            get_ranges(BlocksManager("2"))
14640681896Sopenharmony_ci        check_re = len(ranges_list) != 0
14740681896Sopenharmony_ci        self.assertEqual(check_re, True)
14840681896Sopenharmony_ci
14940681896Sopenharmony_ci        clear_resource()
15040681896Sopenharmony_ci        clear_package("test_target_package")
15140681896Sopenharmony_ci
15240681896Sopenharmony_ci    def test_get_range_data(self):
15340681896Sopenharmony_ci        """
15440681896Sopenharmony_ci        _get_range_data, SparseImage _get_range_data
15540681896Sopenharmony_ci        :return:
15640681896Sopenharmony_ci        """
15740681896Sopenharmony_ci        create_input_package("test_target_package", package_type="source")
15840681896Sopenharmony_ci        image_path = "./test_target_package/vendor.img"
15940681896Sopenharmony_ci        map_path = "./test_target_package/vendor.map"
16040681896Sopenharmony_ci        cmd = ["e2fsdroid", "-B", map_path,
16140681896Sopenharmony_ci               "-a", "/vendor", image_path, "-e"]
16240681896Sopenharmony_ci        sub_p = subprocess.Popen(
16340681896Sopenharmony_ci            cmd, shell=False, stdout=subprocess.PIPE,
16440681896Sopenharmony_ci            stderr=subprocess.STDOUT)
16540681896Sopenharmony_ci        sub_p.wait()
16640681896Sopenharmony_ci        s_image = IncUpdateImage(image_path, map_path)
16740681896Sopenharmony_ci        s_image.offset_value_list = [[39, 0, None, 10]]
16840681896Sopenharmony_ci        ranges_list = s_image.get_ranges(BlocksManager("2"))
16940681896Sopenharmony_ci        check_re = len(ranges_list) != 0
17040681896Sopenharmony_ci        self.assertEqual(check_re, True)
17140681896Sopenharmony_ci
17240681896Sopenharmony_ci        s_image.offset_value_list = [(2, 0, None, 1), (2, 2, None, 1)]
17340681896Sopenharmony_ci        ranges_list = s_image.get_ranges(BlocksManager("2"))
17440681896Sopenharmony_ci        check_re = len(ranges_list) != 0
17540681896Sopenharmony_ci        self.assertEqual(check_re, True)
17640681896Sopenharmony_ci
17740681896Sopenharmony_ci        s_image.offset_value_list = [(2, 0, None, 1), (2, 2, 1, 1)]
17840681896Sopenharmony_ci        ranges_list = s_image.get_ranges(BlocksManager("2"))
17940681896Sopenharmony_ci        check_re = len(ranges_list) != 0
18040681896Sopenharmony_ci        self.assertEqual(check_re, True)
18140681896Sopenharmony_ci
18240681896Sopenharmony_ci        clear_resource()
18340681896Sopenharmony_ci        clear_package("test_target_package")
184