Exemple #1
0
def test_trace(tmp_path):
    call_graph = CallGraph()
    setup = Setup()
    trace_controller = TraceController()

    with create_test_binary(tmp_path) as app:
        setup.initialize_binary(app)
        setup.setup_function_to_trace(app, 'func1')
        setup.setup_function_to_trace(app, 'func2')
        setup.setup_function_to_trace(app, 'func3')
        setup.add_parameter(app, 'func1', '1', '%s')
        setup.add_parameter(app, 'func1', '2', '%s')
        setup.add_parameter(app, 'func2', '1', '%d')

        trace_controller.start_trace(setup.generate_bcc_args(),
                                     call_graph)  # start monitoring
        time.sleep(5)  # BCC trace needs a bit of time to setup
        subprocess.run(app)  # run monitored application
        trace_controller.stop_trace()  # stop

    edges = convert_edges_to_cytoscape_format(call_graph.get_nodes(),
                                              call_graph.get_edges())
    nodes = convert_nodes_to_cytoscape_format(call_graph.get_nodes(),
                                              call_graph.get_edges())
    assert_results(nodes, edges)
    def test_setup_function_to_trace_with_mangled_name(self):
        setup = Setup()
        setup._setup = dummy_setup()

        setup.setup_function_to_trace('app1', 'mangledfunc1')

        expected = {
            'app1': {
                'func1': {
                    'traced': True,
                    'parameters': {},
                    'mangled': 'mangledfunc1'
                },
                'func3': {
                    'traced': False,
                    'parameters': {},
                    'mangled': 'mangledfunc3'
                }
            },
            'app2': {
                'func2': {
                    'traced': False,
                    'parameters': {},
                    'mangled': 'mangledfunc2'
                },
            }
        }
        self.assertEqual(setup._setup, expected)
    def test_remove_function_from_trace_with_mangled_name(self):
        setup = Setup()
        setup._setup = dummy_setup()

        setup.setup_function_to_trace('app1', 'func1')
        setup.remove_function_from_trace('app1', 'mangledfunc1')

        self.assertEqual(setup._setup, dummy_setup())
    def test_remove_function_from_trace_with_mangled_name(self, get_offset_for_function):
        setup = Setup()
        setup._setup = dummy_setup()

        setup.setup_function_to_trace('app1', 'func1')
        setup.remove_function_from_trace('app1', 'mangledfunc1')

        expected_setup = dummy_setup()
        expected_setup['app1']['func1']['offset'] = 8

        self.assertEqual(setup._setup, expected_setup)
    def test_setup_function_to_trace_with_demangled_name(self, get_offset_for_function):
        setup = Setup()
        setup._setup = dummy_setup()

        setup.setup_function_to_trace('app1', 'func1')

        expected = {
            'app1': {
                'func1': {'traced': True, 'parameters': {}, 'mangled': 'mangledfunc1', 'offset': 8},
                'func3': {'traced': False, 'parameters': {}, 'mangled': 'mangledfunc3', 'offset': 0}
            },
            'app2': {
                'func2': {'traced': False, 'parameters': {}, 'mangled': 'mangledfunc2', 'offset': 0}
            }
        }
        self.assertEqual(setup._setup, expected)
 def test_setup_function_to_trace_raises_error_if_function_not_exists(self):
     setup = Setup()
     setup._setup = dummy_setup()
     with self.assertRaises(FunctionNotInBinaryError):
         setup.setup_function_to_trace('app1', 'func4')