chromium/tools/android/native_lib_memory/parse_smaps_unittest.py

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

import unittest

import parse_smaps


class ParseProcSmapTest(unittest.TestCase):
  def testSingleEntry(self):
    CONTENT = """7fff4fbfc000-7fff4fbfe000 r-xp 00000000 00:00 0      [vdso]
Size:                  8 kB
Rss:                   4 kB
Pss:                   0 kB
Shared_Clean:          4 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            4 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex mr mw me de sd""".split('\n')
    mappings = parse_smaps._ParseProcSmapsLines(CONTENT)
    self.assertEqual(1, len(mappings))
    self.assertEqual(0x7fff4fbfc000, mappings[0].start)
    self.assertEqual(0x7fff4fbfe000, mappings[0].end)
    self.assertEqual('r-xp', mappings[0].permissions)
    self.assertEqual(0, mappings[0].offset)
    self.assertEqual('[vdso]', mappings[0].pathname)
    self.assertEqual([
        'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean',
        'Private_Dirty', 'Referenced', 'Anonymous', 'AnonHugePages',
        'ShmemPmdMapped', 'Shared_Hugetlb', 'Private_Hugetlb', 'Swap',
        'SwapPss', 'KernelPageSize', 'MMUPageSize', 'Locked', 'VmFlags'
    ], list(mappings[0].fields.keys()))
    self.assertEqual(8, mappings[0].fields['Size'])
    self.assertEqual('rd ex mr mw me de sd', mappings[0].fields['VmFlags'])

  def testSeveralEntries(self):
    CONTENT = """7fff4fbfc000-7fff4fbfe000 r-xp 00000000 00:00 0      [vdso]
Size:                  8 kB
VmFlags: rd ex mr mw me de sd
ffffffffff600000-ffffffffff601000 r-xp 00000010 00:00 0      /tmp/foo
Size:                  192 kB
VmFlags: rd ex""".split('\n')
    mappings = parse_smaps._ParseProcSmapsLines(CONTENT)
    self.assertEqual(2, len(mappings))
    self.assertEqual(0x7fff4fbfc000, mappings[0].start)
    self.assertEqual(0x7fff4fbfe000, mappings[0].end)
    self.assertEqual('r-xp', mappings[0].permissions)
    self.assertEqual(0, mappings[0].offset)
    self.assertEqual('[vdso]', mappings[0].pathname)
    self.assertEqual(['Size', 'VmFlags'], list(mappings[0].fields.keys()))
    self.assertEqual(8, mappings[0].fields['Size'])
    self.assertEqual('rd ex mr mw me de sd', mappings[0].fields['VmFlags'])

    self.assertEqual(0xffffffffff600000, mappings[1].start)
    self.assertEqual(0xffffffffff601000, mappings[1].end)
    self.assertEqual('r-xp', mappings[1].permissions)
    self.assertEqual(0x10, mappings[1].offset)
    self.assertEqual('/tmp/foo', mappings[1].pathname)
    self.assertEqual(['Size', 'VmFlags'], list(mappings[1].fields.keys()))
    self.assertEqual(192, mappings[1].fields['Size'])
    self.assertEqual('rd ex', mappings[1].fields['VmFlags'])

  def testToString(self):
    CONTENT = """7fff4fbfc000-7fff4fbfe000 r-xp 00000010 00:00 0      [vdso]
Size:                  8 kB
VmFlags: rd ex mr mw me de sd""".split('\n')
    mappings = parse_smaps._ParseProcSmapsLines(CONTENT)
    self.assertEqual(1, len(mappings))
    self.assertEqual(
        """7fff4fbfc000-7fff4fbfe000 r-xp 10 [vdso]
Size: 8 kB
VmFlags: rd ex mr mw me de sd""", mappings[0].ToString())


if __name__ == '__main__':
  unittest.main()