# this doctest contains tests for miscellaneous features of the RPC interface
# that would clutter the main rpc_test

# setup
>>> from autotest_lib.frontend.afe import rpc_interface

>>> rpc_interface.add_profiler(name='oprofile')
1
>>> rpc_interface.add_profiler(name='iostat')
2

# profiler support in control file generation
>>> cf_info = rpc_interface.generate_control_file(
...     client_control_file='print "Hi"\n',
...     profilers=['oprofile', 'iostat'])
>>> print cf_info['control_file']
def step_init():
    job.next_step('step0')
    job.next_step('step1')
    job.next_step('step2')
    job.next_step('step3')
    job.next_step('step4')
<BLANKLINE>
def step0():
    job.profilers.add('oprofile')
<BLANKLINE>
def step1():
    job.profilers.add('iostat')
<BLANKLINE>
def step2():
    print "Hi"
<BLANKLINE>
    return locals()
<BLANKLINE>
def step3():
    job.profilers.delete('oprofile')
<BLANKLINE>
def step4():
    job.profilers.delete('iostat')

# profile_only=False support in control file generation
>>> cf_info = rpc_interface.generate_control_file(
...     client_control_file='print "Hi"\n',
...     profilers=['oprofile'],
...     profile_only=False)
>>> print cf_info['control_file']
def step_init():
    job.next_step('step0')
    job.next_step('step1')
    job.next_step('step2')
    job.next_step('step3')
<BLANKLINE>
def step0():
    job.default_profile_only = False
<BLANKLINE>
def step1():
    job.profilers.add('oprofile')
<BLANKLINE>
def step2():
    print "Hi"
<BLANKLINE>
    return locals()
<BLANKLINE>
def step3():
    job.profilers.delete('oprofile')

# profile_only=True support in control file generation
>>> cf_info = rpc_interface.generate_control_file(
...     client_control_file='print "Hi"\n',
...     profilers=['iostat'],
...     profile_only=True)
>>> print cf_info['control_file']
def step_init():
    job.next_step('step0')
    job.next_step('step1')
    job.next_step('step2')
    job.next_step('step3')
<BLANKLINE>
def step0():
    job.default_profile_only = True
<BLANKLINE>
def step1():
    job.profilers.add('iostat')
<BLANKLINE>
def step2():
    print "Hi"
<BLANKLINE>
    return locals()
<BLANKLINE>
def step3():
    job.profilers.delete('iostat')

# test that multiline quoted strings are not indented
>>> import common
>>> from autotest_lib.frontend.afe import test, control_file
>>> import os
>>> control_path = os.path.join(os.path.dirname(test.__file__),
...                             'doctests', 'test.control.3')
>>> control_path = os.path.abspath(control_path)
>>> class FakeTest(object):
...   path = control_path
...
>>> print control_file.generate_control([FakeTest()], is_server=True) #doctest: +NORMALIZE_WHITESPACE
def step_init():
    step0()
def step0():
    client_code = """
some content\"""quoted content\"""
'''other quoted content\"""'''
\\"""
    client_code2 = '''
some content\'''quoted content\'''
"""other quoted content\'''"""
\\'''
    job.run_test('testname')
step_init()
