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