xref: /aosp_15_r20/external/autotest/client/bin/xfstest_util.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li"""Library to run xfstests in autotest.
6*9c5db199SXin Li
7*9c5db199SXin Li"""
8*9c5db199SXin Li
9*9c5db199SXin Liimport os
10*9c5db199SXin Lifrom autotest_lib.client.bin import partition
11*9c5db199SXin Li
12*9c5db199SXin Liclass xfstests_env:
13*9c5db199SXin Li    """
14*9c5db199SXin Li    Setup the environment for running xfstests.
15*9c5db199SXin Li    """
16*9c5db199SXin Li    XFS_MOUNT_PATH = '/mnt/stateful_partition/unencrypted/cache'
17*9c5db199SXin Li
18*9c5db199SXin Li    env_names={}
19*9c5db199SXin Li    env_partition={}
20*9c5db199SXin Li    env_vp={}
21*9c5db199SXin Li    env_device={}
22*9c5db199SXin Li    fs_types={}
23*9c5db199SXin Li
24*9c5db199SXin Li    def setup_partitions(self, job, fs_types, crypto=False,
25*9c5db199SXin Li                         env_names=['TEST', 'SCRATCH']):
26*9c5db199SXin Li        """
27*9c5db199SXin Li        xfttests needs 2 partitions: TEST and SCRATCH.
28*9c5db199SXin Li        - TEST_DEV: "device containing TEST PARTITION"
29*9c5db199SXin Li        - TEST_DIR: "mount point of TEST PARTITION"
30*9c5db199SXin Li        - SCRATCH_DEV "device containing SCRATCH PARTITION"
31*9c5db199SXin Li        - SCRATCH_MNT "mount point for SCRATCH PARTITION"
32*9c5db199SXin Li
33*9c5db199SXin Li        - SCRATCH_DIR "directory on a large partition"
34*9c5db199SXin Li
35*9c5db199SXin Li        @param job: The job object.
36*9c5db199SXin Li        """
37*9c5db199SXin Li
38*9c5db199SXin Li        self.env_names = env_names
39*9c5db199SXin Li        self.fs_types = fs_types
40*9c5db199SXin Li        for name in self.env_names:
41*9c5db199SXin Li            file_name = 'xfstests_%s' % name
42*9c5db199SXin Li            file_img = os.path.join(
43*9c5db199SXin Li                self.XFS_MOUNT_PATH, '%s.img' % file_name)
44*9c5db199SXin Li            self.env_vp[name] = partition.virtual_partition(
45*9c5db199SXin Li                file_img=file_img, file_size=4096)
46*9c5db199SXin Li            self.env_device[name] = self.env_vp[name].device
47*9c5db199SXin Li
48*9c5db199SXin Li            # You can use real block devices, such as /dev/sdc1 by populating
49*9c5db199SXin Li            # env_device directly, but going through the virtual partition
50*9c5db199SXin Li            # object.
51*9c5db199SXin Li
52*9c5db199SXin Li            # By default, we create a directory under autotest
53*9c5db199SXin Li            mountpoint = os.path.join(job.tmpdir, file_name)
54*9c5db199SXin Li            if not os.path.isdir(mountpoint):
55*9c5db199SXin Li                os.makedirs(mountpoint)
56*9c5db199SXin Li
57*9c5db199SXin Li            self.env_partition[name] = job.partition(
58*9c5db199SXin Li                device=self.env_device[name], mountpoint=mountpoint)
59*9c5db199SXin Li
60*9c5db199SXin Li        #
61*9c5db199SXin Li        # Job configuration, instead of editing xfstests config files, set them
62*9c5db199SXin Li        # right here as environment variables
63*9c5db199SXin Li        #
64*9c5db199SXin Li        for name in self.env_names:
65*9c5db199SXin Li            os.environ['%s_DEV' % name] = self.env_partition[name].device
66*9c5db199SXin Li
67*9c5db199SXin Li        test_dir = self.env_partition['TEST'].mountpoint
68*9c5db199SXin Li
69*9c5db199SXin Li        os.environ['TEST_DIR'] = test_dir
70*9c5db199SXin Li        os.environ['SCRATCH_MNT'] = self.env_partition['SCRATCH'].mountpoint
71*9c5db199SXin Li        os.environ['SCRATCH_DIR'] = self.XFS_MOUNT_PATH
72*9c5db199SXin Li
73*9c5db199SXin Li        # ChromeOS does not need special option when SELinux is enabled.
74*9c5db199SXin Li        os.environ['SELINUX_MOUNT_OPTIONS'] = ' '
75*9c5db199SXin Li
76*9c5db199SXin Li        mkfs_args = ''
77*9c5db199SXin Li        mnt_options = ''
78*9c5db199SXin Li        if crypto:
79*9c5db199SXin Li            mkfs_args += '-O encrypt'
80*9c5db199SXin Li            # TODO: update this when blockers are updated b:169251326
81*9c5db199SXin Li            mnt_options += '-o test_dummy_encryption'
82*9c5db199SXin Li
83*9c5db199SXin Li        for fs_type in self.fs_types:
84*9c5db199SXin Li            for name in self.env_names:
85*9c5db199SXin Li                self.env_partition[name].mkfs(fstype=fs_type, args=mkfs_args)
86*9c5db199SXin Li
87*9c5db199SXin Li        os.environ['EXT_MOUNT_OPTIONS'] = mnt_options
88*9c5db199SXin Li
89*9c5db199SXin Li    def unmount_partitions(self):
90*9c5db199SXin Li        """
91*9c5db199SXin Li        Unmount the partition created.
92*9c5db199SXin Li        """
93*9c5db199SXin Li        for name in self.env_names:
94*9c5db199SXin Li            self.env_partition[name].unmount(ignore_status=True)
95*9c5db199SXin Li            self.env_vp[name].destroy()
96