def test_hash_not_found_block_after_end(self):
        """
        Log: check existing hash specifying datetime after interval
        The Repository must fail to verify existence of a hash if a
        datetime of the incorrect interval is specified.

        """
        time_res_s = self.repo._config['time_res_s']
        data = self.get_logging_test_data()
        req = self.repo.append_log(data,
                                   hasher_class=self.hasher_class,
                                   hasher_config=self.hasher_kwargs)
        dt = req['datetime']

        n = muteacle.interval_number(dt, time_res_s)
        intv_late = muteacle.interval_start(dt.year, dt.month, dt.day,
                                            time_res_s, n + 1)

        # logged data
        for i in self.data:
            with self.subTest(intv_late=intv_late, item=i):
                result = self.repo.check_log(intv_late, i)
                self.assertFalse(result)
        # unlogged data
        self.assertFalse(self.repo.check_log(intv_late, self.item_skipped))
    def test_hash_found_interval_mid_class_change(self):
        """
        Log: check existing hash using mid-interval datetime
        Hashes must remain verifiable across changes in hasher
        configuration.

        """
        time_res_s = self.repo._config['time_res_s']
        data_a = self.get_logging_test_data()
        req_a = self.repo.append_log(
            data_a,
            hasher_class=self.repo.supported_hashers['ScryptHasher'],
            hasher_config=self.hasher_kwargs_sc)
        dt_a = req_a['datetime']

        data_b = self.get_logging_test_data()
        req_b = self.repo.append_log(
            data_b,
            hasher_class=self.repo.supported_hashers['PBKDF2Hasher'],
            hasher_config=self.hasher_kwargs)

        n = muteacle.interval_number(dt_a, time_res_s)
        intv_mid = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                         time_res_s, n)

        for i in data_a:
            with self.subTest(intv_mid=intv_mid, item=i):
                result = self.repo.check_log(intv_mid, i)
                self.assertTrue(result)

        for i in data_b:
            with self.subTest(intv_mid=intv_mid, item=i):
                result = self.repo.check_log(intv_mid, i)
                self.assertTrue(result)
    def test_hash_not_found_interval_mid_class_change(self):
        """
        Log: check non-existing hash using mid-interval datetime
        across changes in hasher configuration.

        """
        time_res_s = self.repo._config['time_res_s']
        data_a = self.get_logging_test_data()
        req_a = self.repo.append_log(
            data_a,
            hasher_class=self.repo.supported_hashers['ScryptHasher'],
            hasher_config=self.hasher_kwargs_sc)
        dt_a = req_a['datetime']

        data_b = self.get_logging_test_data()
        req_b = self.repo.append_log(
            data_b,
            hasher_class=self.repo.supported_hashers['PBKDF2Hasher'],
            hasher_config=self.hasher_kwargs)

        n = muteacle.interval_number(dt_a, time_res_s)
        intv_mid = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                         time_res_s, n)

        result = self.repo.check_log(intv_mid, self.item_skipped)
        self.assertFalse(result)
    def test_hash_found_interval_mid_trs_downgrade(self):
        """
        Log: check existing hash using mid-interval datetime /w trs downgrade
        Hashes must be verifiable despite a change in the time_res_s
        setting on the Repository. This test verifies hash recall
        across downgrades of time_res_s (increasing time_res_s causes a
        lower time resolution)

        """
        time_res_s_a = 1
        self.repo.set_config({'time_res_s': time_res_s_a})
        while self.repo.pending_repo_config_datetime() is not None:
            pass
        data_a = self.get_logging_test_data()
        req_a = self.repo.append_log(data_a,
                                     hasher_config=self.hasher_kwargs_sc)
        dt_a = req_a['datetime']
        n_a = muteacle.interval_number(dt_a, time_res_s_a)
        int_mid_a = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                          time_res_s_a, n_a)

        time_res_s_b = 2
        self.repo.set_config({'time_res_s': time_res_s_b})
        while self.repo.pending_repo_config_datetime() is not None:
            pass
        data_b = self.get_logging_test_data()
        req_b = self.repo.append_log(data_b,
                                     hasher_config=self.hasher_kwargs_sc)
        dt_b = req_b['datetime']
        n_b = muteacle.interval_number(dt_b, time_res_s_b)
        int_mid_b = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                          time_res_s_b, n_b)

        for i in data_a:
            with self.subTest(intv_mid=int_mid_a, item=i):
                result = self.repo.check_log(int_mid_a, i)
                self.assertTrue(result)

        for i in data_b:
            with self.subTest(intv_mid=int_mid_b, item=i):
                result = self.repo.check_log(int_mid_b, i)
                self.assertTrue(result)

        # TODO: reset time_res_s
        self.repo.set_config(self.repo_kwargs)
        while self.repo.pending_repo_config_datetime() is not None:
            pass
Пример #5
0
 def test_all_time_res_s(self):
     valid_values = [x for x in range(1,86401) if 86400%x == 0]
     combs = combinations(valid_values, 2)
     dt = datetime.utcnow()
     for c in combs:
         # combs should contain 2-element tuples with different valid
         # values of time_res_s
         with self.subTest(time_res_s_a=c[0], time_res_s_b=c[1]):
             dt_ns = interval_next_common_start(dt, c[0], c[1])
             na = interval_number(dt_ns, c[0])
             nb = interval_number(dt_ns, c[1])
             dt_ia = interval_start(
                 dt_ns.year, dt_ns.month, dt_ns.day, na, c[0]
             )
             dt_ib = interval_start(
                 dt_ns.year, dt_ns.month, dt_ns.day, nb, c[1]
             )
             self.assertEqual(dt_ia, dt_ns)
             self.assertEqual(dt_ib, dt_ns)
             self.assertGreater(dt_ns, dt)
Пример #6
0
 def test_interval_number_24_hour_intervals(self):
     time_res_s = 86400
     expected_results = {
         datetime(2020, 12, 25, 0, 0) : 0,
         datetime(2020, 12, 25, 11, 59) : 0,
         datetime(2020, 12, 25, 12, 00) : 0,
         datetime(2020, 12, 25, 23, 59) : 0,
     }
     for k in expected_results.keys():
         with self.subTest(ts=k):
             intvn_out = interval_number(k, time_res_s)
             intvn_expected = expected_results[k]
             self.assertEqual(intvn_out, intvn_expected)
    def test_hash_not_found_interval_mid_trs_upgrade(self):
        """
        Log: check non-existing hash /w mid-interval datetime /w trs upgrade
        Repository must confirm the absence of a hash regardless of
        changes in the time_res_s setting. This test verifies test
        negatives across upgrades of time_res_s (smaller time_res_s
        means a finer time resolution).

        """
        time_res_s_a = 2
        self.repo.set_config({'time_res_s': time_res_s_a})
        while self.repo.pending_repo_config_datetime() is not None:
            pass
        data_a = self.get_logging_test_data()
        req_a = self.repo.append_log(data_a,
                                     hasher_config=self.hasher_kwargs_sc)
        dt_a = req_a['datetime']
        n_a = muteacle.interval_number(dt_a, time_res_s_a)
        int_mid_a = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                          time_res_s_a, n_a)

        time_res_s_b = 1
        self.repo.set_config({'time_res_s': time_res_s_b})
        while self.repo.pending_repo_config_datetime() is not None:
            pass
        data_b = self.get_logging_test_data()
        req_b = self.repo.append_log(data_b,
                                     hasher_config=self.hasher_kwargs_sc)
        dt_b = req_b['datetime']
        n_b = muteacle.interval_number(dt_b, time_res_s_b)
        int_mid_b = muteacle.interval_mid(dt_a.year, dt_a.month, dt_a.day,
                                          time_res_s_b, n_b)

        result_a = self.repo.check_log(int_mid_a, self.item_skipped)
        self.assertFalse(result_a)
        result_b = self.repo.check_log(int_mid_b, self.item_skipped)
        self.assertFalse(result_b)
    def test_hash_not_found_interval_end(self):
        """
        Log: check non-existing hash specifying end-of-interval datetime

        """
        time_res_s = self.repo._config['time_res_s']
        data = self.get_logging_test_data()
        req = self.repo.append_log(data,
                                   hasher_class=self.hasher_class,
                                   hasher_config=self.hasher_kwargs)
        dt = req['datetime']

        n = muteacle.interval_number(dt, time_res_s)
        intv_end = muteacle.interval_end(dt.year, dt.month, dt.day, time_res_s,
                                         n)

        result = self.repo.check_log(intv_end, self.item_skipped)
        self.assertFalse(result)
Пример #9
0
 def test_interval_number_3_hour_intervals(self):
     time_res_s = 10800
     expected_results = {
         datetime(2020, 12, 25, 0, 0) : 0,
         datetime(2020, 12, 25, 3, 0) : 1,
         datetime(2020, 12, 25, 6, 0) : 2,
         datetime(2020, 12, 25, 9, 0) : 3,
         datetime(2020, 12, 25, 12, 0) : 4,
         datetime(2020, 12, 25, 15, 0) : 5,
         datetime(2020, 12, 25, 18, 0) : 6,
         datetime(2020, 12, 25, 21, 0) : 7,
         datetime(2020, 12, 25, 23, 59, 59) : 7,
     }
     for k in expected_results.keys():
         with self.subTest(ts=k):
             intvn_out = interval_number(k, time_res_s)
             intvn_expected = expected_results[k]
             self.assertEqual(intvn_out, intvn_expected)
    def test_hash_found_interval_start(self):
        """
        Log: check existing hash specifying start-of-interval datetime

        """
        time_res_s = self.repo._config['time_res_s']
        data = self.get_logging_test_data()
        req = self.repo.append_log(data,
                                   hasher_class=self.hasher_class,
                                   hasher_config=self.hasher_kwargs)
        dt = req['datetime']
        n = muteacle.interval_number(dt, time_res_s)
        intv_start = muteacle.interval_start(dt.year, dt.month, dt.day,
                                             time_res_s, n)

        for i in data:
            with self.subTest(intv_start=intv_start, item=i):
                result = self.repo.check_log(intv_start, i)
                self.assertTrue(result)
    def test_get_hashers_interval_end(self):
        """
        Hasher: load hashers specifying datetime at end of interval

        """
        ts = datetime.utcnow().timestamp()
        meta = {'test': 'get_hashers_interval_end', 'ts': ts}
        time_res_s = self.repo._config['time_res_s']

        muteacle.sleep_until_interval_end(time_res_s)
        req = self.repo.new_hasher(config={'meta': meta})
        hasher = req['hasher']
        dt = req['datetime']

        n = muteacle.interval_number(dt, time_res_s)
        dt_end = muteacle.interval_end(dt.year, dt.month, dt.day, time_res_s,
                                       n)
        hashers_loaded = self.repo.get_hashers(dt_end)

        self.assertIn(hasher, hashers_loaded)
Пример #12
0
 def test_interval_number_1_second_intervals(self):
     time_res_s = 1
     expected_results = {
         datetime(2020, 12, 25, 0, 0) : 0,
         datetime(2020, 12, 25, 2, 0) : 7200,
         datetime(2020, 12, 25, 4, 0) : 14400,
         datetime(2020, 12, 25, 6, 0) : 21600,
         datetime(2020, 12, 25, 8, 0) : 28800,
         datetime(2020, 12, 25, 10, 0) : 36000,
         datetime(2020, 12, 25, 12, 0) : 43200,
         datetime(2020, 12, 25, 14, 0) : 50400,
         datetime(2020, 12, 25, 16, 0) : 57600,
         datetime(2020, 12, 25, 18, 0) : 64800,
         datetime(2020, 12, 25, 20, 0) : 72000,
         datetime(2020, 12, 25, 22, 0) : 79200,
         datetime(2020, 12, 25, 23, 59, 59) : 86399,
     }
     for k in expected_results.keys():
         with self.subTest(ts=k):
             intvn_out = interval_number(k, time_res_s)
             intvn_expected = expected_results[k]
             self.assertEqual(intvn_out, intvn_expected)