| 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) |