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 shutil
18import unittest
19import sys
20import zipfile
21
22from build_update import increment_image_processing
23from build_update import main
24from build_update import check_update_package
25from build_update import check_miss_private_key
26from build_update import check_target_package_path
27from test.create_package_data import clear_package
28from test.create_package_data import create_input_package
29from script_generator import VerseScript
30from build_update import check_incremental_args
31from test.fake_data import RSA_PRIVATE_KEY_DATA
32from utils import OPTIONS_MANAGER
33from utils import clear_resource
34from build_update import check_package_version
35from build_update import private_key_check
36
37
38class TestUpdateUtils(unittest.TestCase):
39
40    def setUp(self):
41        print("set up")
42
43    def tearDown(self):
44        print("tear down")
45
46    def test_update_pkg(self):
47        """
48        The whole process
49        :return:
50        """
51        create_input_package("test_target_package")
52        create_input_package("test_source_package", package_type="source")
53        if not os.path.exists("./output_test"):
54            os.mkdir("./output_test")
55        sys.argv.clear()
56        sys.argv.append("build_update.py")
57        sys.argv.append("./test_target_package/")
58        sys.argv.append("./output_test/demo")
59        sys.argv.append("-s")
60        sys.argv.append("./test_source_package.zip")
61        sys.argv.append("-pk")
62        sys.argv.append("./rsa_private_key2048.pem")
63        main()
64        output = "./output_test/demo"
65        pkg_re = os.path.join(output, os.listdir(output)[0]).endswith('zip')
66        shutil.rmtree("./output_test")
67        self.assertEqual(pkg_re, True)
68        clear_package("test_target_package")
69        clear_package("test_source_package")
70
71    def test_updater_partitions(self):
72        """
73        Update partitions
74        :return:
75        """
76        create_input_package(
77            "test_target_package_updater_partition",
78            package_type="source", is_updater_partitions=True)
79        if not os.path.exists("./output_test"):
80            os.mkdir("./output_test")
81        sys.argv.clear()
82        sys.argv.append("build_update.py")
83        sys.argv.append(
84            "./test_target_package_updater_partition.zip")
85        sys.argv.append("./output_test/demo")
86        sys.argv.append("-pk")
87        sys.argv.append("./rsa_private_key2048.pem")
88        sys.argv.append("-pf")
89        sys.argv.append("./partition_file.xml")
90        main()
91        output = "./output_test/demo"
92        pkg_re = os.path.join(output, os.listdir(output)[0]).endswith('zip')
93        shutil.rmtree("./output_test")
94        self.assertEqual(pkg_re, True)
95        clear_package("test_target_package_updater_partition")
96
97    def test_updater_partitions2(self):
98        """
99        Update partitions,The incoming file does not exist:
100        nonexistent_path.xml
101        :return:
102        """
103        create_input_package(
104            "test_target_package_updater_partition",
105            package_type="source", is_updater_partitions=True)
106        if not os.path.exists("./output_test"):
107            os.mkdir("./output_test")
108        sys.argv.clear()
109        sys.argv.append("build_update.py")
110        sys.argv.append(
111            "./test_target_package_updater_partition.zip")
112        sys.argv.append("./output_test/demo")
113        sys.argv.append("-pk")
114        sys.argv.append("./rsa_private_key2048.pem")
115        sys.argv.append("-pf")
116        sys.argv.append("../nonexistent_path.xml")
117        main()
118        output = "./output_test"
119        pkg_re = len(os.listdir(output))
120        self.assertEqual(pkg_re, 0)
121        shutil.rmtree("./output_test")
122        clear_resource()
123        clear_package("test_target_package_updater_partition")
124
125    def test_update_pkg_nozip(self):
126        """
127        The whole process, no zip mode
128        :return:
129        """
130        create_input_package(
131            "test_target_package_nozip", package_type="source")
132        if not os.path.exists("./output_test"):
133            os.mkdir("./output_test")
134        sys.argv.clear()
135        sys.argv.append("build_update.py")
136        sys.argv.append("./test_target_package_nozip.zip")
137        sys.argv.append("./output_test/demo")
138        sys.argv.append("-nz")
139        sys.argv.append("-pk")
140        sys.argv.append("./rsa_private_key2048.pem")
141        main()
142        output = "./output_test/demo"
143        pkg_re = os.path.join(output, os.listdir(output)[0]).endswith('bin')
144        shutil.rmtree("./output_test")
145        self.assertEqual(pkg_re, True)
146        clear_package("test_target_package_nozip")
147
148    def test_type_check(self):
149        """
150        Input parameter type detection, type_check return False,
151        -s parameter does not exist.
152        :return:
153        """
154        create_input_package(
155            "test_target_package_nozip", package_type="source")
156        if not os.path.exists("./output_test"):
157            os.mkdir("./output_test")
158        sys.argv.clear()
159        sys.argv.append("build_update.py")
160        sys.argv.append("./test_target_package_nozip.zip")
161        sys.argv.append("./output_test/demo")
162        sys.argv.append("-s")
163        sys.argv.append("../test_type_check.test")
164        sys.argv.append("-pk")
165        sys.argv.append("./rsa_private_key2048.pem")
166        main()
167        output = "./output_test/"
168        pkg_re = len(os.listdir(output))
169        shutil.rmtree("./output_test")
170        self.assertEqual(pkg_re, 0)
171        clear_resource()
172        clear_package("test_target_package_nozip")
173
174    def test_check_update_package(self):
175        """
176        Input parameter type detection, check_update_package return False,
177        update_package parameter does not exist.
178        :return:
179        """
180        create_input_package(
181            "test_target_package_nozip", package_type="source")
182        if not os.path.exists("./output_test"):
183            os.mkdir("./output_test")
184        output = "./output_test/demo"
185        if os.path.exists(output):
186            shutil.rmtree(output)
187        sys.argv.clear()
188        sys.argv.append("build_update.py")
189        sys.argv.append("./test_target_package_nozip.zip")
190        sys.argv.append("test_build_update.py")
191        sys.argv.append("-pk")
192        sys.argv.append("./rsa_private_key2048.pem")
193        main()
194        output = "./output_test/"
195        pkg_re = len(os.listdir(output))
196        shutil.rmtree("./output_test")
197        self.assertEqual(pkg_re, 0)
198        clear_resource()
199        clear_package("test_target_package_nozip")
200
201    def test_check_update_package1(self):
202        """
203        Input parameter type detection, check_update_package return False,
204        update_package parameter is file.
205        :return:
206        """
207        arg = check_update_package("test_build_update.py")
208        self.assertEqual(arg, False)
209
210    def test_check_update_package2(self):
211        """
212        Input parameter type detection, check_update_package return False,
213        make update_package failed.
214        :return:
215        """
216        arg = check_update_package("")
217        self.assertEqual(arg, False)
218
219    def test_check_miss_private_key(self):
220        """
221        check_miss_private_key, -pk parameter is None.
222        :return:
223        """
224        check_re = check_miss_private_key(None)
225        self.assertEqual(check_re, False)
226
227    def test_check_target_package_path(self):
228        """
229        Input parameter type detection, check_target_package_path return False,
230        target_package parameter does not exist.
231        :return:
232        """
233        target_package = "nonexistent_path.test"
234        check_re = check_target_package_path(target_package)
235        self.assertEqual(check_re, False)
236
237    def test_check_target_package_path2(self):
238        """
239        Input parameter type detection, check_target_package_path return False,
240        Check target_package dir.
241        :return:
242        """
243        target_package = "test.zip"
244        zip_obj = zipfile.ZipFile(target_package, "w")
245        with open('test.file', 'w') as w_f:
246            w_f.write('test')
247        zip_obj.write('test.file', 'test.file')
248        zip_obj.write('test.file', 'test2.file')
249        zip_obj.close()
250
251        check_re = check_target_package_path(target_package)
252        os.remove(target_package)
253        os.remove('test.file')
254        self.assertEqual(check_re, False)
255
256    def test_check_incremental_args(self):
257        """
258        check_incremental_args, Parameter exception, return False
259        :return:
260        """
261        create_input_package(
262            "test_source_package", package_type="source")
263        check_re = check_incremental_args(False, None, None, ["vendor"])
264        self.assertEqual(check_re, False)
265
266        check_re = check_incremental_args(True, None, "", ["vendor"])
267        self.assertEqual(check_re, False)
268
269        check_re = check_incremental_args(False, "", "", ["vendor"])
270        self.assertEqual(check_re, False)
271
272        OPTIONS_MANAGER.source_package_dir = "./"
273        check_re = check_incremental_args(False, None, "", ["vendor"])
274        self.assertEqual(check_re, False)
275
276        OPTIONS_MANAGER.target_package_version = \
277            "Hi3516DV300-eng 10 QP1A.190711.019"
278        check_re = check_incremental_args(
279            False, None, "./test_source_package.zip", ["vendor"])
280        clear_resource()
281        self.assertEqual(check_re, False)
282        clear_package("test_source_package")
283
284    def test_check_userdata_image(self):
285        """
286        check_userdata_image, userdata does not upgrade not allowed.
287        :return:
288        """
289        create_input_package(
290            "test_target_package_userdata", package_type="source",
291            has_userdata=True)
292        if not os.path.exists("./output_test"):
293            os.mkdir("./output_test")
294        sys.argv.clear()
295        sys.argv.append("build_update.py")
296        sys.argv.append(
297            "./test_target_package_userdata.zip")
298        sys.argv.append("./output_test/demo")
299        sys.argv.append("-pk")
300        sys.argv.append("./rsa_private_key2048.pem")
301        main()
302        output = "./output_test/demo"
303        pkg_re = os.path.exists(output)
304        shutil.rmtree("./output_test")
305        self.assertEqual(pkg_re, False)
306        clear_resource()
307        clear_package("test_target_package_userdata")
308
309    def test_check_images_list(self):
310        """
311        check_images_list, Both full list and inc list are empty.
312        :return:
313        """
314        create_input_package(
315            "test_target_package_inc_full_all_none", package_type="source",
316            is_inc_full_none=True)
317        if not os.path.exists("./output_test"):
318            os.mkdir("./output_test")
319        sys.argv.clear()
320        sys.argv.append("build_update.py")
321        sys.argv.append(
322            "./test_target_package_inc_full_all_none.zip")
323        sys.argv.append("./output_test/demo")
324        sys.argv.append("-pk")
325        sys.argv.append("./rsa_private_key2048.pem")
326        main()
327        output = "./output_test/demo"
328        pkg_re = os.path.exists(output)
329        shutil.rmtree("./output_test")
330        self.assertEqual(pkg_re, False)
331        clear_resource()
332        clear_package("test_target_package_inc_full_all_none")
333
334    def test_check_package_version(self):
335        """
336        check_package_version, Exception in version number comparison.
337        :return:
338        """
339        target_package_version = \
340            "test version num"
341        check_re = check_package_version(
342            target_package_version, "Hi3516DV300-eng 10 QP1A.190711.020")
343        clear_resource()
344        self.assertEqual(check_re, False)
345
346    def test_increment_image_processing(self):
347        """
348        increment_image_processing,Exception in inc process, return False
349        :return:
350        """
351        create_input_package("test_target_package", package_type="target")
352        create_input_package("test_target_package_miss_image",
353                             package_type="target",
354                             is_miss_image=True)
355        create_input_package(
356            "test_source_package_miss_image", package_type="source",
357            is_miss_image=True)
358        if not os.path.exists("./output_test"):
359            os.mkdir("./output_test")
360        verse_script = VerseScript()
361        # miss source .img
362        check_re = increment_image_processing(
363            verse_script, ['test'], "", "")
364        self.assertEqual(check_re, False)
365
366        # miss target .img
367        check_re = increment_image_processing(
368            verse_script, ['vendor'], "./test_target_package/",
369            "./test_target_package/")
370        self.assertEqual(check_re, False)
371
372        with open('vendor.img', 'w') as f_w:
373            f_w.write('test content')
374        with open('vendor.map', 'w') as f_w:
375            f_w.write('test content')
376        check_re = increment_image_processing(
377            verse_script, ['vendor'], "", "")
378        os.remove('vendor.img')
379        os.remove('vendor.map')
380        self.assertEqual(check_re, False)
381
382        sys.argv.clear()
383        sys.argv.append("build_update.py")
384        sys.argv.append(
385            "./test_target_package_miss_image")
386        sys.argv.append("./output_test/demo")
387        sys.argv.append("-s")
388        sys.argv.append("./test_source_package_miss_image.zip")
389        sys.argv.append("-pk")
390        sys.argv.append("./rsa_private_key2048.pem")
391        main()
392        output = "./output_test/demo"
393        pkg_re = os.path.exists(output)
394        self.assertEqual(pkg_re, False)
395        shutil.rmtree("./output_test")
396        clear_resource()
397        clear_package("test_target_package")
398        clear_package("test_target_package_miss_image")
399        clear_package("test_source_package_miss_image")
400
401    def test_target_package_path_return(self):
402        """
403        check_target_package_path, return False
404        :return:
405        """
406        with open("./rsa_private_key2048.pem", "wb") as w_f:
407            w_f.write(RSA_PRIVATE_KEY_DATA)
408        if not os.path.exists("./output_test"):
409            os.mkdir("./output_test")
410        sys.argv.clear()
411        sys.argv.append("build_update.py")
412        sys.argv.append("./")
413        sys.argv.append("./output_test/demo")
414        sys.argv.append("-pk")
415        sys.argv.append("./rsa_private_key2048.pem")
416        main()
417        output = "./output_test/demo"
418        pkg_re = os.path.exists(output)
419        shutil.rmtree("./output_test")
420        self.assertEqual(pkg_re, False)
421        clear_resource()
422        if os.path.exists("./rsa_private_key2048.pem"):
423            os.remove("./rsa_private_key2048.pem")
424
425    def test_get_update_info_return(self):
426        """
427        get_update_info, return False
428        :return:
429        """
430        create_input_package(
431            "test_target_package_miss_version_list", package_type="source",
432            is_miss_version_list=True)
433        if not os.path.exists("./output_test"):
434            os.mkdir("./output_test")
435        sys.argv.clear()
436        sys.argv.append("build_update.py")
437        sys.argv.append(
438            "./test_target_package_miss_version_list.zip")
439        sys.argv.append("./output_test/demo")
440        sys.argv.append("-pk")
441        sys.argv.append("./rsa_private_key2048.pem")
442        main()
443        output = "./output_test/demo"
444        pkg_re = os.path.exists(output)
445        shutil.rmtree("./output_test")
446        self.assertEqual(pkg_re, False)
447        clear_resource()
448        clear_package("test_target_package_miss_version_list")
449
450    def test_build_update_package(self):
451        """
452        build_update_package, return False
453        :return:
454        """
455        create_input_package(
456            "test_target_package_miss_updater_binary", package_type="source",
457            is_miss_updater_binary=True)
458        if not os.path.exists("./output_test"):
459            os.mkdir("./output_test")
460        sys.argv.clear()
461        sys.argv.append("build_update.py")
462        sys.argv.append(
463            "./test_target_package_miss_updater_binary.zip")
464        sys.argv.append("./output_test/")
465        sys.argv.append("-pk")
466        sys.argv.append("./rsa_private_key2048.pem")
467        main()
468        output = "./output_test/"
469        pkg_re = os.path.exists(output)
470        shutil.rmtree("./output_test")
471        self.assertEqual(pkg_re, True)
472        clear_resource()
473        clear_package("test_target_package_miss_updater_binary")
474
475    def test_on_server(self):
476        """
477        Signing on server.
478        :return:
479        """
480        create_input_package(
481            "test_target_package_on_server", package_type="source")
482        if not os.path.exists("./output_test"):
483            os.mkdir("./output_test")
484        sys.argv.clear()
485        sys.argv.append("build_update.py")
486        sys.argv.append(
487            "./test_target_package_on_server.zip")
488        sys.argv.append("./output_test/demo")
489        sys.argv.append("-pk")
490        sys.argv.append("ON_SERVER")
491        main()
492        output = "./output_test/demo"
493        pkg_re = os.path.exists(output)
494        shutil.rmtree("./output_test")
495        self.assertEqual(pkg_re, True)
496        clear_resource()
497        clear_package("test_target_package_on_server")
498
499    def test_private_key_check(self):
500        """
501        private_key_check, check private key param.
502        :return:
503        """
504        check_re = private_key_check("test_private_key_check")
505        self.assertEqual(check_re, False)
506