Skip to content

Commit

Permalink
Merge pull request #862 from GeorgePantelakis/master
Browse files Browse the repository at this point in the history
Integrating code for minerva analysis
  • Loading branch information
tomato42 committed Sep 19, 2023
2 parents c8651f4 + d7b38ca commit 636427e
Show file tree
Hide file tree
Showing 2 changed files with 651 additions and 14 deletions.
271 changes: 263 additions & 8 deletions tests/test_tlsfuzzer_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ def test_command_line(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, None,
None, None, None)
None, None, None, False, False)

def test_call_with_delay_and_CR(self):
output = "/tmp"
Expand All @@ -726,7 +726,7 @@ def test_call_with_delay_and_CR(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, None,
None, 3.5, '\n')
None, 3.5, '\n', False, False)

def test_call_with_workers(self):
output = "/tmp"
Expand All @@ -740,7 +740,7 @@ def test_call_with_workers(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, None,
200, None, None)
200, None, None, False, False)

def test_call_with_verbose(self):
output = "/tmp"
Expand All @@ -754,7 +754,7 @@ def test_call_with_verbose(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, True, None, None,
None, None, None)
None, None, None, False, False)

def test_call_with_multithreaded_plots(self):
output = "/tmp"
Expand All @@ -768,7 +768,7 @@ def test_call_with_multithreaded_plots(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, True, False, None, None,
None, None, None)
None, None, None, False, False)

def test_call_with_no_plots(self):
output = "/tmp"
Expand All @@ -783,7 +783,7 @@ def test_call_with_no_plots(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, False, False, False, False, False, None, None,
None, None, None)
None, None, None, False, False)

def test_call_with_frequency(self):
output = "/tmp"
Expand All @@ -797,7 +797,7 @@ def test_call_with_frequency(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, 10*1e6, None,
None, None, None)
None, None, None, False, False)

def test_call_with_alpha(self):
output = "/tmp"
Expand All @@ -811,7 +811,39 @@ def test_call_with_alpha(self):
mock_report.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, 1e-3,
None, None, None)
None, None, None, False, False)

def test_call_with_bit_size_measurements(self):
output = "/tmp"
args = ["analysis.py", "-o", output, "--bit-size"]
mock_init = mock.Mock()
mock_init.return_value = None
with mock.patch(
'tlsfuzzer.analysis.Analysis.analyze_bit_sizes'
) as mock_analyze_bit_sizes:
with mock.patch('tlsfuzzer.analysis.Analysis.__init__', mock_init):
with mock.patch("sys.argv", args):
main()
mock_analyze_bit_sizes.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, None,
None, None, None, True, False)

def test_call_with_skip_sanity(self):
output = "/tmp"
args = ["analysis.py", "-o", output, "--bit-size", "--skip-sanity"]
mock_init = mock.Mock()
mock_init.return_value = None
with mock.patch(
'tlsfuzzer.analysis.Analysis.analyze_bit_sizes'
) as mock_analyze_bit_sizes:
with mock.patch('tlsfuzzer.analysis.Analysis.__init__', mock_init):
with mock.patch("sys.argv", args):
main()
mock_analyze_bit_sizes.assert_called_once()
mock_init.assert_called_once_with(
output, True, True, True, False, False, None, None,
None, None, None, True, True)

def test_help(self):
args = ["analysis.py", "--help"]
Expand Down Expand Up @@ -1006,3 +1038,226 @@ def test__convert_to_binary_refresh_verbose(self, print_mock, isfile_mock,
a.clock_frequency = None

a._convert_to_binary()

@unittest.skipIf(failed_import,
"Could not import analysis. Skipping related tests.")
class TestMeasurementAnalysis(unittest.TestCase):
def setUp(self):
self.analysis = Analysis("/tmp", bit_size_analysis=True)

@mock.patch("tlsfuzzer.analysis.Analysis.conf_plot_for_all_k")
@mock.patch("tlsfuzzer.analysis.Analysis.graph_worst_pair")
@mock.patch("tlsfuzzer.analysis.Analysis.diff_scatter_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.diff_ecdf_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.conf_interval_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.wilcoxon_test")
@mock.patch("tlsfuzzer.analysis.Analysis.rel_t_test")
@mock.patch("tlsfuzzer.analysis.Analysis.load_data")
@mock.patch("tlsfuzzer.analysis.Analysis.create_k_specific_dirs")
@mock.patch("tlsfuzzer.analysis.shutil.rmtree")
@mock.patch("builtins.open")
def test_bit_size_measurement_analysis_main(self, open_mock, rmtree_mock,
dir_creation_mock, load_data_mock, rel_t_test_mock,
wilcoxon_test_mock, interval_plot_mock, ecdf_plot_mock,
scatter_plot_mock, worst_pair_mock, conf_plot_mock):

def file_selector(*args, **kwargs):
file_name = args[0]
try:
mode = args[1]
except IndexError:
mode = "r"

if "w" in mode:
return mock.mock_open()(file_name, mode)

if "timing.csv" in file_name:
k_size = file_name.split("/")[-2]
return mock.mock_open(
read_data="256,{0}\n0.5,0.4\n0.5,0.5\n0.4,0.5".format(k_size)
)(file_name, mode)

print("here")
return mock.mock_open(
read_data="0,256,3\n0,255,102\n0,254,103\n1,256,4\n1,254,104\n1,253,105"
)(file_name, mode)

open_mock.side_effect = file_selector
dir_creation_mock.return_value = [256, 255, 254, 253]
rel_t_test_mock.return_value = {(0, 1): 0.5}
wilcoxon_test_mock.return_value = {(0, 1): 0.5}

class dotDict(dict):
__getattr__ = dict.__getitem__

binomtest_result = {"statistic": 0.5, "pvalue": 0.5}
binomtest_mock = mock.Mock()
binomtest_mock.return_value = dotDict(binomtest_result)

try:
with mock.patch(
"tlsfuzzer.analysis.stats.binomtest", binomtest_mock
):
self.analysis.analyze_bit_sizes()
except AttributeError:
with mock.patch(
"tlsfuzzer.analysis.stats.binom_test", binomtest_mock
):
self.analysis.analyze_bit_sizes()

binomtest_mock.assert_called()
rel_t_test_mock.assert_called()
wilcoxon_test_mock.assert_called()

@mock.patch("tlsfuzzer.analysis.Analysis.calc_diff_conf_int")
@mock.patch("tlsfuzzer.analysis.Analysis.conf_plot_for_all_k")
@mock.patch("tlsfuzzer.analysis.Analysis.graph_worst_pair")
@mock.patch("tlsfuzzer.analysis.Analysis.diff_scatter_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.diff_ecdf_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.conf_interval_plot")
@mock.patch("tlsfuzzer.analysis.Analysis.wilcoxon_test")
@mock.patch("tlsfuzzer.analysis.Analysis.rel_t_test")
@mock.patch("tlsfuzzer.analysis.Analysis.load_data")
@mock.patch("tlsfuzzer.analysis.Analysis.create_k_specific_dirs")
@mock.patch("tlsfuzzer.analysis.shutil.rmtree")
@mock.patch("builtins.open")
def test_bit_size_measurement_analysis_main_100_samples(self, open_mock,
rmtree_mock, dir_creation_mock, load_data_mock,
rel_t_test_mock, wilcoxon_test_mock, interval_plot_mock,
ecdf_plot_mock, scatter_plot_mock, worst_pair_mock,
conf_plot_mock, calc_diff_conf_mock):

def file_selector(*args, **kwargs):
file_name = args[0]
try:
mode = args[1]
except IndexError:
mode = "r"

if "w" in mode:
return mock.mock_open()(file_name, mode)

if "timing.csv" in file_name:
k_size = file_name.split("/")[-2]
return mock.mock_open(
read_data= \
"256,{0}".format(k_size) +
("\n0.5,0.4\n0.5,0.5\n0.4,0.5" * 20)
)(file_name, mode)

print("here")
return mock.mock_open(
read_data="0,256,3\n0,255,102\n0,254,103\n1,256,4\n1,254,104\n1,253,105"
)(file_name, mode)

open_mock.side_effect = file_selector
dir_creation_mock.return_value = [256, 255, 254, 253]
rel_t_test_mock.return_value = {(0, 1): 0.5}
wilcoxon_test_mock.return_value = {(0, 1): 0.5}
calc_diff_conf_mock.return_value = {
"mean": [0.4, 0.5, 0.6],
"median": [0.4, 0.5, 0.6],
"trim_mean_05": [0.4, 0.5, 0.6],
"trim_mean_25": [0.4, 0.5, 0.6],
"trim_mean_45": [0.4, 0.5, 0.6],
"trimean": [0.4, 0.5, 0.6]
}

class dotDict(dict):
__getattr__ = dict.__getitem__

binomtest_result = {"statistic": 0.5, "pvalue": 0.5}
binomtest_mock = mock.Mock()
binomtest_mock.return_value = dotDict(binomtest_result)

try:
with mock.patch(
"tlsfuzzer.analysis.stats.binomtest", binomtest_mock
):
self.analysis.analyze_bit_sizes()
except AttributeError:
with mock.patch(
"tlsfuzzer.analysis.stats.binom_test", binomtest_mock
):
self.analysis.analyze_bit_sizes()

binomtest_mock.assert_called()
rel_t_test_mock.assert_called()
wilcoxon_test_mock.assert_called()
calc_diff_conf_mock.assert_called()

@mock.patch("tlsfuzzer.analysis.FigureCanvas.print_figure")
@mock.patch("builtins.open")
def test_bit_size_measurement_analysis_conf_plot(self, open_mock,
print_figure_mock):

def file_selector(*args, **kwargs):
file_name = args[0]
try:
mode = args[1]
except IndexError:
mode = "r"

if "w" in mode:
return mock.mock_open()(file_name, mode)

if "bootstrapped" in file_name:
k_size = file_name.split("/")[-2]
return mock.mock_open(
read_data= \
"0,1" + ("\n0.5" * 20)
)(file_name, mode)

return mock.mock_open(
read_data="0,256,3\n0,255,102\n0,254,103\n1,256,4\n1,254,104\n1,253,105"
)(file_name, mode)

open_mock.side_effect = file_selector

self.analysis.conf_plot_for_all_k([256, 255, 254, 253])

print_figure_mock.assert_called()

@mock.patch("tlsfuzzer.analysis.os.makedirs")
@mock.patch("builtins.open")
def test_bit_size_measurement_analysis_create_k_dirs(self, open_mock,
makedirs_mock):

def file_selector(*args, **kwargs):
file_name = args[0]
try:
mode = args[1]
except IndexError:
mode = "r"

if "w" in mode:
return mock.mock_open()(file_name, mode)

return mock.mock_open(
read_data= "0,256,1\n0,255,102\n0,254,103\n0,256,2\n1,256,3\n1,254,104\n1,253,105"
)(file_name, mode)

open_mock.side_effect = file_selector

ret_value = self.analysis.create_k_specific_dirs()
self.assertEqual(ret_value, ['256', '255', '254', '253'])

self.analysis.clock_frequency = 10000000
ret_value = self.analysis.create_k_specific_dirs()
self.assertEqual(ret_value, ['256', '255', '254', '253'])
with mock.patch(
"tlsfuzzer.analysis.Analysis._div_by_freq"
) as div_by_freq_mock:
self.analysis.create_k_specific_dirs()
div_by_freq_mock.assert_called()
self.analysis.clock_frequency = None

self.analysis.skip_sanity = True
ret_value = self.analysis.create_k_specific_dirs()
self.analysis.skip_sanity = False
self.assertEqual(ret_value, ['255', '254', '253'])

with mock.patch("builtins.print"):
self.analysis.verbose = True
ret_value = self.analysis.create_k_specific_dirs()
self.analysis.verbose = False

0 comments on commit 636427e

Please sign in to comment.