1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# Copyright (c) 2021 Huawei Device Co., Ltd.
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
16import os
17import subprocess
18import unittest
19
20from image_class import IncUpdateImage
21from image_class import FullUpdateImage
22from test.create_package_data import create_input_package
23from test.create_package_data import clear_package
24from script_generator import VerseScript
25from utils import clear_resource
26from blocks_manager import BlocksManager
27
28
29class TestImage(unittest.TestCase):
30
31    def setUp(self):
32        print("set up")
33
34    def tearDown(self):
35        print("tear down")
36
37    def test_update_full_image(self):
38        """
39        update_full_image,raw image script content
40        :return:
41        """
42        create_input_package("test_target_package", package_type="source")
43        with open('vendor.img', 'wb') as w_f:
44            with open('./test_target_package/vendor.img', "rb") as\
45                    r_f:
46                r_f.seek(10)
47                content = r_f.read()
48            w_f.write(content)
49        verse_script = VerseScript()
50        FullUpdateImage("", ["vendor"], verse_script, ["vendor.img"]).\
51            update_full_image()
52        clear_resource()
53        check_re = len(verse_script.script) != 0
54        print(verse_script.script)
55        if os.path.exists('vendor.img'):
56            os.remove('vendor.img')
57        self.assertEqual(check_re, True)
58        clear_package("test_target_package")
59
60    def test_get_file_data(self):
61        """
62        get_file_data,file_pos is None
63        :return:
64        """
65        create_input_package("test_target_package", package_type="source")
66        with open('./test_target_package/vendor.img', 'rb') as wo_f:
67            f_r = wo_f
68        default_zero_block = ('\0' * 4096).encode()
69        fill_data = ('\0' * 4096).encode()[:4]
70        check_re = IncUpdateImage.get_file_data(
71            4096, 0, default_zero_block, 0,
72            None, fill_data, f_r)
73        self.assertEqual(check_re, default_zero_block)
74
75        fill_data = ('\1' * 4096).encode()[:4]
76        check_re = IncUpdateImage.get_file_data(
77            4096, 0, default_zero_block, 0,
78            None, fill_data, f_r)
79        self.assertEqual(check_re, None)
80
81        clear_resource()
82        f_r.close()
83        clear_package("test_target_package")
84
85    def test_get_blocks_list(self):
86        """
87        get_zero_nonzero_blocks_list,data == default_zero_block
88        :return:
89        """
90        default_zero_block = ('\0' * 4096).encode()
91        data = ('\0' * 4096).encode()
92        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = [], [], []
93        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
94            IncUpdateImage.get_zero_nonzero_blocks_list(
95                data, default_zero_block, 1, nonzero_blocks_list,
96                nonzero_groups_list, zero_blocks_list)
97        check_re = len(zero_blocks_list) != 0
98        self.assertEqual(check_re, True)
99
100        data = ('\1' * 4096).encode()
101        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
102            [], [0] * 4096, []
103        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
104            IncUpdateImage.get_zero_nonzero_blocks_list(
105                data, default_zero_block, 1, nonzero_blocks_list,
106                nonzero_groups_list, zero_blocks_list)
107        check_re = len(nonzero_groups_list) != 0
108        self.assertEqual(check_re, True)
109
110        clear_resource()
111
112    def test_get_file_map(self):
113        """
114        get_file_map,if zero_blocks_list
115        :return:
116        """
117        zero_blocks_list, nonzero_blocks_list, nonzero_groups_list = \
118            [0] * 4096, [], []
119        reserved_blocks = BlocksManager("0")
120        temp_file_map = {}
121        temp_file_map = \
122            IncUpdateImage.get_file_map(
123                nonzero_blocks_list, nonzero_groups_list, reserved_blocks,
124                temp_file_map, zero_blocks_list)
125        check_re = len(temp_file_map) != 0
126        self.assertEqual(check_re, True)
127
128        clear_resource()
129
130    def test_read_ranges(self):
131        """
132        read_ranges, SparseImage reads ranges.
133        :return:
134        """
135        create_input_package("test_target_package", package_type="source")
136        image_path = "./test_target_package/vendor.img"
137        map_path = "./test_target_package/vendor.map"
138        cmd = ["e2fsdroid", "-B", map_path,
139               "-a", "/vendor", image_path, "-e"]
140        sub_p = subprocess.Popen(
141            cmd, shell=False, stdout=subprocess.PIPE,
142            stderr=subprocess.STDOUT)
143        sub_p.wait()
144        ranges_list = IncUpdateImage(image_path, map_path).\
145            get_ranges(BlocksManager("2"))
146        check_re = len(ranges_list) != 0
147        self.assertEqual(check_re, True)
148
149        clear_resource()
150        clear_package("test_target_package")
151
152    def test_get_range_data(self):
153        """
154        _get_range_data, SparseImage _get_range_data
155        :return:
156        """
157        create_input_package("test_target_package", package_type="source")
158        image_path = "./test_target_package/vendor.img"
159        map_path = "./test_target_package/vendor.map"
160        cmd = ["e2fsdroid", "-B", map_path,
161               "-a", "/vendor", image_path, "-e"]
162        sub_p = subprocess.Popen(
163            cmd, shell=False, stdout=subprocess.PIPE,
164            stderr=subprocess.STDOUT)
165        sub_p.wait()
166        s_image = IncUpdateImage(image_path, map_path)
167        s_image.offset_value_list = [[39, 0, None, 10]]
168        ranges_list = s_image.get_ranges(BlocksManager("2"))
169        check_re = len(ranges_list) != 0
170        self.assertEqual(check_re, True)
171
172        s_image.offset_value_list = [(2, 0, None, 1), (2, 2, None, 1)]
173        ranges_list = s_image.get_ranges(BlocksManager("2"))
174        check_re = len(ranges_list) != 0
175        self.assertEqual(check_re, True)
176
177        s_image.offset_value_list = [(2, 0, None, 1), (2, 2, 1, 1)]
178        ranges_list = s_image.get_ranges(BlocksManager("2"))
179        check_re = len(ranges_list) != 0
180        self.assertEqual(check_re, True)
181
182        clear_resource()
183        clear_package("test_target_package")
184