GUI acceptance tests using environment deployed from packages.

Build: #763 failed Child of ODSRV-OPRPM-1519

Test results

  • 157 tests in total
  • 45 tests failed
  • 4 failures are new
  • 1 test was fixed
  • 3 tests were quarantined / skipped
  • 257 minutes taken in total.
New test failures 4
Status Test View job Duration
Collapse Failed test_onepanel_basic test_user_removes_newly_created_storage[1oz_1op_deployed-browser2-new_storage6]
Chrome onepanel basic tests 2 mins
RuntimeError: no  item found in Onezone Login page
web_elem_root = <selenium.webdriver.chrome.webdriver.WebDriver (session="3058cdc5176cf73f0c74083e97252204")>
css_sel = 'input[placeholder="Username"]'
err_msg = 'no  item found in Onezone Login page'

    def find_web_elem(web_elem_root, css_sel, err_msg):
        try:
            _scroll_to_css_sel(web_elem_root, css_sel)
(307 more lines...)
Collapse Failed test_onepanel_basic test_user_modifies_newly_created_storage[1oz_1op_deployed-browser2-new_storage4]
Chrome onepanel basic tests 1 min
RuntimeError: no  item found in Onezone Login page
web_elem_root = <selenium.webdriver.chrome.webdriver.WebDriver (session="5c811ec5dd3eb079902ffef0f372525b")>
css_sel = 'input[placeholder="Username"]'
err_msg = 'no  item found in Onezone Login page'

    def find_web_elem(web_elem_root, css_sel, err_msg):
        try:
            _scroll_to_css_sel(web_elem_root, css_sel)
(307 more lines...)
Collapse Failed test_onepanel_basic test_user_successfully_change_passphrase_in_emergency_passphrase_view[1oz_1op_deployed]
Chrome onepanel basic tests 1 min
AttributeError: admin already in use
request = <FixtureRequest for <Function 'test_user_successfully_change_passphrase_in_emergency_passphrase_view[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(57 more lines...)
Collapse Failed test_onezone_harvesters_basic test_user_successfully_creates_index_in_harvester[1oz_1op_elasticsearch]
Chrome onezone harvesters basic tests 1 min
RuntimeError: no "harvester5" found in DiscoveryPage in Onezone page
request = <FixtureRequest for <Function 'test_user_successfully_creates_index_in_harvester[1oz_1op_elasticsearch]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(37 more lines...)
Existing test failures 41
Status Test Failing since View job Duration
RuntimeError: no  with "Toggle home provider" text found in ProviderPopover in modals
request = <FixtureRequest for <Function 'test_user_sees_that_home_space_of_provider_should_have_cloud_with_home_icon[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(34 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_add_group_as_its_subgroup[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_using_group_invitation_token[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_view_group_after_leaving_it[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_single_user_adds_subgroup[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_single_user_adds_subgroup[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_child_group_is_removed_from_children_list[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_child_group_is_removed[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_leaves_group[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_renames_group_with_others_users[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_to_space_using_incorrect_token[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_joins_group_using_invitation_token[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_using_group_invitation_token[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_group_owner_leaves_group[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_adds_subgroup[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_create_unnamed_group_using_button_to_confirm_group_name[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_joins_group_using_invitation_token[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_view_group_he_does_not_belong_to[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_removes_group[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_creates_group[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_sees_that_after_unsupporting_space_number_displayed_in_space_counter_for_given_provider_decreases[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_parent_group_is_removed[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_generates_user_invitation_token[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_he_already_belongs_to[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_using_incorrect_token[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_to_space_using_incorrect_token[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_using_incorrect_token[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_view_group_he_does_not_belong_to[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_join_group_he_already_belongs_to[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_renames_group[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_renames_group_with_others_users[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_add_group_as_its_subgroup[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_creates_group[1oz_1op_deployed-enter]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_removes_group_with_others_users[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_renames_group[1oz_1op_deployed-button]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_is_removed_from_group[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_leaves_group_with_others_users[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_fails_to_create_unnamed_group_using_enter_to_confirm_group_name[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
tests.utils.http_exceptions.HTTPMethodNotAllowed: [405] Method Not Allowed:
request = <FixtureRequest for <Function 'test_user_generates_group_invitation_token[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(45 more lines...)
RuntimeError: no  item found in popups
web_elem_root = <selenium.webdriver.chrome.webdriver.WebDriver (session="4229ff9bc646df05191723e3b4bff7c9")>
css_sel = '.webui-popover.in', err_msg = 'no  item found in popups'

    def find_web_elem(web_elem_root, css_sel, err_msg):
        try:
            _scroll_to_css_sel(web_elem_root, css_sel)
>           item = web_elem_root.find_element_by_css_selector(css_sel)
(277 more lines...)
RuntimeError: no "Toggle default space" found in Member menu popup
request = <FixtureRequest for <Function 'test_user_successfully_unsets_space_as_home_space[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(37 more lines...)
Fixed tests 1
Status Test Failing since View job Duration
Successful test_onepanel_basic test_user_removes_newly_created_storage[1oz_1op_deployed-browser1-new_storage5]
Failing since build #762 (Rebuilt by Darin Nikolow) Chrome onepanel basic tests 2 mins
Quarantined tests 3
Status Test Failing since Quarantined by View job Duration
Collapse Failed test_onezone_basic test_user_successfully_copies_access_token[1oz_1op_deployed]
Failing since build #677 (Rebuilt by Łukasz Opioła) Not quarantined Chrome onezone basic tests 1 min
AssertionError: Displayed number of tokens in ACCESS TOKENS oz panel: 0 instead of excepted: 1
request = <FixtureRequest for <Function 'test_user_successfully_copies_access_token[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(31 more lines...)
Collapse Failed test_onezone_basic test_user_successfully_creates_access_token[1oz_1op_deployed]
Failing since build #677 (Rebuilt by Łukasz Opioła) Not quarantined Chrome onezone basic tests 1 min
AssertionError: Displayed number of tokens in ACCESS TOKENS oz panel: 0 instead of excepted: 1
request = <FixtureRequest for <Function 'test_user_successfully_creates_access_token[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(31 more lines...)
Collapse Failed test_onezone_basic test_user_successfully_removes_access_token[1oz_1op_deployed]
Failing since build #677 (Rebuilt by Łukasz Opioła) Not quarantined Chrome onezone basic tests 1 min
AssertionError: Displayed number of tokens in ACCESS TOKENS oz panel: 0 instead of excepted: 1
request = <FixtureRequest for <Function 'test_user_successfully_removes_access_token[1oz_1op_deployed]'>>

    @pytest.mark.usefixtures(*function_args)
    def scenario_wrapper(request):
>       _execute_scenario(feature, scenario, request, encoding)

/usr/local/lib/python3.6/dist-packages/pytest_bdd/scenario.py:227: 
(31 more lines...)