Source code for mentat.datatype.test_internal

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# This file is part of Mentat system (https://mentat.cesnet.cz/).
#
# Copyright (C) since 2011 CESNET, z.s.p.o (http://www.ces.net/)
# Use of this source is governed by the MIT license, see LICENSE file.
#-------------------------------------------------------------------------------


"""
Unit test module for testing the :py:mod:`mentat.datatype.internal` module.
"""


__author__  = "Jan Mach <jan.mach@cesnet.cz>"
__credits__ = "Pavel Kácha <pavel.kacha@cesnet.cz>, Andrea Kropáčová <andrea.kropacova@cesnet.cz>"


import unittest
#import datetime
from pprint import pprint

import ipranges
import mentat.datatype.internal


#-------------------------------------------------------------------------------
# NOTE: Sorry for the long lines in this file. They are deliberate, because the
# assertion permutations are (IMHO) more readable this way.
#-------------------------------------------------------------------------------


[docs]class TestMentatDatatypeInternal(unittest.TestCase): """ Unit test class for testing the :py:mod:`mentat.datatype.internal` module. """ # # Turn on more verbose output, which includes print-out of constructed # objects. This will really clutter your console, usable only for test # debugging. # verbose = True nr_records_raw = [ { "source" : "negistry", "netname" : "MUNI-CUST-6TCZ", "network" : "2001:718:805::/48", "_id" : "rJraLUFYXe", "last" : 4.25406320428021e+37, "description" : "Masaryk University, Brno", "type" : "ipv6" }, { "source" : "negistry", "first" : 4.254063204279606e+37, "netname" : "MUNI-6TCZ", "network" : "2001:718:801::/48", "ip6_prefix" : 48, "_id" : "PO7U6jBOcE", "last" : 4.254063204279727e+37, "description" : "Masaryk University, Brno", "ip6_addr" : "2001:718:801::", "type" : "ipv6" }, { "source" : "negistry", "first" : 4.254063204279485e+37, "netname" : "MUNI-IC-6TCZ", "network" : "2001:718:800:1::/64", "ip6_prefix" : 64, "_id" : "mbqWk8R4ie", "last" : 4.254063204279485e+37, "description" : "Masaryk University, Brno", "ip6_addr" : "2001:718:800:1::", "type" : "ipv6" }, { "source" : "negistry", "first" : 3283244544, "netname" : "BAPS-T34CZ", "network" : "195.178.86.0-195.178.87.255", "_id" : "jpEayOwZ8m", "last" : 3283245055, "description" : "Brno Academic Computer Network, Brno", "ip4_end" : "195.178.87.255", "ip4_start" : "195.178.86.0", "type" : "ipv4" }, { "source" : "negistry", "first" : 2482700288, "netname" : "MUNI-TCZ", "network" : "147.251.0.0-147.251.255.255", "_id" : "Hj3Tx0GG5T", "last" : 2482765823, "description" : "Masaryk University, Brno", "type" : "ipv4" }, { "source" : "negistry", "first" : 4.254063204279485e+37, "netname" : "MUNI-CUST-IC-6TCZ", "network" : "2001:718:800:5::/64", "_id" : "SIfqthXOFx", "last" : 4.254063204279485e+37, "description" : "Masaryk University, Brno", "type" : "ipv6" } ] nr_records_few_raw = [ { "source" : "negistry", "netname" : "MUNI-CUST-6TCZ", "network" : "2001:718:805::/48", "_id" : "rJraLUFYXe", "last" : 4.25406320428021e+37, "description" : "Masaryk University, Brno", "type" : "ipv6" }, { "source" : "negistry", "first" : 4.254063204279606e+37, "netname" : "MUNI-6TCZ", "network" : "2001:718:801::/48", "ip6_prefix" : 48, "_id" : "PO7U6jBOcE", "last" : 4.254063204279727e+37, "description" : "Masaryk University, Brno", "ip6_addr" : "2001:718:801::", "type" : "ipv6" }, { "source" : "negistry", "first" : 4.254063204279485e+37, "netname" : "MUNI-IC-6TCZ", "network" : "2001:718:800:1::/64", "ip6_prefix" : 64, "_id" : "mbqWk8R4ie", "last" : 4.254063204279485e+37, "description" : "Masaryk University, Brno", "ip6_addr" : "2001:718:800:1::", "type" : "ipv6" } ] group_raw = { '_id': 'abuse@muni.cz', 'ts': 1493281523, 'managers': [], 'source': mentat.datatype.internal.NR_SOURCE_NEGISTRY, 'subnet_cache': 0, 'networks': nr_records_raw, 'rep_mode': 'summary', 'rep_emails_low': ['abuse@muni.cz'], 'rep_filters': [], 'rep_mute': 0, 'rep_redirect': 1 } group_empty_raw = { '_id': 'abuse@cesnet.cz', 'ts': 1493281523, 'managers': [], 'source': mentat.datatype.internal.NR_SOURCE_NEGISTRY, 'subnet_cache': 0, 'networks': [], 'rep_mode': 'summary', 'rep_emails_low': ['abuse@muni.cz'], 'rep_filters': [], 'rep_mute': 0, 'rep_redirect': 1 } user_raw = { "_id" : "mach@cesnet.cz", "orggroups" : [ "cesnet:Employees", "cesnet:CERTS" ], "groups" : [ "abuse@cesnet.cz" ], "ts_last_login" : 1505483119, "affiliations" : [ "member@cesnet.cz", "employee@cesnet.cz" ], "organization" : "CESNET, z. s. p. o.", "query" : [ { "detector" : "au1/N6", "simple" : 1, "dateto" : "", "_id" : "N6", "query" : "( Alert/Analyzer/@analyzerid EQ \"au1\" AND Alert/Analyzer/@name EQ \"N6\" )", "ipor" : "FALSE", "classification" : "", "ipsrc" : "", "datefrom" : "", "ipdst" : "" } ], "ts" : 1388577600, "roles" : [ "admin", "user" ], "email" : "jan.mach@cesnet.cz", "name" : "Jan Mach" } detector_raw = { "_id" : "1", "ts" : 1388577600, "source" : "warden", "credibility" : 0.73, "name" : "Test detector" }
[docs] def setUp(self): pass
[docs] def tearDown(self): pass
[docs] def test_01_conversions(self): """ Perform tests of parsing network records. """ self.maxDiff = None self.assertEqual(mentat.datatype.internal.to_net4('192.168.1.0-192.168.1.255'), ipranges.IP4Range('192.168.1.0-192.168.1.255')) with self.assertRaises(ValueError): mentat.datatype.internal.to_net4('192.168.1.1') self.assertEqual(mentat.datatype.internal.to_net6('2001:718:1:1::/64'), ipranges.IP6Net('2001:718:1:1::/64')) with self.assertRaises(ValueError): mentat.datatype.internal.to_net6('2001:718:1:1::1') self.assertTrue(mentat.datatype.internal.gen_sid()) self.assertTrue(mentat.datatype.internal.gen_sid()) self.assertEqual(mentat.datatype.internal.t_net4('192.168.1.0'), ipranges.IP4('192.168.1.0')) self.assertEqual(mentat.datatype.internal.t_net4('192.168.1.0/28'), ipranges.IP4Net('192.168.1.0/28')) self.assertEqual(mentat.datatype.internal.t_net4('192.168.1.0-192.168.1.255'), ipranges.IP4Range('192.168.1.0-192.168.1.255')) with self.assertRaises(ValueError): mentat.datatype.internal.t_net4('192.168.300') self.assertEqual(mentat.datatype.internal.t_net6('2001:718:1:1::1'), ipranges.IP6('2001:718:1:1::1')) self.assertEqual(mentat.datatype.internal.t_net6('2001:718:1:1::/64'), ipranges.IP6Net('2001:718:1:1::/64')) self.assertEqual(mentat.datatype.internal.t_net6('2001:718:1:1::1-2001:718:1:1::100'), ipranges.IP6Range('2001:718:1:1::1-2001:718:1:1::100')) with self.assertRaises(ValueError): mentat.datatype.internal.t_net6('2001:718:1:1:::') self.assertEqual(mentat.datatype.internal.t_net('192.168.1.0'), ipranges.IP4('192.168.1.0')) self.assertEqual(mentat.datatype.internal.t_net('192.168.1.0/28'), ipranges.IP4Net('192.168.1.0/28')) self.assertEqual(mentat.datatype.internal.t_net('192.168.1.0-192.168.1.255'), ipranges.IP4Range('192.168.1.0-192.168.1.255')) self.assertEqual(mentat.datatype.internal.t_net('2001:718:1:1::1'), ipranges.IP6('2001:718:1:1::1')) self.assertEqual(mentat.datatype.internal.t_net('2001:718:1:1::/64'), ipranges.IP6Net('2001:718:1:1::/64')) self.assertEqual(mentat.datatype.internal.t_net('2001:718:1:1::1-2001:718:1:1::100'), ipranges.IP6Range('2001:718:1:1::1-2001:718:1:1::100')) with self.assertRaises(ValueError): mentat.datatype.internal.t_net('2001:718:1:1:::') # TODO: Fix and make work #self.assertEqual(mentat.datatype.internal.t_datetime(1497344152), datetime.datetime.fromtimestamp(1497344152)) #self.assertEqual(mentat.datatype.internal.t_datetime('2017-06-13T10:55:52+00:00'), datetime.datetime.fromtimestamp(1497344152)) self.assertEqual(mentat.datatype.internal.t_network_record_type_ip4('ipv4'), 'ipv4') self.assertEqual(mentat.datatype.internal.t_network_record_type_ip6('ipv6'), 'ipv6') with self.assertRaises(ValueError): self.assertEqual(mentat.datatype.internal.t_network_record_type_ip4('ipv6'), 'ipv4') with self.assertRaises(ValueError): self.assertEqual(mentat.datatype.internal.t_network_record_type_ip6('ipv4'), 'ipv6')
[docs] def test_02_network_record(self): """ Perform tests of parsing network records. """ self.maxDiff = None for r in self.nr_records_raw: nr = mentat.datatype.internal.t_network_record(r) if self.verbose: print("STR '{}' => {}".format(r['network'], str(nr))) print("REPR '{}' => {}".format(r['network'], repr(nr))) print("FPR '{}' => {}".format(r['network'], nr.fingerprint())) pprint(nr)
[docs] def test_03_abuse_group(self): """ Perform tests of parsing abuse groups. """ self.maxDiff = None abg = mentat.datatype.internal.AbuseGroup(self.group_raw) self.assertEqual(abg['_id'], 'abuse@muni.cz') self.assertEqual(abg['rep_mode'], 'summary') if self.verbose: pprint(abg) for net in abg['networks']: pprint(net)
[docs] def test_04_user(self): """ Perform tests of parsing user accounts. """ self.maxDiff = None uac = mentat.datatype.internal.User(self.user_raw) self.assertEqual(uac['_id'], 'mach@cesnet.cz') if self.verbose: pprint(uac)
[docs] def test_05_detector(self): """ Perform tests of parsing detectors. """ self.maxDiff = None det = mentat.datatype.internal.Detector(self.detector_raw) self.assertEqual(det['_id'], '1') self.assertEqual(det['credibility'], 0.73) self.assertEqual(det['name'], 'Test detector') self.assertEqual(det['source'], 'warden') if self.verbose: pprint(det)
#------------------------------------------------------------------------------- if __name__ == '__main__': unittest.main()