# Copyright 2019 The Chromium OS Authors. All rights reserved.
# 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, [x for x in 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, [x for x in 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'))
