blob: 804b3c20ede7b605bb4f91c22b59ae719bc05cfe [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import base64
import hashlib
import sys
import unittest
import make_ct_known_logs_list
def b64e(x):
return base64.encodestring(x)
class FormattingTest(unittest.TestCase):
def testSplitAndHexifyBinData(self):
bin_data = ''.join([chr(i) for i in range(32,60)])
expected_encoded_array = [
('"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a'
'\\x2b\\x2c\\x2d\\x2e\\x2f\\x30"'),
'"\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b"']
self.assertEqual(
make_ct_known_logs_list._split_and_hexify_binary_data(
bin_data),
expected_encoded_array)
# This data should fit in exactly one line - 17 bytes.
short_bin_data = ''.join([chr(i) for i in range(32, 49)])
expected_short_array = [
('"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a'
'\\x2b\\x2c\\x2d\\x2e\\x2f\\x30"')]
self.assertEqual(
make_ct_known_logs_list._split_and_hexify_binary_data(
short_bin_data),
expected_short_array)
# This data should fit exactly in two lines - 34 bytes.
two_line_data = ''.join([chr(i) for i in range(32, 66)])
expected_two_line_data_array = [
('"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a'
'\\x2b\\x2c\\x2d\\x2e\\x2f\\x30"'),
('"\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b'
'\\x3c\\x3d\\x3e\\x3f\\x40\\x41"')]
self.assertEqual(
make_ct_known_logs_list._split_and_hexify_binary_data(
short_bin_data),
expected_short_array)
def testGetLogIDsArray(self):
log_ids = ["def", "abc", "ghi"]
expected_log_ids_code = [
"// The list is sorted.\n",
"const char kTestIDs[][4] = {\n",
' "\\x61\\x62\\x63",\n',
' "\\x64\\x65\\x66",\n',
' "\\x67\\x68\\x69"',
"};\n\n"]
self.assertEqual(
make_ct_known_logs_list._get_log_ids_array(
log_ids, "kTestIDs"),
expected_log_ids_code)
def testToLogInfoStruct(self):
log = {"key": "YWJj",
"description": "Test Description",
"url": "ct.example.com",
"dns_api_endpoint": "dns.ct.example.com"}
expected_loginfo = (
' {"\\x61\\x62\\x63",\n 3,\n "Test Description",\n'
' "https://ct.example.com",\n "dns.ct.example.com"}')
self.assertEqual(
make_ct_known_logs_list._to_loginfo_struct(log),
expected_loginfo)
class OperatorIDHandlingTest(unittest.TestCase):
def testFindingGoogleOperatorID(self):
ops_list = {"operators": [
{"id": 0, "name": "First"},
{"id": 1, "name": "Second"}]}
self.assertRaises(
RuntimeError,
make_ct_known_logs_list._find_google_operator_id,
ops_list)
ops_list["operators"].append({"id": 2, "name": "Google"})
self.assertEqual(
make_ct_known_logs_list._find_google_operator_id(ops_list),
2)
ops_list["operators"].append({"id": 3, "name": "Google"})
self.assertRaises(
RuntimeError,
make_ct_known_logs_list._find_google_operator_id,
ops_list)
def testCollectingLogIDsByOperator(self):
logs = [
{"operated_by": (1,), "key": b64e('a')},
{"operated_by": (2,), "key": b64e('b')},
{"operated_by": (3,), "key": b64e('c')},
{"operated_by": (1,), "key": b64e('d')}
]
log_ids = make_ct_known_logs_list._get_log_ids_for_operator(logs, 1)
self.assertEqual(2, len(log_ids))
self.assertItemsEqual(
[hashlib.sha256(t).digest() for t in ('a', 'd')],
log_ids)
class DisqualifiedLogsHandlingTest(unittest.TestCase):
def testCorrectlyIdentifiesDisqualifiedLog(self):
self.assertTrue(
make_ct_known_logs_list._is_log_disqualified(
{"disqualified_at" : 12345}))
self.assertFalse(
make_ct_known_logs_list._is_log_disqualified(
{"name" : "example"}))
def testTranslatingToDisqualifiedLogDefinition(self):
log = {"key": "YWJj",
"description": "Test Description",
"url": "ct.example.com",
"dns_api_endpoint": "dns.ct.example.com",
"disqualified_at": 1464566400}
expected_disqualified_log_info = (
' {"\\xba\\x78\\x16\\xbf\\x8f\\x01\\xcf\\xea\\x41\\x41\\x40'
'\\xde\\x5d\\xae\\x22\\x23\\xb0"\n "\\x03\\x61\\xa3\\x96\\x17'
'\\x7a\\x9c\\xb4\\x10\\xff\\x61\\xf2\\x00\\x15\\xad",\n {"\\x61'
'\\x62\\x63",\n 3,\n "Test Description",\n '
'"https://ct.example.com",\n "dns.ct.example.com"},\n '
'base::TimeDelta::FromSeconds(1464566400)}')
self.assertEqual(
make_ct_known_logs_list._to_disqualified_loginfo_struct(log),
expected_disqualified_log_info)
def testSortingAndFilteringDisqualifiedLogs(self):
logs = [
{"disqualified_at": 1, "key": b64e('a')},
{"key": b64e('b')},
{"disqualified_at": 3, "key": b64e('c')},
{"disqualified_at": 2, "key": b64e('d')},
{"key": b64e('e')}
]
disqualified_logs = make_ct_known_logs_list._sorted_disqualified_logs(
logs)
self.assertEqual(3, len(disqualified_logs))
self.assertEqual(b64e('d'), disqualified_logs[0]["key"])
self.assertEqual(b64e('c'), disqualified_logs[1]["key"])
self.assertEqual(b64e('a'), disqualified_logs[2]["key"])
if __name__ == '__main__':
unittest.main()