1# SPDX-License-Identifier: GPL-2.0 2# (C) Copyright 2018 Texas Instruments, <www.ti.com> 3 4# Test A/B update commands. 5 6import os 7import pytest 8import utils 9 10class ABTestDiskImage(object): 11 """Disk Image used by the A/B tests.""" 12 13 def __init__(self, ubman): 14 """Initialize a new ABTestDiskImage object. 15 16 Args: 17 ubman: A U-Boot console. 18 19 Returns: 20 Nothing. 21 """ 22 23 filename = 'test_ab_disk_image.bin' 24 25 persistent = ubman.config.persistent_data_dir + '/' + filename 26 self.path = ubman.config.result_dir + '/' + filename 27 28 with utils.persistent_file_helper(ubman.log, persistent): 29 if os.path.exists(persistent): 30 ubman.log.action('Disk image file ' + persistent + 31 ' already exists') 32 else: 33 ubman.log.action('Generating ' + persistent) 34 fd = os.open(persistent, os.O_RDWR | os.O_CREAT) 35 os.ftruncate(fd, 524288) 36 os.close(fd) 37 cmd = ('sgdisk', persistent) 38 utils.run_and_log(ubman, cmd) 39 40 cmd = ('sgdisk', '--new=1:64:512', '--change-name=1:misc', 41 persistent) 42 utils.run_and_log(ubman, cmd) 43 cmd = ('sgdisk', '--load-backup=' + persistent) 44 utils.run_and_log(ubman, cmd) 45 46 cmd = ('cp', persistent, self.path) 47 utils.run_and_log(ubman, cmd) 48 49di = None 50@pytest.fixture(scope='function') 51def ab_disk_image(ubman): 52 global di 53 if not di: 54 di = ABTestDiskImage(ubman) 55 return di 56 57def ab_dump(ubman, slot_num, crc): 58 output = ubman.run_command('bcb ab_dump host 0#misc') 59 header, slot0, slot1 = output.split('\r\r\n\r\r\n') 60 slots = [slot0, slot1] 61 slot_suffixes = ['_a', '_b'] 62 63 header = dict(map(lambda x: map(str.strip, x.split(':')), header.split('\r\r\n'))) 64 assert header['Bootloader Control'] == '[misc]' 65 assert header['Active Slot'] == slot_suffixes[slot_num] 66 assert header['Magic Number'] == '0x42414342' 67 assert header['Version'] == '1' 68 assert header['Number of Slots'] == '2' 69 assert header['Recovery Tries Remaining'] == '0' 70 assert header['CRC'] == '{} (Valid)'.format(crc) 71 72 slot = dict(map(lambda x: map(str.strip, x.split(':')), slots[slot_num].split('\r\r\n\t- ')[1:])) 73 assert slot['Priority'] == '15' 74 assert slot['Tries Remaining'] == '6' 75 assert slot['Successful Boot'] == '0' 76 assert slot['Verity Corrupted'] == '0' 77 78@pytest.mark.boardspec('sandbox') 79@pytest.mark.buildconfigspec('android_ab') 80@pytest.mark.buildconfigspec('cmd_bcb') 81@pytest.mark.requiredtool('sgdisk') 82def test_ab(ab_disk_image, ubman): 83 """Test the 'bcb ab_select' command.""" 84 85 ubman.run_command('host bind 0 ' + ab_disk_image.path) 86 87 output = ubman.run_command('bcb ab_select slot_name host 0#misc') 88 assert 're-initializing A/B metadata' in output 89 assert 'Attempting slot a, tries remaining 7' in output 90 output = ubman.run_command('printenv slot_name') 91 assert 'slot_name=a' in output 92 ab_dump(ubman, 0, '0xd438d1b9') 93 94 output = ubman.run_command('bcb ab_select slot_name host 0:1') 95 assert 'Attempting slot b, tries remaining 7' in output 96 output = ubman.run_command('printenv slot_name') 97 assert 'slot_name=b' in output 98 ab_dump(ubman, 1, '0x011ec016') 99