Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgraded shell, fixed session timeout message #144

Merged
merged 3 commits into from Jun 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 6 additions & 2 deletions docs/intro/more_on_testing.rst
Expand Up @@ -21,8 +21,9 @@ Using the shell:
resource1 = ResourceClass.lock(skip_init=True, name='resource_name')
resource2 = ResourceClass.lock(name='resource_name', config='config.json')
shared_data['resource'] = resource1
run_block(ResourceBlock, parameter=5)
run_block(ResourceBlock.params(parameter=6), resource=resource2)
run_test(ResourceBlock, parameter=5)
run_test(ResourceBlock.params(parameter=6), resource=resource2)
run_test(SomeTestCase, debug=True)

Python 2.7.15 (default, Jun 27 2018, 13:05:28)
Type "copyright", "credits" or "license" for more information.
Expand All @@ -33,6 +34,9 @@ Using the shell:
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.

Importing resources:
Calculator

In [1]: calc = Calculator.lock()
06:08:34 : Requesting resources from resource manager
06:08:34 : Locked resources [Calculator(CalculatorData('calc'))]
Expand Down
2 changes: 1 addition & 1 deletion src/rotest/api/resource_control/lock_resources.py
Expand Up @@ -148,7 +148,7 @@ def post(self, request, sessions, *args, **kwargs):
session = sessions[request.model.token]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token provided!")

username = get_username(request)
descriptors = request.model.descriptors
Expand Down
2 changes: 1 addition & 1 deletion src/rotest/api/resource_control/release_resources.py
Expand Up @@ -91,7 +91,7 @@ def post(self, request, sessions, *args, **kwargs):
session = sessions[request.model.token]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token provided!")

errors = {}
username = get_username(request)
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/add_test_result.py
Expand Up @@ -45,7 +45,8 @@ def post(self, request, sessions, *args, **kwargs):
session_data.all_tests[request.model.test_details.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

test_data.update_result(request.model.result.result_code,
request.model.result.info)
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/should_skip.py
Expand Up @@ -46,7 +46,8 @@ def get(self, request, sessions, *args, **kwargs):
test_data = session_data.all_tests[request.model.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

run_data = session_data.run_data

Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/start_composite.py
Expand Up @@ -41,7 +41,8 @@ def post(self, request, sessions, *args, **kwargs):
test_data = session_data.all_tests[request.model.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

test_data.start()
test_data.save()
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/start_test.py
Expand Up @@ -41,7 +41,8 @@ def post(self, request, sessions, *args, **kwargs):
test_data = session_data.all_tests[request.model.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

test_data.start()
test_data.save()
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/stop_composite.py
Expand Up @@ -41,7 +41,8 @@ def post(self, request, sessions, *args, **kwargs):
test_data = session_data.all_tests[request.model.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

has_succeeded = all(sub_test.success for sub_test in test_data)
test_data.success = has_succeeded
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/stop_test.py
Expand Up @@ -41,7 +41,8 @@ def post(self, request, sessions, *args, **kwargs):
test_data = session_data.all_tests[request.model.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

test_data.end()
test_data.save()
Expand Down
3 changes: 2 additions & 1 deletion src/rotest/api/test_control/update_resources.py
Expand Up @@ -45,7 +45,8 @@ def post(self, request, sessions, *args, **kwargs):
session_data.all_tests[request.model.test_details.test_id]

except KeyError:
raise BadRequest("Invalid token/test_id provided!")
raise BadRequest("Invalid token/test_id provided "
"(Test timed out?)")

test_data.resources.clear()

Expand Down
56 changes: 44 additions & 12 deletions src/rotest/management/utils/shell.py
Expand Up @@ -8,21 +8,23 @@
import IPython
from attrdict import AttrDict
from future.builtins import object
from rotest.core.suite import TestSuite
from rotest.core.result.result import Result
from rotest.common.config import SHELL_STARTUP_COMMANDS
from rotest.management.base_resource import BaseResource
from rotest.core.flow_component import AbstractFlowComponent
from rotest.management.client.manager import ClientResourceManager
from rotest.core.runner import parse_config_file, DEFAULT_CONFIG_PATH
from rotest.core.result.handlers.stream.log_handler import LogDebugHandler


# Mock tests result object for running blocks
blocks_result = Result(stream=None, descriptions=None,
result_object = Result(stream=None, descriptions=None,
outputs=[], main_test=None)


# Mock tests configuration for running blocks
blocks_config = AttrDict(parse_config_file(DEFAULT_CONFIG_PATH))
default_config = AttrDict(parse_config_file(DEFAULT_CONFIG_PATH))


# Container for data shared between blocks
Expand All @@ -31,7 +33,7 @@

ENABLE_DEBUG = False
IMPORT_BLOCK_UTILS = \
"from rotest.management.utils.shell import shared_data, run_block"
"from rotest.management.utils.shell import shared_data, run_test"
IMPORT_RESOURCE_LOADER = \
"from rotest.management.utils.resources_discoverer import get_resources"

Expand Down Expand Up @@ -65,11 +67,12 @@ def request_resources(self, resources_to_request, *args, **kwargs):
for name in request_names})


def run_block(block_class, **kwargs):
def _run_block(block_class, debug=ENABLE_DEBUG, **kwargs):
"""Run a block of the given class, passing extra parameters as arguments.

Args:
block_class (type): class inheriting from AbstractFlowComponent.
debug (bool): whether to run the test in debug mode or not.
kwargs (dict): additional arguments that will be passed as parameters
to the block (overriding shared data).
"""
Expand All @@ -79,38 +82,67 @@ def run_block(block_class, **kwargs):
parent = ShellMockFlow()
block_class = block_class.params(**shared_kwargs)

block = block_class(config=blocks_config,
block = block_class(config=default_config,
parent=parent,
enable_debug=ENABLE_DEBUG,
enable_debug=debug,
resource_manager=BaseResource._SHELL_CLIENT,
is_main=False)

parent.work_dir = block.work_dir
block.validate_inputs()
block.run(blocks_result)
block.run(result_object)


def run_test(test_class, debug=ENABLE_DEBUG, **kwargs):
"""Run a test of the given class, passing extra parameters as arguments.

Args:
test_class (type): class inheriting from AbstractTest.
debug (bool): whether to run the test in debug mode or not.
kwargs (dict): additional arguments that will be passed as parameters
if the test is a block or flow (overriding shared data).
"""
if issubclass(test_class, AbstractFlowComponent):
return _run_block(test_class, debug=debug, **kwargs)

if not test_class.IS_COMPLEX:
class AlmightySuite(TestSuite):
components = [test_class]

test_class = AlmightySuite

test = test_class(config=default_config,
enable_debug=debug,
resource_manager=BaseResource._SHELL_CLIENT)

test.run(result_object)


def main():
django.setup()

print("Creating client")
BaseResource._SHELL_CLIENT = ClientResourceManager()
BaseResource._SHELL_CLIENT.connect()
LogDebugHandler(None, sys.stdout, None) # Activate log to screen

print("""Done! You can now lock resources and run tests, e.g.
resource1 = ResourceClass.lock(skip_init=True, name='resource_name')
resource2 = ResourceClass.lock(name='resource_name', config='config.json')
shared_data['resource'] = resource1
run_block(ResourceBlock, parameter=5)
run_block(ResourceBlock.params(parameter=6), resource=resource2)
run_test(ResourceBlock, parameter=5)
run_test(ResourceBlock.params(parameter=6), resource=resource2)
run_test(SomeTestCase, debug=True)
""")

startup_commands = [IMPORT_BLOCK_UTILS, IMPORT_RESOURCE_LOADER]
startup_commands.append("globals().update(get_resources())")
startup_commands.append("imported_resources = get_resources();"
"print('Importing resources:'); "
"print(', '.join(imported_resources.keys()));"
"globals().update(imported_resources)")
startup_commands.extend(SHELL_STARTUP_COMMANDS)
try:
IPython.start_ipython(["-i", "-c", ";".join(startup_commands)])
IPython.start_ipython(["-i", "--no-banner",
"-c", ";".join(startup_commands)])

finally:
print("Releasing locked resources...")
Expand Down