# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Test the kernel_cmdline module."""

import collections

from chromite.lib import cros_test_lib
from chromite.lib import kernel_cmdline


# pylint: disable=protected-access


# A partial, but sufficiently complicated command line.  DmConfigTest uses
# more complicated configs, with multiple devices.  DM is split out here for
# CommandLineTest.test*DmConfig().
DM = (
    "1 vroot none ro 1,0 3891200 verity payload=PARTUUID=%U/PARTNROFF=1 "
    "hashtree=PARTUUID=%U/PARTNROFF=1 hashstart=3891200 alg=sha1 "
    "root_hexdigest=9999999999999999999999999999999999999999 "
    "salt=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
)
CMDLINE = (
    "console= loglevel=7 init=/sbin/init cros_secure oops=panic panic=-1 "
    "root=/dev/dm-0 rootwait ro dm_verity.error_behavior=3 "
    'dm_verity.max_bios=-1 dm_verity.dev_wait=1 dm="'
    + DM
    + '" noinitrd cros_debug vt.global_cursor_default=0 kern_guid=%U '
    "-- run_level=3"
)


class KernelArgTest(cros_test_lib.TestCase):
    """Test KernelArg."""

    def testKeyOnly(self):
        """Expands arg-only arg."""
        kv = kernel_cmdline.KernelArg("arg", None)
        self.assertEqual("arg", kv.arg)
        self.assertEqual(None, kv.value)
        self.assertEqual("arg", kv.Format())

    def testKeyEqual(self):
        """Expands arg= arg."""
        kv = kernel_cmdline.KernelArg("arg", "")
        self.assertEqual("arg", kv.arg)
        self.assertEqual("", kv.value)
        self.assertEqual("arg=", kv.Format())

    def testKernelArg(self):
        """Expands arg=value arg."""
        kv = kernel_cmdline.KernelArg("arg", "value")
        self.assertEqual("arg", kv.arg)
        self.assertEqual("value", kv.value)
        self.assertEqual("arg=value", kv.Format())

    def testRejectsBadValue(self):
        """Rejects non-string values."""
        kv = [kernel_cmdline.KernelArg("b", None)]
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", kv)
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", 1)
        # Test various forms of bad quoting.
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", '"aaa"aaaa"')
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", 'aaa"aaaa')
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", 'aaa "a" aaa')
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", 'aaa"')
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArg("a", '"aaaa')

    def testAddsQuotes(self):
        """Test that init adds double-quotes when needed."""
        kv1 = kernel_cmdline.KernelArg("d", "9 9")
        self.assertEqual("d", kv1.arg)
        # Value is unmodified.
        self.assertEqual("9 9", kv1.value)
        self.assertEqual('d="9 9"', kv1.Format())

        kv2 = kernel_cmdline.KernelArg("d", '"a a"')
        self.assertEqual("d", kv2.arg)
        # Value is unmodified.
        self.assertEqual('"a a"', kv2.value)
        self.assertEqual('d="a a"', kv2.Format())

    def testEqual(self):
        """Test __eq__()."""
        kv1 = kernel_cmdline.KernelArg("a", "b")
        kv2 = kernel_cmdline.KernelArg("a", "b")
        kv3 = kernel_cmdline.KernelArg("b", "c")
        kv4 = kernel_cmdline.KernelArg("a", "9 9")
        kv5 = kernel_cmdline.KernelArg("a", '"9 9"')
        self.assertTrue(kv1 == kv2)
        self.assertFalse(kv1 == kv3)
        self.assertFalse(kv1 == kv4)
        self.assertTrue(kv4 == kv5)

    def testNotEqual(self):
        """Test __ne__()."""
        kv1 = kernel_cmdline.KernelArg("a", "b")
        kv2 = kernel_cmdline.KernelArg("a", "b")
        kv3 = kernel_cmdline.KernelArg("b", "c")
        kv4 = kernel_cmdline.KernelArg("a", "9 9")
        kv5 = kernel_cmdline.KernelArg("a", '"9 9"')
        self.assertFalse(kv1 != kv2)
        self.assertTrue(kv1 != kv3)
        self.assertTrue(kv1 != kv4)
        self.assertFalse(kv4 != kv5)


class KernelArgListTest(cros_test_lib.TestCase):
    """Test KernelArgList()."""

    def testSimple(self):
        """Test a simple command line string."""
        expected = [
            kernel_cmdline.KernelArg("a", None),
            kernel_cmdline.KernelArg("b", ""),
            kernel_cmdline.KernelArg("c", "d"),
            kernel_cmdline.KernelArg("e.f", '"d e"'),
            kernel_cmdline.KernelArg("a", None),
            kernel_cmdline.KernelArg("--", None),
            kernel_cmdline.KernelArg("x", None),
            kernel_cmdline.KernelArg("y", ""),
            kernel_cmdline.KernelArg("z", "zz"),
            kernel_cmdline.KernelArg("y", None),
        ]
        kl = kernel_cmdline.KernelArgList('a b= c=d e.f="d e" a -- x y= z=zz y')
        self.assertEqual(kl, expected)
        self.assertEqual(len(expected), len(kl))
        self.assertEqual(expected, list(kl))

    def testSetDefaultValue(self):
        """Test that we can create an instance with no value given."""
        kl = kernel_cmdline.KernelArgList()
        self.assertEqual([], kl._data)
        self.assertEqual(0, len(kl))

    def testReturnsEmptyList(self):
        """Test that strings with no arguments return an empty list."""
        self.assertEqual([], kernel_cmdline.KernelArgList("  ")._data)

    def testForcesInternalType(self):
        """Test that the internal type is correctly forced."""
        expected = [
            kernel_cmdline.KernelArg("c", "d"),
            kernel_cmdline.KernelArg("a", "b"),
        ]
        # Pass in an OrderedDict with |expected| being the keys.
        kl = kernel_cmdline.KernelArgList(
            collections.OrderedDict((x, 0) for x in expected)
        )
        self.assertEqual(type(kl._data), list)
        self.assertEqual(kl, expected)
        # Test len().
        self.assertEqual(2, len(kl))
        # Test __iter__().
        self.assertEqual(expected, list(kl))

    def testRejectsInvalidInput(self):
        """Test that invalid command line strings are rejected."""
        # Non-KernelArg values.
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArgList({1: 2, 3: 4})
        # The first and non-first arguments are different in the re.
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArgList("=3")
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArgList("a =3")
        # Various bad quote usages.
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArgList('a b="foo"3 c')
        with self.assertRaises(ValueError):
            kernel_cmdline.KernelArgList('a b=" c')

    def testEqual(self):
        """Test __eq__()."""
        kv1 = kernel_cmdline.KernelArgList("a b= c")
        kv2 = kernel_cmdline.KernelArgList("a b= c")
        kv3 = kernel_cmdline.KernelArgList("a b= c d")
        self.assertTrue(kv1 == kv2)
        self.assertTrue(kv1 == kv2._data)
        self.assertFalse(kv1 == kv3)

    def testNotEqual(self):
        """Test __ne__()."""
        kv1 = kernel_cmdline.KernelArgList("a b= c")
        kv2 = kernel_cmdline.KernelArgList("a b= c")
        kv3 = kernel_cmdline.KernelArgList("a b= c d")
        self.assertFalse(kv1 != kv2)
        self.assertFalse(kv1 != kv2._data)
        self.assertTrue(kv1 != kv3)

    def testAdd(self):
        """Adding two KernelArgLists yields the correct KernelArgList."""
        kv1 = kernel_cmdline.KernelArgList("a b")
        kv2 = kernel_cmdline.KernelArgList("a d")
        res = kv1 + kv2
        self.assertEqual(type(res), kernel_cmdline.KernelArgList)
        self.assertEqual(res, kernel_cmdline.KernelArgList("a b a d"))

    def testIadd(self):
        """Test that += yields the correct KernelArgList."""
        kv1 = kernel_cmdline.KernelArgList("a b")
        kv2 = kernel_cmdline.KernelArgList("a d")
        kv1 += kv2
        self.assertEqual(type(kv1), kernel_cmdline.KernelArgList)
        self.assertEqual(kv1, kernel_cmdline.KernelArgList("a b a d"))

    def testContains(self):
        """Accepts KernelArg."""
        kv1 = kernel_cmdline.KernelArg("a", None)
        kv2 = kernel_cmdline.KernelArg("arg", "value")
        kv3 = kernel_cmdline.KernelArg("z", None)
        kl = kernel_cmdline.KernelArgList("a arg=value b c")
        self.assertTrue(kv1 in kl)
        self.assertTrue(kv2 in kl)
        self.assertFalse(kv3 in kl)

    def testContainsAcceptsString(self):
        """Accepts KernelArg."""
        kl = kernel_cmdline.KernelArgList("a arg=value b c")
        self.assertTrue("a" in kl)
        self.assertTrue("arg" in kl)
        self.assertFalse("z" in kl)

    def testDelitem(self):
        """Test del."""
        kl = kernel_cmdline.KernelArgList("a b=3 c d e")
        del kl[0]
        del kl["b"]
        with self.assertRaises(KeyError):
            del kl["z"]
        self.assertEqual(kl, kernel_cmdline.KernelArgList("c d e"))

    def testDelslice(self):
        """Test del."""
        kl = kernel_cmdline.KernelArgList("a b=3 c d e")
        del kl[1:3]
        self.assertEqual(kl, kernel_cmdline.KernelArgList("a d e"))

    def testGetslice(self):
        """Test that __getslice__ works."""
        kl = kernel_cmdline.KernelArgList("a b c d")
        sl = kl[1:3]
        self.assertEqual(type(sl), kernel_cmdline.KernelArgList)
        self.assertEqual(
            kernel_cmdline.KernelArgList("a b c d")[1:3],
            kernel_cmdline.KernelArgList("b c"),
        )

    def testGetitemAcceptsInt(self):
        """Test that __getitem__ works with an integer index."""
        self.assertEqual(
            kernel_cmdline.KernelArgList("a b=3 c d").__getitem__(1),
            kernel_cmdline.KernelArg("b", "3"),
        )

    def testGetitemAcceptsStr(self):
        """Test that __getitem__ works with a str."""
        self.assertEqual(
            kernel_cmdline.KernelArgList("a b=3 c d").__getitem__("b"),
            kernel_cmdline.KernelArg("b", "3"),
        )

    def testGetItemRaisesKeyError(self):
        """Test that __getitem__ raises KeyError on invalid key."""
        kv = kernel_cmdline.KernelArgList("a x y d")
        with self.assertRaises(KeyError):
            kv.__getitem__("z")

    def testSetslice(self):
        """Test that __setslice__ works."""
        kv = kernel_cmdline.KernelArgList("a x y d")
        # Test setting a slice to a KernelArgList.
        ins = kernel_cmdline.KernelArgList("b c")
        kv[1:3] = ins
        self.assertEqual(kernel_cmdline.KernelArgList("a b c d"), kv)
        # Test setting a slice to a list of KernelArg.
        kv[1:2] = [kernel_cmdline.KernelArg("a", "3")]
        self.assertEqual(kernel_cmdline.KernelArgList("a a=3 c d"), kv)
        # Test setting a slice to a string.
        kv[1:2] = "x y=4"
        self.assertEqual(kernel_cmdline.KernelArgList("a x y=4 c d"), kv)

    def testSetitemAcceptsInt(self):
        """Test that __setitem__ works with an integer index."""
        kv = kernel_cmdline.KernelArgList("a b=3 c d")
        new_val = kernel_cmdline.KernelArg("b", "4")
        kv[1] = new_val
        self.assertEqual(kv[1], new_val)

    def testSetitemAcceptsStr(self):
        """Test that __setitem__ works with a str."""
        kv = kernel_cmdline.KernelArgList("a b=3 c d")
        new_val = kernel_cmdline.KernelArg("b", "4")
        kv["b"] = new_val
        self.assertEqual(kv[1], new_val)

    def testSetitemAppendsWithNewKeyStr(self):
        """Test that __setitem__ appends with a new key (str)."""
        kv = kernel_cmdline.KernelArgList("a b=3 c d")
        new_val = kernel_cmdline.KernelArg("y", "4")
        kv.__setitem__("y", new_val)
        self.assertEqual(kv[4], new_val)

    def testSetitemRejectsBadValues(self):
        """Test that __setitem__ rejects bad values."""
        kv = kernel_cmdline.KernelArgList("a b=3 c d")
        with self.assertRaises(ValueError):
            # Strings are not KernelArgs
            kv["foo"] = "bar"
        with self.assertRaises(ValueError):
            # Int is not KernelArg
            kv["foo"] = 1

    def testInsert(self):
        """Test that insert() works."""
        kv = kernel_cmdline.KernelArgList("a b=3 c d")
        kv.insert(1, kernel_cmdline.KernelArg("f", None))
        kv.insert("c", kernel_cmdline.KernelArg("g", None))
        with self.assertRaises(KeyError):
            kv.insert("z", kernel_cmdline.KernelArg("h", None))
        expected = kernel_cmdline.KernelArgList(
            [
                kernel_cmdline.KernelArg("a", None),
                kernel_cmdline.KernelArg("f", None),
                kernel_cmdline.KernelArg("b", "3"),
                kernel_cmdline.KernelArg("g", None),
                kernel_cmdline.KernelArg("c", None),
                kernel_cmdline.KernelArg("d", None),
            ]
        )
        self.assertEqual(expected, kv)
        with self.assertRaises(ValueError):
            kv.insert("z", "badval")
        # Verify that KernelArgList is a bad value.
        with self.assertRaises(ValueError):
            kv.insert("z", expected)

    def testFormat(self):
        """Test that Format works."""
        self.assertEqual(
            "a x= b=c d", kernel_cmdline.KernelArgList("a x= b=c d").Format()
        )

    def testIndex(self):
        """Test that index finds the correct thing."""
        kv = kernel_cmdline.KernelArgList("a b=c d e")
        self.assertEqual(1, kv.index(1))
        self.assertEqual(1, kv.index("b"))
        self.assertEqual(None, kv.index("z"))

    def testget(self):
        """Test that Get returns the correct value for all key types."""
        kv = kernel_cmdline.KernelArgList("a b=c d e")
        self.assertEqual(kernel_cmdline.KernelArg("d", None), kv.get(2))
        self.assertEqual(kernel_cmdline.KernelArg("d", None), kv.get("d"))
        self.assertEqual("default", kv.get("z", default="default"))

    def testUpdateAcceptsKwargs(self):
        """Test update() with kwargs."""
        kv1 = kernel_cmdline.KernelArgList("a b c")
        kv1.update(b="f")
        kv2 = kernel_cmdline.KernelArgList("a b=f c")
        self.assertEqual(kv2, kv1)

    def testUpdateAcceptsDict(self):
        """Test update() accepts a dict."""
        kl1 = kernel_cmdline.KernelArgList("a=b")
        other = {"arg": "value"}
        kl1.update(other)
        expected = kernel_cmdline.KernelArgList("a=b arg=value")
        self.assertEqual(expected, kl1)

    def testUpdateAcceptsKernelArgList(self):
        """Test update() accepts a KernelArg."""
        kl1 = kernel_cmdline.KernelArgList("a=b")
        kl2 = kernel_cmdline.KernelArgList("arg=value")
        kl1.update(kl2)
        expected = kernel_cmdline.KernelArgList("a=b arg=value")
        self.assertEqual(expected, kl1)

    def testUpdateAcceptsSetKernelArgUsage(self):
        kl1 = kernel_cmdline.KernelArgList('a dm="foo baz" b')
        kl1.update({"dm": DM})
        expected = kernel_cmdline.KernelArgList('a dm="%s" b' % DM)
        self.assertEqual(expected, kl1)

    def testUpdateAppends(self):
        """Test update() appends new arg."""
        kv = kernel_cmdline.KernelArgList("a b c")
        kv.update(kernel_cmdline.KernelArgList("d=99"), e="zz")
        expected = kernel_cmdline.KernelArgList("a b c d=99 e=zz")
        self.assertEqual(expected, kv)


class CommandLineTest(cros_test_lib.MockTestCase):
    """Test the CommandLine class."""

    def testSimple(self):
        """Test a simple command line string."""
        expected_kern = [
            kernel_cmdline.KernelArg("a", None),
            kernel_cmdline.KernelArg("b", ""),
            kernel_cmdline.KernelArg("c", "d"),
            kernel_cmdline.KernelArg("e.f", "d"),
            kernel_cmdline.KernelArg("a", None),
        ]
        expected_init = [
            kernel_cmdline.KernelArg("x", None),
            kernel_cmdline.KernelArg("y", ""),
            kernel_cmdline.KernelArg("z", "zz"),
            kernel_cmdline.KernelArg("y", None),
        ]
        cmd = kernel_cmdline.CommandLine("a b= c=d e.f=d a -- x y= z=zz y")
        self.assertEqual(cmd.kern_args, expected_kern)
        self.assertEqual(cmd.init_args, expected_init)

    def testEmptyInit(self):
        """Test that 'a --' behaves as expected."""
        expected_kern = [kernel_cmdline.KernelArg("a", None)]
        expected_init = []
        cmd = kernel_cmdline.CommandLine("a --")
        self.assertEqual(expected_kern, cmd.kern_args)
        self.assertEqual(expected_init, cmd.init_args)

    def testEmptyKern(self):
        """Test that '-- a' behaves as expected."""
        expected_kern = []
        expected_init = [kernel_cmdline.KernelArg("a", None)]
        cmd = kernel_cmdline.CommandLine("-- a")
        self.assertEqual(expected_kern, cmd.kern_args)
        self.assertEqual(expected_init, cmd.init_args)

    def testEmptyArg(self):
        """Test that '' behaves as expected."""
        expected_kern = []
        expected_init = []
        cmd = kernel_cmdline.CommandLine("")
        self.assertEqual(expected_kern, cmd.kern_args)
        self.assertEqual(expected_init, cmd.init_args)

    def testEqual(self):
        """Test that CommandLine equal compare works."""
        # Confirm that != is False, and == is True
        self.assertFalse(
            kernel_cmdline.CommandLine("a b -- d e")
            != kernel_cmdline.CommandLine("a b -- d e")
        )
        self.assertTrue(
            kernel_cmdline.CommandLine("a b -- d e")
            == kernel_cmdline.CommandLine("a b -- d e")
        )

    def testNotEqual(self):
        """Test that CommandLine equal compare works."""
        # Confirm that == is False, and != is True
        self.assertFalse(
            kernel_cmdline.CommandLine("a b -- d e")
            == kernel_cmdline.CommandLine("a b -- d f")
        )
        self.assertTrue(
            kernel_cmdline.CommandLine("a b -- d e")
            != kernel_cmdline.CommandLine("a b -- d f")
        )

    def testDashesOnly(self):
        """Test that '--' behaves as expected."""
        expected_kern = []
        expected_init = []
        cmd = kernel_cmdline.CommandLine("--")
        self.assertEqual(expected_kern, cmd.kern_args)
        self.assertEqual(expected_init, cmd.init_args)

    def testExpandsDm(self):
        """Test that we do not expand dm="..."."""
        expected_kern = [
            kernel_cmdline.KernelArg("a", None),
            kernel_cmdline.KernelArg("dm", '"1 vroot b=c 1,0 1200"'),
            kernel_cmdline.KernelArg("c.d", "e"),
        ]
        expected_init = [
            kernel_cmdline.KernelArg("dm", '"not split"'),
            kernel_cmdline.KernelArg("a", None),
        ]
        cmd = kernel_cmdline.CommandLine(
            'a dm="1 vroot b=c 1,0 1200" c.d=e -- dm="not split" a'
        )
        self.assertEqual(expected_kern, cmd.kern_args)
        self.assertEqual(expected_init, cmd.init_args)

    def testGetKernelParameter(self):
        """Test GetKernelParameter calls Get."""
        get = self.PatchObject(kernel_cmdline.KernelArgList, "get")
        cmd = kernel_cmdline.CommandLine("a b c b=3")
        cmd.GetKernelParameter(1)
        get.assert_called_once_with(1, default=None)

    def testGetKernelParameterPassesDefault(self):
        """Test GetKernelParameter calls Get with default=."""
        get = self.PatchObject(kernel_cmdline.KernelArgList, "get")
        cmd = kernel_cmdline.CommandLine("a b c b=3")
        cmd.GetKernelParameter(1, default=3)
        get.assert_called_once_with(1, default=3)

    def testSetKernelParameter(self):
        """Test SetKernelParameter calls update."""
        mock_update = self.PatchObject(kernel_cmdline.KernelArgList, "update")
        cmd = kernel_cmdline.CommandLine("a b c b=3")
        cmd.SetKernelParameter("d", "e")
        mock_update.assert_called_once_with({"d": "e"})

    def testFormat(self):
        """Test that the output is correct."""
        self.assertEqual(CMDLINE, kernel_cmdline.CommandLine(CMDLINE).Format())

    def testGetDmConfig(self):
        """Test that GetDmConfig returns the DmConfig we expect."""
        cmd = kernel_cmdline.CommandLine(CMDLINE)
        dm = kernel_cmdline.DmConfig(DM)
        self.assertEqual(dm, cmd.GetDmConfig())

    def testGetDmConfigHandlesMissing(self):
        """Test that GetDmConfig works with no dm= parameter."""
        cmd = kernel_cmdline.CommandLine("a b")
        self.assertEqual(None, cmd.GetDmConfig())

    def testSetDmConfig(self):
        """Test that SetDmConfig sets the dm= parameter."""
        cmd = kernel_cmdline.CommandLine("a -- b")
        cmd.SetDmConfig(kernel_cmdline.DmConfig(DM))
        self.assertEqual(kernel_cmdline.KernelArg("dm", DM), cmd.kern_args[1])

    def testSetDmConfigAcceptsNone(self):
        """Test that SetDmConfig deletes the dm= parameter when set to None."""
        cmd = kernel_cmdline.CommandLine('a dm="0 vroot none 0" -- b')
        cmd.SetDmConfig(None)
        self.assertEqual(None, cmd.GetDmConfig())
        self.assertFalse("dm" in cmd.kern_args)


class DmConfigTest(cros_test_lib.TestCase):
    """Test DmConfig."""

    def testParses(self):
        """Verify that DmConfig correctly parses the config from DmDevice."""
        device_data = [
            ["vboot uuid ro 1", "0 1 verity arg1 arg2"],
            [
                "vblah uuid2 ro 2",
                "100 9 stripe larg1=val1",
                "200 10 stripe larg2=val2",
            ],
            ["vroot uuid3 ro 1", "99 3 linear larg1 larg2"],
        ]
        dm_arg = ", ".join(",".join(x for x in data) for data in device_data)
        devices = [kernel_cmdline.DmDevice(x) for x in device_data]
        dc = kernel_cmdline.DmConfig("%d %s" % (len(device_data), dm_arg))
        self.assertEqual(len(device_data), dc.num_devices)
        self.assertEqual(devices, list(dc.devices.values()))

    def testIgnoresQuotes(self):
        """Verify that DmConfig works with quoted string."""
        device_data = [
            ["vboot uuid ro 1", "0 1 verity arg1 arg2"],
            [
                "vblah uuid2 ro 2",
                "100 9 stripe larg1=val1",
                "200 10 stripe larg2=val2",
            ],
            ["vroot uuid3 ro 1", "99 3 linear larg1 larg2"],
        ]
        dm_arg = ", ".join(",".join(x for x in data) for data in device_data)
        devices = [kernel_cmdline.DmDevice(x) for x in device_data]
        dc = kernel_cmdline.DmConfig('"%d %s"' % (len(device_data), dm_arg))
        self.assertEqual(len(device_data), dc.num_devices)
        self.assertEqual(devices, list(dc.devices.values()))

    def testFormats(self):
        """Verify that DmConfig recreates its input string."""
        device_data = [
            ["vboot uuid ro 1", "0 1 verity arg1 arg2"],
            [
                "vblah uuid2 ro 2",
                "100 9 stripe larg1=val1",
                "200 10 stripe larg2=val2",
            ],
            ["vroot uuid3 ro 1", "99 3 linear larg1 larg2"],
        ]
        dm_arg = ", ".join(",".join(x for x in data) for data in device_data)
        dm_config_val = "%d %s" % (len(device_data), dm_arg)
        dc = kernel_cmdline.DmConfig(dm_config_val)
        self.assertEqual(dm_config_val, dc.Format())

    def testEqual(self):
        """Test that equal instances are equal."""
        arg = "2 v1 u1 f1 1,0 1 t1 a1, v2 u2 f2 2,3 4 t2 a2,5 6 t3 a3"
        dc = kernel_cmdline.DmConfig(arg)
        self.assertEqual(dc, kernel_cmdline.DmConfig(arg))
        self.assertTrue(dc == kernel_cmdline.DmConfig(arg))
        # Also verify that != is False.
        self.assertFalse(dc != kernel_cmdline.DmConfig(arg))

    def testNotEqual(self):
        """Test that unequal instances are unequal."""
        # Start with duplicated instances, and change fields to verify that all
        # the fields matter.
        arg = "2 v1 u1 f1 1,0 1 t1 a1, v2 u2 f2 2,3 4 t2 a2,5 6 t3 a3"
        dc1 = kernel_cmdline.DmConfig(arg)
        self.assertNotEqual(dc1, "")
        dc2 = kernel_cmdline.DmConfig(arg)
        dc2.num_devices = 1
        self.assertNotEqual(dc1, dc2)
        dc3 = kernel_cmdline.DmConfig(arg)
        dc3.devices = []
        self.assertNotEqual(dc1, dc3)

    def testGetVerityArg(self):
        """Test that GetVerityArg works."""
        arg = ["v1 u1 f1 1", "0 1 verity a1 a2=v2"]
        a1 = kernel_cmdline.KernelArg("a1", None)
        a2 = kernel_cmdline.KernelArg("a2", "v2")
        dd = kernel_cmdline.DmDevice(arg)
        self.assertEqual(a1, dd.GetVerityArg("a1"))
        self.assertEqual(a2, dd.GetVerityArg("a2"))
        self.assertEqual(None, dd.GetVerityArg("a3", default=None))
        self.assertEqual(a1, dd.GetVerityArg("a3", default=a1))

    def testGetVerityArgMultiLine(self):
        """Test that GetVerityArg works."""
        arg = [
            "v1 u1 f1 3",
            "9 9 xx a3 a4=v4",
            "0 1 verity a1 a2=v2",
            "9 9 verity a3 a2=v4",
        ]
        a1 = kernel_cmdline.KernelArg("a1", None)
        a2 = kernel_cmdline.KernelArg("a2", "v2")
        dd = kernel_cmdline.DmDevice(arg)
        self.assertEqual(a1, dd.GetVerityArg("a1"))
        self.assertEqual(a2, dd.GetVerityArg("a2"))
        self.assertEqual(None, dd.GetVerityArg("a3"))
        self.assertEqual(None, dd.GetVerityArg("a9", default=None))
        self.assertEqual(a1, dd.GetVerityArg("a9", default=a1))

    def testUpdateVerityArg(self):
        """Test that UpdateVerityArg works."""
        arg = ["v1 u1 f1 1", "0 1 verity a1 a2=v2"]
        dd = kernel_cmdline.DmDevice(arg)
        dd.UpdateVerityArg("a2", "new")
        self.assertEqual(
            kernel_cmdline.KernelArg("a2", "new"), dd.rows[0].args[1]
        )
        dd.UpdateVerityArg("a3", None)
        self.assertEqual(
            kernel_cmdline.KernelArg("a3", None), dd.rows[0].args[2]
        )

    def testUpdateVerityArgMultiLine(self):
        """Test that UpdateVerityArg works."""
        arg = [
            "v1 u1 f1 3",
            "9 9 xx a3 a4=v4",
            "0 1 verity a1 a2=v2",
            "9 9 verity a1 a2=v2 an",
        ]
        dd = kernel_cmdline.DmDevice(arg)
        a2 = kernel_cmdline.KernelArg("a2", "new")
        dd.UpdateVerityArg("a2", "new")
        self.assertEqual(a2, dd.rows[1].args[1])
        self.assertEqual(a2, dd.rows[2].args[1])
        a3 = kernel_cmdline.KernelArg("a3", None)
        dd.UpdateVerityArg("a3", None)
        self.assertEqual(a3, dd.rows[1].args[2])
        self.assertEqual(a3, dd.rows[2].args[3])


class DmDeviceTest(cros_test_lib.TestCase):
    """Test DmDevice."""

    def testParsesOneLine(self):
        """Verify that DmDevice correctly handles the results from DmLine."""
        lines = ["vboot none ro 1", "0 1 verity arg"]
        dd = kernel_cmdline.DmDevice(lines)
        self.assertEqual("vboot", dd.name)
        self.assertEqual("none", dd.uuid)
        self.assertEqual("ro", dd.flags)
        self.assertEqual(1, dd.num_rows)
        self.assertEqual([kernel_cmdline.DmLine("0 1 verity arg")], dd.rows)

    def testParsesMultiLine(self):
        """Verify that DmDevice correctly handles multiline device."""
        lines = ["vboot none ro 2", "0 1 verity arg", "9 10 type a2"]
        dd = kernel_cmdline.DmDevice(lines)
        self.assertEqual("vboot", dd.name)
        self.assertEqual("none", dd.uuid)
        self.assertEqual("ro", dd.flags)
        self.assertEqual(2, dd.num_rows)
        self.assertEqual(
            [
                kernel_cmdline.DmLine("0 1 verity arg"),
                kernel_cmdline.DmLine("9 10 type a2"),
            ],
            dd.rows,
        )

    def testParsesIgnoresExcessRows(self):
        """Verify that DmDevice ignores excess rows."""
        lines = [
            "vboot none ro 2",
            "0 1 verity arg",
            "9 10 type a2",
            "4 5 t a3",
        ]
        dd = kernel_cmdline.DmDevice(lines)
        self.assertEqual("vboot", dd.name)
        self.assertEqual("none", dd.uuid)
        self.assertEqual("ro", dd.flags)
        self.assertEqual(2, dd.num_rows)
        self.assertEqual(
            [
                kernel_cmdline.DmLine("0 1 verity arg"),
                kernel_cmdline.DmLine("9 10 type a2"),
            ],
            dd.rows,
        )

    def testEqual(self):
        """Test that equal instances are equal."""
        dd = kernel_cmdline.DmDevice(["v u f 1", "0 1 typ a"])
        self.assertEqual(dd, kernel_cmdline.DmDevice(["v u f 1", "0 1 typ a"]))
        self.assertTrue(dd == kernel_cmdline.DmDevice(["v u f 1", "0 1 typ a"]))
        self.assertFalse(
            dd != kernel_cmdline.DmDevice(["v u f 1", "0 1 typ a"])
        )

    def testMultiLineEqual(self):
        """Test that equal instances are equal."""
        dd = kernel_cmdline.DmDevice(["v u f 2", "0 1 typ a", "2 3 t b"])
        self.assertEqual(
            dd, kernel_cmdline.DmDevice(["v u f 2", "0 1 typ a", "2 3 t b"])
        )
        self.assertFalse(
            dd != kernel_cmdline.DmDevice(["v u f 2", "0 1 typ a", "2 3 t b"])
        )

    def testNotEqual(self):
        """Test that unequal instances are unequal."""
        dd = kernel_cmdline.DmDevice(["v u f 2", "0 1 typ a", "2 3 t b"])
        self.assertNotEqual(dd, "")
        self.assertNotEqual(
            dd, kernel_cmdline.DmDevice(["x u f 2", "0 1 typ a", "2 3 t b"])
        )
        self.assertNotEqual(
            dd, kernel_cmdline.DmDevice(["v x f 2", "0 1 typ a", "2 3 t b"])
        )
        self.assertNotEqual(
            dd, kernel_cmdline.DmDevice(["v u x 2", "0 1 typ a", "2 3 t b"])
        )
        self.assertNotEqual(
            dd, kernel_cmdline.DmDevice(["v u f 1", "0 1 typ a", "2 3 t b"])
        )
        self.assertNotEqual(
            dd, kernel_cmdline.DmDevice(["v u f 2", "9 1 typ a", "2 3 t b"])
        )


class DmLineTest(cros_test_lib.TestCase):
    """Test DmLine."""

    def testParses(self):
        """Verify that DmLine correctly parses a line, and returns it."""
        text = "0 1 verity a1 a2=v2 a3"
        dl = kernel_cmdline.DmLine(text)
        self.assertEqual(0, dl.start)
        self.assertEqual(1, dl.num)
        self.assertEqual("verity", dl.target_type)
        self.assertEqual(kernel_cmdline.KernelArgList("a1 a2=v2 a3"), dl.args)
        self.assertEqual(text, dl.Format())

    def testAllowsWhitespace(self):
        """Verify that leading/trailing whitespace is ignored."""
        text = "0 1 verity a1 a2=v2 a3"
        dl = kernel_cmdline.DmLine(" %s " % text)
        self.assertEqual(0, dl.start)
        self.assertEqual(1, dl.num)
        self.assertEqual("verity", dl.target_type)
        self.assertEqual(kernel_cmdline.KernelArgList("a1 a2=v2 a3"), dl.args)
        self.assertEqual(text, dl.Format())

    def testEqual(self):
        """Test that equal instances are equal."""
        dl = kernel_cmdline.DmLine("0 1 verity a1 a2=v2 a3")
        self.assertEqual(dl, kernel_cmdline.DmLine("0 1 verity a1 a2=v2 a3"))
        self.assertFalse(dl != kernel_cmdline.DmLine("0 1 verity a1 a2=v2 a3"))

    def testNotEqual(self):
        """Test that unequal instances are unequal."""
        dl = kernel_cmdline.DmLine("0 1 verity a1 a2=v2 a3")
        self.assertNotEqual(dl, "")
        self.assertNotEqual(dl, kernel_cmdline.DmLine("1 1 verity a1 a2=v2 a3"))
        self.assertNotEqual(dl, kernel_cmdline.DmLine("0 2 verity a1 a2=v2 a3"))
        self.assertNotEqual(dl, kernel_cmdline.DmLine("0 1 verit  a1 a2=v2 a3"))
        self.assertNotEqual(dl, kernel_cmdline.DmLine("0 1 verity aN a2=v2 a3"))
