diff --git a/tests/test_proc.py b/tests/test_proc.py new file mode 100644 index 00000000..e2f83b1b --- /dev/null +++ b/tests/test_proc.py @@ -0,0 +1,230 @@ +import os +import unittest +import json +from typing import Dict +import jc.parsers.proc +from jc.exceptions import ParseError + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class MyTests(unittest.TestCase): + """ + These tests replicate the individual /proc file module tests, but the purpose + is different. These tests ensure the file signature matching engine in the + /proc parser module sends the user input to the correct parser. + + Signature match regex can be order dependent, so these tests make sure we + don't break anything when adding/removing/re-ordering the signature regexes. + """ + f_in: Dict = {} + f_json: Dict = {} + + @classmethod + def setUpClass(cls): + fixtures = { + 'proc_buddyinfo': ( + 'fixtures/linux-proc/buddyinfo', + 'fixtures/linux-proc/buddyinfo.json'), + 'proc_consoles': ( + 'fixtures/linux-proc/consoles', + 'fixtures/linux-proc/consoles.json'), + 'proc_consoles2': ( + 'fixtures/linux-proc/consoles2', + 'fixtures/linux-proc/consoles2.json'), + 'proc_cpuinfo': ( + 'fixtures/linux-proc/cpuinfo', + 'fixtures/linux-proc/cpuinfo.json'), + 'proc_cpuinfo2': ( + 'fixtures/linux-proc/cpuinfo2', + 'fixtures/linux-proc/cpuinfo2.json'), + 'proc_crypto': ( + 'fixtures/linux-proc/crypto', + 'fixtures/linux-proc/crypto.json'), + 'proc_devices': ( + 'fixtures/linux-proc/devices', + 'fixtures/linux-proc/devices.json'), + 'proc_diskstats': ( + 'fixtures/linux-proc/diskstats', + 'fixtures/linux-proc/diskstats.json'), + 'proc_driver_rtc': ( + 'fixtures/linux-proc/driver_rtc', + 'fixtures/linux-proc/driver_rtc.json'), + 'proc_filesystems': ( + 'fixtures/linux-proc/filesystems', + 'fixtures/linux-proc/filesystems.json'), + 'proc_interrupts': ( + 'fixtures/linux-proc/interrupts', + 'fixtures/linux-proc/interrupts.json'), + 'proc_iomem': ( + 'fixtures/linux-proc/iomem', + 'fixtures/linux-proc/iomem.json'), + 'proc_ioports': ( + 'fixtures/linux-proc/ioports', + 'fixtures/linux-proc/ioports.json'), + 'proc_loadavg': ( + 'fixtures/linux-proc/loadavg', + 'fixtures/linux-proc/loadavg.json'), + 'proc_locks': ( + 'fixtures/linux-proc/locks', + 'fixtures/linux-proc/locks.json'), + 'proc_meminfo': ( + 'fixtures/linux-proc/meminfo', + 'fixtures/linux-proc/meminfo.json'), + 'proc_modules': ( + 'fixtures/linux-proc/modules', + 'fixtures/linux-proc/modules.json'), + 'proc_mtrr': ( + 'fixtures/linux-proc/mtrr', + 'fixtures/linux-proc/mtrr.json'), + 'proc_pagetypeinfo': ( + 'fixtures/linux-proc/pagetypeinfo', + 'fixtures/linux-proc/pagetypeinfo.json'), + 'proc_partitions': ( + 'fixtures/linux-proc/partitions', + 'fixtures/linux-proc/partitions.json'), + 'proc_slabinfo': ( + 'fixtures/linux-proc/slabinfo', + 'fixtures/linux-proc/slabinfo.json'), + 'proc_softirqs': ( + 'fixtures/linux-proc/softirqs', + 'fixtures/linux-proc/softirqs.json'), + 'proc_stat': ( + 'fixtures/linux-proc/stat', + 'fixtures/linux-proc/stat.json'), + 'proc_stat2': ( + 'fixtures/linux-proc/stat2', + 'fixtures/linux-proc/stat2.json'), + 'proc_swaps': ( + 'fixtures/linux-proc/swaps', + 'fixtures/linux-proc/swaps.json'), + 'proc_uptime': ( + 'fixtures/linux-proc/uptime', + 'fixtures/linux-proc/uptime.json'), + 'proc_version': ( + 'fixtures/linux-proc/version', + 'fixtures/linux-proc/version.json'), + 'proc_version2': ( + 'fixtures/linux-proc/version2', + 'fixtures/linux-proc/version2.json'), + 'proc_version3': ( + 'fixtures/linux-proc/version3', + 'fixtures/linux-proc/version3.json'), + 'proc_vmallocinfo': ( + 'fixtures/linux-proc/vmallocinfo', + 'fixtures/linux-proc/vmallocinfo.json'), + 'proc_vmstat': ( + 'fixtures/linux-proc/vmstat', + 'fixtures/linux-proc/vmstat.json'), + 'proc_zoneinfo': ( + 'fixtures/linux-proc/zoneinfo', + 'fixtures/linux-proc/zoneinfo.json'), + 'proc_zoneinfo2': ( + 'fixtures/linux-proc/zoneinfo2', + 'fixtures/linux-proc/zoneinfo2.json'), + + 'proc_net_arp': ( + 'fixtures/linux-proc/net_arp', + 'fixtures/linux-proc/net_arp.json'), + 'proc_net_dev_mcast': ( + 'fixtures/linux-proc/net_dev_mcast', + 'fixtures/linux-proc/net_dev_mcast.json'), + 'proc_net_dev': ( + 'fixtures/linux-proc/net_dev', + 'fixtures/linux-proc/net_dev.json'), + 'proc_net_if_inet6': ( + 'fixtures/linux-proc/net_if_inet6', + 'fixtures/linux-proc/net_if_inet6.json'), + 'proc_net_igmp': ( + 'fixtures/linux-proc/net_igmp', + 'fixtures/linux-proc/net_igmp.json'), + 'proc_net_igmp_more': ( + 'fixtures/linux-proc/net_igmp_more', + 'fixtures/linux-proc/net_igmp_more.json'), + 'proc_net_igmp6': ( + 'fixtures/linux-proc/net_igmp6', + 'fixtures/linux-proc/net_igmp6.json'), + 'proc_net_ipv6_route': ( + 'fixtures/linux-proc/net_ipv6_route', + 'fixtures/linux-proc/net_ipv6_route.json'), + 'proc_net_netlink': ( + 'fixtures/linux-proc/net_netlink', + 'fixtures/linux-proc/net_netlink.json'), + 'proc_net_netstat': ( + 'fixtures/linux-proc/net_netstat', + 'fixtures/linux-proc/net_netstat.json'), + 'proc_net_packet': ( + 'fixtures/linux-proc/net_packet', + 'fixtures/linux-proc/net_packet.json'), + 'proc_net_protocols': ( + 'fixtures/linux-proc/net_protocols', + 'fixtures/linux-proc/net_protocols.json'), + + 'proc_pid_fdinfo': ( + 'fixtures/linux-proc/pid_fdinfo', + 'fixtures/linux-proc/pid_fdinfo.json'), + 'proc_pid_fdinfo_dma': ( + 'fixtures/linux-proc/pid_fdinfo_dma', + 'fixtures/linux-proc/pid_fdinfo_dma.json'), + 'proc_pid_fdinfo_epoll': ( + 'fixtures/linux-proc/pid_fdinfo_epoll', + 'fixtures/linux-proc/pid_fdinfo_epoll.json'), + 'proc_pid_fdinfo_fanotify': ( + 'fixtures/linux-proc/pid_fdinfo_fanotify', + 'fixtures/linux-proc/pid_fdinfo_fanotify.json'), + 'proc_pid_fdinfo_inotify': ( + 'fixtures/linux-proc/pid_fdinfo_inotify', + 'fixtures/linux-proc/pid_fdinfo_inotify.json'), + 'proc_pid_fdinfo_timerfd': ( + 'fixtures/linux-proc/pid_fdinfo_timerfd', + 'fixtures/linux-proc/pid_fdinfo_timerfd.json'), + 'proc_pid_io': ( + 'fixtures/linux-proc/pid_io', + 'fixtures/linux-proc/pid_io.json'), + 'proc_pid_maps': ( + 'fixtures/linux-proc/pid_maps', + 'fixtures/linux-proc/pid_maps.json'), + 'proc_pid_mountinfo': ( + 'fixtures/linux-proc/pid_mountinfo', + 'fixtures/linux-proc/pid_mountinfo.json'), + 'proc_pid_numa_maps': ( + 'fixtures/linux-proc/pid_numa_maps', + 'fixtures/linux-proc/pid_numa_maps.json'), + 'proc_pid_smaps': ( + 'fixtures/linux-proc/pid_smaps', + 'fixtures/linux-proc/pid_smaps.json'), + 'proc_pid_stat': ( + 'fixtures/linux-proc/pid_stat', + 'fixtures/linux-proc/pid_stat.json'), + 'proc_pid_statm': ( + 'fixtures/linux-proc/pid_statm', + 'fixtures/linux-proc/pid_statm.json'), + 'proc_pid_status': ( + 'fixtures/linux-proc/pid_status', + 'fixtures/linux-proc/pid_status.json') + } + + for file, filepaths in fixtures.items(): + with open(os.path.join(THIS_DIR, filepaths[0]), 'r', encoding='utf-8') as a, \ + open(os.path.join(THIS_DIR, filepaths[1]), 'r', encoding='utf-8') as b: + cls.f_in[file] = a.read() + cls.f_json[file] = json.loads(b.read()) + + + def test_foo_nodata(self): + """ + Test 'foo' with no data + """ + self.assertRaises(ParseError, jc.parsers.proc.parse, '') + + def test_proc_file_signature_detection(self): + """ + Test proc parser file signature detection + """ + for in_, expected in zip(self.f_in.keys(), self.f_json.keys()): + self.assertEqual(jc.parsers.proc.parse(self.f_in[in_], quiet=True), + self.f_json[expected]) + + +if __name__ == '__main__': + unittest.main()