コード例 #1
0
def main(argv):
    orbit_testing.WaitForOrbit()
    application = Application(backend='uia').connect(title_re='orbitprofiler')
    orbit_testing.ConnectToGamelet(application)
    orbit_testing.SelectProcess(application, 'hello_')
    orbit_testing.LoadSymbols(application, 'hello_')
    orbit_testing.HookFunction(application, 'DrawFrame')
    orbit_testing.FocusOnCaptureWindow(application)
    orbit_testing.Capture(application, 5)

    main_wnd = application.window(title_re='orbitprofiler', found_index=0)
    # Find 'DrawFrame' in the live tab and create a frame track.
    children = main_wnd.TreeView.children()
    for i in range(len(children)):
        if 'DrawFrame' in children[i].window_text():
            children[i].click_input(button='right')
            main_wnd.child_window(title='Add frame track(s)',
                                  control_type="MenuItem").click_input()

    # Since the frame track is only a visualization and only affects the
    # OpenGL rendered capture window, there is currently no way to verify
    # automatically that the frame track was created correctly.

    main_wnd.CloseButton.click_input()
    logging.info('Closed Orbit.')
コード例 #2
0
ファイル: orbit_add_iterator.py プロジェクト: zeta1999/orbit
def main(argv):
    orbit_testing.WaitForOrbit()
    application = Application(backend='uia').connect(title_re='orbitprofiler')
    orbit_testing.ConnectToGamelet(application)
    orbit_testing.SelectProcess(application, 'hello_')
    orbit_testing.LoadSymbols(application, 'hello_')
    orbit_testing.HookFunction(application, 'DrawFrame')
    orbit_testing.FocusOnCaptureWindow(application)
    orbit_testing.Capture(application, 5)

    main_wnd = application.window(title_re='orbitprofiler', found_index=0)

    # Adding an iterator adds three new buttons and we use this knowledge to
    # verify that an iterator was added correctly. It seems other widgets like
    # the label are not well represented by pywinauto.
    BUTTONS_PER_ITERATOR = 3
    count_all_buttons_before = len(main_wnd.descendants(control_type='Button'))

    # Find 'DrawFrame' in the live tab and add an iterator
    children = main_wnd.TreeView.children()
    for i in range(len(children)):
        if 'DrawFrame' in children[i].window_text():
            children[i].click_input(button='right')
            main_wnd.child_window(title='Add iterator(s)',
                                  control_type="MenuItem").click_input()

    count_all_buttons_after = len(main_wnd.descendants(control_type='Button'))
    if (count_all_buttons_before + BUTTONS_PER_ITERATOR !=
            count_all_buttons_after):
        raise RuntimeError('Iterator not correctly added')

    main_wnd.CloseButton.click_input()
    logging.info('Closed Orbit.')
コード例 #3
0
def main(argv):
    orbit_testing.WaitForOrbit()
    application = Application(backend='uia').connect(title_re='orbitprofiler')
    orbit_testing.ConnectToGamelet(application)
    orbit_testing.SelectProcess(application, 'hello_')
    orbit_testing.LoadSymbols(application, 'hello_')
    orbit_testing.HookFunction(application, 'DrawFrame')
    orbit_testing.FocusOnCaptureWindow(application)
    orbit_testing.Capture(application, 5)

    main_wnd = application.window(title_re='orbitprofiler', found_index=0)

    # Check the output in the live tab. DrawFrames should have been called ~300
    # times (60 Hz * 5 seconds).
    children = main_wnd.TreeView.children()
    for i in range(len(children)):
        if 'DrawFrame' in children[i].window_text():
            num = int(children[i + 1].window_text())
            if num < 30 or num > 3000:
                raise RuntimeError('Wrong number of calls to "DrawFrame": ' +
                                   str(num))
            else:
                logging.info('Verified number of calls to "DrawFrame".')

    main_wnd.CloseButton.click_input()
    logging.info('Closed Orbit.')
コード例 #4
0
def main(argv):
  orbit_testing.WaitForOrbit()
  application = Application(backend='uia').connect(title_re='orbitprofiler')
  orbit_testing.ConnectToGamelet(application)
  orbit_testing.SelectProcess(application, 'hello_')
  orbit_testing.FocusOnCaptureWindow(application)
  orbit_testing.Capture(application, 5);
  
  main_wnd = application.window(title_re='orbitprofiler', found_index=0)
  main_wnd.child_window(title="Top-Down").click_input()
  logging.info('Switched to Top-Down tab')
  
  # Now that the "Top-Down" tab is selected,
  # main_wnd.TreeView is the QTreeView of the top-down view.
  # main_wnd.TreeView.children(control_type='TreeItem') returns
  # every cell in the top-down view, in order by row and then column.
  # It can take a few seconds.
  logging.info('Listing items of the top-down view...')
  tree_items = main_wnd.TreeView.children(control_type='TreeItem')
  TOP_DOWN_ROW_CELL_COUNT = 6
  row_count_before_expansion = len(tree_items) / TOP_DOWN_ROW_CELL_COUNT
  
  if row_count_before_expansion < 3:
    raise RuntimeError('Less than 3 rows in the top-down view')

  if (not tree_items[0].window_text().startswith('hello_') or
      not tree_items[0].window_text().endswith(' (all threads)')):
    raise RuntimeError('First item of the top-down view is not "hello_* (all threads)"')
  logging.info('Verified that first item is "hello_* (all threads)"')

  if ((not tree_items[TOP_DOWN_ROW_CELL_COUNT].window_text().startswith('hello_') and
       not tree_items[TOP_DOWN_ROW_CELL_COUNT].window_text().startswith('Ggp')) or
      not tree_items[TOP_DOWN_ROW_CELL_COUNT].window_text().endswith(']')):
    raise RuntimeError('Second item of the top-down view is not "hello_*]" nor "Ggp*]"')
  logging.info('Verified that second item is "hello_*]" or "Ggp*]"')
  
  tree_items[0].double_click_input()
  logging.info('Expanded the first item')
  
  logging.info('Re-listing items of the top-down view...')
  tree_items = main_wnd.TreeView.children(control_type='TreeItem')
  row_count_after_expansion = len(tree_items) / TOP_DOWN_ROW_CELL_COUNT

  if row_count_after_expansion != row_count_before_expansion + 2:
    raise RuntimeError('First item of the top-down view doesn\'t have exactly two children')
  if (not ((tree_items[TOP_DOWN_ROW_CELL_COUNT].window_text().endswith('clone') and 
            tree_items[2 * TOP_DOWN_ROW_CELL_COUNT].window_text() == '_start') or 
           (tree_items[TOP_DOWN_ROW_CELL_COUNT].window_text() == '_start') and
            tree_items[2 * TOP_DOWN_ROW_CELL_COUNT].window_text().endswith('clone'))):
    raise RuntimeError('Children of the first item of the top-down view '
                       'are not "*clone" and "_start"')
  logging.info('Verified that children of the first item are "*clone" and "_start"')

  main_wnd.CloseButton.click_input()
  logging.info('Closed Orbit.')
コード例 #5
0
ファイル: orbit_bottom_up.py プロジェクト: zeta1999/orbit
def main(argv):
    orbit_testing.WaitForOrbit()
    application = Application(backend='uia').connect(title_re='orbitprofiler')
    orbit_testing.ConnectToGamelet(application)
    orbit_testing.SelectProcess(application, 'hello_')
    orbit_testing.FocusOnCaptureWindow(application)
    orbit_testing.Capture(application, 5)

    main_wnd = application.window(title_re='orbitprofiler', found_index=0)
    main_wnd.child_window(title="Bottom-Up").click_input()
    logging.info('Switched to Bottom-Up tab')

    # Now that the "Bottom-Up" tab is selected,
    # main_wnd.TreeView is the QTreeView of the bottom-up view.
    # main_wnd.TreeView.children(control_type='TreeItem') returns
    # every cell in the bottom-up view, in order by row and then column.
    # It can take a few seconds.
    logging.info('Listing items of the bottom-up view...')
    tree_items = main_wnd.TreeView.children(control_type='TreeItem')
    BOTTOM_UP_ROW_CELL_COUNT = 5
    row_count_before_expansion = len(tree_items) / BOTTOM_UP_ROW_CELL_COUNT

    if row_count_before_expansion < 10:
        raise RuntimeError('Less than 10 rows in the bottom-up view')

    if tree_items[0].window_text() != 'ioctl':
        raise RuntimeError('First item of the bottom-up view is not "ioctl"')
    logging.info('Verified that first item is "ioctl"')

    tree_items[0].double_click_input()
    logging.info('Expanded the first item')

    logging.info('Re-listing items of the bottom-up view...')
    tree_items = main_wnd.TreeView.children(control_type='TreeItem')
    row_count_after_expansion = len(tree_items) / BOTTOM_UP_ROW_CELL_COUNT
    if row_count_after_expansion <= row_count_before_expansion:
        raise RuntimeError('First item of the bottom-up view has no children')

    if not tree_items[BOTTOM_UP_ROW_CELL_COUNT].window_text().startswith(
            'drm'):
        raise RuntimeError('First child of the first item ("ioctl") '
                           'of the bottom-up view doesn\'t start with "drm"')
    logging.info(
        'Verified that first child of the first item starts with "drm"')

    main_wnd.CloseButton.click_input()
    logging.info('Closed Orbit.')
コード例 #6
0
ファイル: orbit_load_presets.py プロジェクト: zeta1999/orbit
def main(argv):
    orbit_testing.WaitForOrbit()
    application = Application(backend='uia').connect(title_re='orbitprofiler')
    orbit_testing.ConnectToGamelet(application)
    orbit_testing.SelectProcess(application, 'hello_')

    # Load the presets.
    main_wnd = application.window(title_re='orbitprofiler', found_index=0)
    main_wnd.PresetsTreeView2.draw_frame_in_hello_ggp_1_52.click_input(
        button='right')
    main_wnd.LoadPreset.click_input()
    logging.info('Loaded Preset DrawFrame')
    main_wnd.PresetsTreeView2.ggp_issue_frame_token_in_hello_ggp_1_52.click_input(
        button='right')
    main_wnd.LoadPreset.click_input()
    logging.info('Loaded Preset GgpIssueFrameToken.')

    # Check that the check mark in front of the hooked function is there.
    # TreeView is the panel that contains all the function names.
    main_wnd.FunctionsTabItem.click_input()
    children = main_wnd.TreeView.children()
    found_draw_frame = False
    found_ggp_issue_frame_token = False
    for i in range(len(children)):
        if 'DrawFrame' in children[i].window_text():
            found_draw_frame = True
            if u'\u2713' not in children[i - 1].window_text():
                raise RuntimeError(
                    'Function DrawFrame was not hooked by appling preset.' +
                    str(children[i - 1].window_text()))
            else:
                logging.info('Verified DrawFrame was hooked.')
        if 'GgpIssueFrameToken' in children[i].window_text():
            found_ggp_issue_frame_token = True
            if u'\u2713' not in children[i - 1].window_text():
                raise RuntimeError(
                    'Function GgpIssueFrameToken was not hooked by appling preset.'
                )
            else:
                logging.info('Verified GgpIssueFrameToken was hooked.')

    if not found_draw_frame:
        raise RuntimeError('Function DrawFrame was not found in the binary.')
    if not found_ggp_issue_frame_token:
        raise RuntimeError(
            'Function GgpIssueFrameToken was not found in the binary.')

    orbit_testing.FocusOnCaptureWindow(application)
    orbit_testing.Capture(application, 5)

    # Check the output in the live tab. DrawFrames should have been called ~300
    # times (60 Hz * 5 seconds).
    children = main_wnd.TreeView.children()
    found_draw_frame = False
    found_ggp_issue_frame_token = False
    for i in range(len(children)):
        if 'DrawFrame' in children[i].window_text():
            found_draw_frame = True
            num = int(children[i + 1].window_text())
            if num < 30 or num > 3000:
                raise RuntimeError('Wrong number of calls to "DrawFrame": ' +
                                   str(num))
            else:
                logging.info('Verified number of calls to "DrawFrame".')
        if 'GgpIssueFrameToken' in children[i].window_text():
            found_ggp_issue_frame_token = True
            num = int(children[i + 1].window_text())
            if num < 30 or num > 3000:
                raise RuntimeError(
                    'Wrong number of calls to "GgpIssueFrameToken": ' +
                    str(num))
            else:
                logging.info(
                    'Verified number of calls to "GgpIssueFrameToken".')

    if not found_draw_frame:
        raise RuntimeError('Function DrawFrame was not found in the binary.')
    if not found_ggp_issue_frame_token:
        raise RuntimeError(
            'Function GgpIssueFrameToken was not found in the binary.')

    main_wnd.CloseButton.click_input()
    logging.info('Closed Orbit.')