aboutsummaryrefslogtreecommitdiff
path: root/support/testing/tests/fs/test_ext.py
blob: f5f9e9fdf178552606838fc3f0233ee945f71c43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import os
import subprocess

import infra.basetest

VOLNAME_PROP = "Filesystem volume name"
REVISION_PROP = "Filesystem revision #"
FEATURES_PROP = "Filesystem features"
BLOCKCNT_PROP = "Block count"
INODECNT_PROP = "Inode count"
RESBLKCNT_PROP = "Reserved block count"

CHECK_FS_TYPE_CMD = "mount | grep '/dev/root on / type {}'"


def dumpe2fs_run(builddir, image):
    cmd = ["host/sbin/dumpe2fs", os.path.join("images", image)]
    ret = subprocess.check_output(cmd,
                                  stderr=open(os.devnull, "w"),
                                  cwd=builddir,
                                  env={"LANG": "C"})
    return ret.strip().splitlines()


def dumpe2fs_getprop(out, prop):
    for line in out:
        fields = line.split(": ")
        if fields[0] == prop:
            return fields[1].strip()


def boot_img_and_check_fs_type(emulator, builddir, fs_type):
    img = os.path.join(builddir, "images", "rootfs.{}".format(fs_type))
    emulator.boot(arch="armv7",
                  kernel="builtin",
                  kernel_cmdline=["root=/dev/mmcblk0",
                                  "rootfstype={}".format(fs_type)],
                  options=["-drive", "file={},if=sd".format(img)])
    emulator.login()
    _, exit_code = emulator.run(CHECK_FS_TYPE_CMD.format(fs_type))
    return exit_code


class TestExt2(infra.basetest.BRTest):
    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
        """
        BR2_TARGET_ROOTFS_EXT2=y
        BR2_TARGET_ROOTFS_EXT2_2r0=y
        BR2_TARGET_ROOTFS_EXT2_LABEL="foobaz"
        # BR2_TARGET_ROOTFS_TAR is not set
        """

    def test_run(self):
        out = dumpe2fs_run(self.builddir, "rootfs.ext2")
        self.assertEqual(dumpe2fs_getprop(out, VOLNAME_PROP), "foobaz")
        self.assertEqual(dumpe2fs_getprop(out, REVISION_PROP), "0 (original)")

        exit_code = boot_img_and_check_fs_type(self.emulator,
                                               self.builddir, "ext2")
        self.assertEqual(exit_code, 0)


class TestExt2r1(infra.basetest.BRTest):
    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
        """
        BR2_TARGET_ROOTFS_EXT2=y
        BR2_TARGET_ROOTFS_EXT2_2r1=y
        BR2_TARGET_ROOTFS_EXT2_LABEL="foobar"
        # BR2_TARGET_ROOTFS_TAR is not set
        """

    def test_run(self):
        out = dumpe2fs_run(self.builddir, "rootfs.ext2")
        self.assertEqual(dumpe2fs_getprop(out, VOLNAME_PROP), "foobar")
        self.assertEqual(dumpe2fs_getprop(out, REVISION_PROP), "1 (dynamic)")
        self.assertNotIn("has_journal", dumpe2fs_getprop(out, FEATURES_PROP))

        exit_code = boot_img_and_check_fs_type(self.emulator,
                                               self.builddir, "ext2")
        self.assertEqual(exit_code, 0)


class TestExt3(infra.basetest.BRTest):
    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
        """
        BR2_TARGET_ROOTFS_EXT2=y
        BR2_TARGET_ROOTFS_EXT2_3=y
        # BR2_TARGET_ROOTFS_TAR is not set
        """

    def test_run(self):
        out = dumpe2fs_run(self.builddir, "rootfs.ext3")
        self.assertEqual(dumpe2fs_getprop(out, REVISION_PROP), "1 (dynamic)")
        self.assertIn("has_journal", dumpe2fs_getprop(out, FEATURES_PROP))
        self.assertNotIn("extent", dumpe2fs_getprop(out, FEATURES_PROP))

        exit_code = boot_img_and_check_fs_type(self.emulator,
                                               self.builddir, "ext3")
        self.assertEqual(exit_code, 0)


class TestExt4(infra.basetest.BRTest):
    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
        """
        BR2_TARGET_ROOTFS_EXT2=y
        BR2_TARGET_ROOTFS_EXT2_4=y
        BR2_TARGET_ROOTFS_EXT2_SIZE="16384"
        BR2_TARGET_ROOTFS_EXT2_INODES=3000
        BR2_TARGET_ROOTFS_EXT2_RESBLKS=10
        # BR2_TARGET_ROOTFS_TAR is not set
        """

    def test_run(self):
        out = dumpe2fs_run(self.builddir, "rootfs.ext4")
        self.assertEqual(dumpe2fs_getprop(out, REVISION_PROP), "1 (dynamic)")
        self.assertEqual(dumpe2fs_getprop(out, BLOCKCNT_PROP), "16384")
        # Yes there are 8 more inodes than requested
        self.assertEqual(dumpe2fs_getprop(out, INODECNT_PROP), "3008")
        self.assertEqual(dumpe2fs_getprop(out, RESBLKCNT_PROP), "1638")
        self.assertIn("has_journal", dumpe2fs_getprop(out, FEATURES_PROP))
        self.assertIn("extent", dumpe2fs_getprop(out, FEATURES_PROP))

        exit_code = boot_img_and_check_fs_type(self.emulator,
                                               self.builddir, "ext4")
        self.assertEqual(exit_code, 0)