Test Report

Summary

784
20 error 35 failed 666 passed 63 skipped

Warnings

WARNING
/usr/lib/python3/dist-packages/invoke/loader.py:3
the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
WARNING
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1015
Unverified HTTPS request is being made to host 'mordor'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
WARNING
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1015
Unverified HTTPS request is being made to host 'mordor'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
WARNING
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1015
Unverified HTTPS request is being made to host 'mordor'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
WARNING
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1015
Unverified HTTPS request is being made to host 'mordor'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
WARNING
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1015
Unverified HTTPS request is being made to host 'mordor'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

Tests

plinth/modules/apache/tests/test_components.py 12 0:00:00.042316

PASSED test_webserver_init 0:00:00.003732

Test that webserver component can be initialized.

Setup

Call

Teardown

PASSED test_webserver_is_enabled 0:00:00.004055

Test that checking webserver configuration enabled works.

Setup

Call

Teardown

PASSED test_webserver_enable 0:00:00.004152

Test that enabling webserver configuration works.

Setup

Call

Teardown

PASSED test_webserver_disable 0:00:00.004005

Test that disabling webserver configuration works.

Setup

Call

Teardown

PASSED test_webserver_diagnose 0:00:00.004425

Test running diagnostics.

Setup

Call

Teardown

PASSED test_uwsgi_init 0:00:00.003121

Test that uWSGI component can be initialized.

Setup

Call

Teardown

PASSED test_uwsgi_is_enabled 0:00:00.004368

Test that checking uwsgi configuration enabled works.

Setup

Call

Teardown

PASSED test_uwsgi_enable 0:00:00.003683

Test that enabling uwsgi configuration works.

Setup

Call

Teardown

PASSED test_uwsgi_disable 0:00:00.002451

Test that disabling uwsgi configuration works.

Setup

Call

Teardown

PASSED test_uwsgi_is_running 0:00:00.002565

Test checking whether uwsgi is running with a configuration.

Setup

Call

Teardown

PASSED test_diagnose_url 0:00:00.002775

Test diagnosing a URL.

Setup

Call

Teardown

PASSED test_check_url 0:00:00.002984

Test checking whether a URL is accessible.

Setup

Call

Teardown

plinth/modules/apache/tests/test_uws.py 1 0:00:00.001848

PASSED test_uws_namings 0:00:00.001848

Test name solvers for user, url and directory of UWS.

Setup

Call

Teardown

plinth/modules/avahi/tests/test_functional.py 3 0:01:15.597961

PASSED TestAvahiApp::test_enable_disable 0:00:50.840031

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestAvahiApp::test_run_diagnostics 0:00:06.173316

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestAvahiApp::test_backup_restore 0:00:18.584613

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/backups/tests/test_api.py 11 0:00:00.045418

PASSED TestBackupProcesses::test_packet_init 0:00:00.003427

Test that packet is initialized properly.

Setup

Call

Teardown

PASSED TestBackupProcesses::test_packet_collected_files_directories 0:00:00.002850

Test that directories/files are collected from manifests.

Setup

Call

Teardown

PASSED TestBackupProcesses::test_backup_apps 0:00:00.005372

Test that backup_handler is called.

Setup

Call

Teardown

PASSED TestBackupProcesses::test_restore_apps 0:00:00.006595

Test that restore_handler is called.

Setup

Call

Teardown

PASSED TestBackupProcesses::test_get_all_components_for_backup 0:00:00.004178

Test listing components supporting backup and needing backup.

Setup

Call

Teardown

PASSED TestBackupProcesses::test_get_components_in_order 0:00:00.003652

Test that components are listed in correct dependency order.

Setup

Call

Teardown

PASSED TestBackupProcesses::test__lockdown_apps 0:00:00.002571

Test that locked flag is set for each app.

Setup

Call

Teardown

PASSED TestBackupProcesses::test__shutdown_services 0:00:00.004407

Test that services are stopped in correct order.

Setup

Call

Teardown

PASSED TestBackupProcesses::test__restore_services 0:00:00.003940

Test that services are restored in correct order.

Setup

Call

Teardown

PASSED TestBackupProcesses::test__run_operation 0:00:00.005987

Test that operation runs handler and app hooks.

Setup

Call

Teardown

PASSED TestBackupModule::test_file_upload 0:00:00.002439

Setup

Call

Teardown

plinth/modules/backups/tests/test_backups.py 9 0:00:00.004633

SKIPPED test_nonexisting_repository 0:00:00.000661

Test that non-existent directory as borg repository throws error.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_empty_dir 0:00:00.000536

Test that empty directory as borg repository throws error.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_create_unencrypted_repository 0:00:00.000492

Test creating an unencrypted repository.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_create_export_delete_archive 0:00:00.000552

  • Create a repo

  • Create an archive

  • Verify archive content

  • Delete archive

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_remote_backup_actions 0:00:00.000477

Test creating an encrypted remote repository using borg directly.

This relies on borgbackups being installed on the remote machine.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_sshfs_mount_password 0:00:00.000482

Test (un)mounting if password for a remote location is given

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_sshfs_mount_keyfile 0:00:00.000488

Test (un)mounting if keyfile for a remote location is given

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_access_nonexisting_url 0:00:00.000474

Test accessing a non-existent URL.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_inaccessible_repo_url 0:00:00.000471

Test accessing an existing URL with wrong credentials.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

plinth/modules/backups/tests/test_components.py 47 0:00:00.818204

PASSED test_backup_restore_backup_pre 0:00:00.713763

Test running backup-pre hook.

Setup

Captured stderr setup
Creating test database for alias 'default'...

Call

Teardown

PASSED test_backup_restore_restore_post 0:00:00.004504

Test running restore-post hook.

Setup

Call

Teardown

PASSED test_valid_directories_and_files[None] 0:00:00.002083

Test that valid values of files and directories.

Setup

Call

Teardown

PASSED test_valid_directories_and_files[section1] 0:00:00.002245

Test that valid values of files and directories.

Setup

Call

Teardown

PASSED test_valid_directories_and_files[section2] 0:00:00.002142

Test that valid values of files and directories.

Setup

Call

Teardown

PASSED test_valid_directories_and_files[section3] 0:00:00.002205

Test that valid values of files and directories.

Setup

Call

Teardown

PASSED test_valid_directories_and_files[section4] 0:00:00.001985

Test that valid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[invalid] 0:00:00.002034

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[10] 0:00:00.002099

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section2] 0:00:00.002275

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section3] 0:00:00.002192

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section4] 0:00:00.002113

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section5] 0:00:00.002089

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section6] 0:00:00.002013

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section7] 0:00:00.002289

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section8] 0:00:00.002252

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section9] 0:00:00.002190

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_invalid_directories_and_files[section10] 0:00:00.002045

Test that invalid values of files and directories.

Setup

Call

Teardown

PASSED test_valid_services[None] 0:00:00.001960

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services1] 0:00:00.002064

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services2] 0:00:00.002190

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services3] 0:00:00.002867

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services4] 0:00:00.003157

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services5] 0:00:00.002179

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services6] 0:00:00.002043

Test that valid values of services.

Setup

Call

Teardown

PASSED test_valid_services[services7] 0:00:00.002200

Test that valid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[10] 0:00:00.002171

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[invalid] 0:00:00.002315

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services2] 0:00:00.002237

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services3] 0:00:00.002189

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services4] 0:00:00.002368

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services5] 0:00:00.002281

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services6] 0:00:00.002286

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services7] 0:00:00.002140

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services8] 0:00:00.002216

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services9] 0:00:00.002200

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services10] 0:00:00.002199

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_invalid_services[services11] 0:00:00.002183

Test that invalid values of services.

Setup

Call

Teardown

PASSED test_backup_restore_init_default_arguments 0:00:00.002036

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_init[config] 0:00:00.002099

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_init[data] 0:00:00.003127

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_init[secrets] 0:00:00.002278

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_init_services 0:00:00.002050

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_init_settings 0:00:00.002091

Test initialization of the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_equal 0:00:00.002111

Test equality operator on the backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_manifest 0:00:00.002221

Test manifest retrieval from backup restore object.

Setup

Call

Teardown

PASSED test_backup_restore_hooks 0:00:00.002230

Test running hooks on backup restore object.

Setup

Call

Teardown

plinth/modules/backups/tests/test_functional.py 3 0:01:42.955702

PASSED test_browser_waits_after_restore 0:01:05.016847

Test that browser waits for redirect after restoring a backup.

Setup

Call

Teardown

PASSED test_download_upload_restore 0:00:22.890771

Test download, upload, and restore a backup.

Setup

Call

Teardown

PASSED test_set_schedule 0:00:15.048085

Test set a schedule for a repository.

Setup

Call

Teardown

plinth/modules/backups/tests/test_schedule.py 29 0:00:00.216133

PASSED test_init_default_values 0:00:00.002058

Test initialization of schedule with default values.

Setup

Call

Teardown

PASSED test_init 0:00:00.001939

Test initialization with explicit values.

Setup

Call

Teardown

PASSED test_get_storage_format 0:00:00.003153

Test that storage format is properly returned.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params0-archives_data0-test_now0-run_periods0-cleanups0] 0:00:00.005314

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params1-archives_data1-test_now1-run_periods1-cleanups1] 0:00:00.006615

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params2-archives_data2-test_now2-run_periods2-cleanups2] 0:00:00.025773

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params3-archives_data3-test_now3-run_periods3-cleanups3] 0:00:00.008187

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params4-archives_data4-test_now4-run_periods4-cleanups4] 0:00:00.006521

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params5-archives_data5-test_now5-run_periods5-cleanups5] 0:00:00.007301

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params6-archives_data6-test_now6-run_periods6-cleanups6] 0:00:00.006422

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params7-archives_data7-test_now7-run_periods7-cleanups7] 0:00:00.008601

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params8-archives_data8-test_now8-run_periods8-cleanups8] 0:00:00.006371

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params9-archives_data9-test_now9-run_periods9-cleanups9] 0:00:00.007167

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params10-archives_data10-test_now10-run_periods10-cleanups10] 0:00:00.006438

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params11-archives_data11-test_now11-run_periods11-cleanups11] 0:00:00.008738

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params12-archives_data12-test_now12-run_periods12-cleanups12] 0:00:00.006669

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params13-archives_data13-test_now13-run_periods13-cleanups13] 0:00:00.007011

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params14-archives_data14-test_now14-run_periods14-cleanups14] 0:00:00.008363

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params15-archives_data15-test_now15-run_periods15-cleanups15] 0:00:00.006811

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params16-archives_data16-test_now16-run_periods16-cleanups16] 0:00:00.006663

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params17-archives_data17-test_now17-run_periods17-cleanups17] 0:00:00.007478

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params18-archives_data18-test_now18-run_periods18-cleanups18] 0:00:00.008355

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params19-archives_data19-test_now19-run_periods19-cleanups19] 0:00:00.006746

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params20-archives_data20-test_now20-run_periods20-cleanups20] 0:00:00.006568

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params21-archives_data21-test_now21-run_periods21-cleanups21] 0:00:00.006710

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params22-archives_data22-test_now22-run_periods22-cleanups22] 0:00:00.009029

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params23-archives_data23-test_now23-run_periods23-cleanups23] 0:00:00.007722

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params24-archives_data24-test_now24-run_periods24-cleanups24] 0:00:00.007836

Test that backups are run at expected time.

Setup

Call

Teardown

PASSED test_run_schedule[schedule_params25-archives_data25-test_now25-run_periods25-cleanups25] 0:00:00.009573

Test that backups are run at expected time.

Setup

Call

Teardown

plinth/modules/backups/tests/test_ssh_remotes.py 4 0:00:00.001479

SKIPPED test_user_setup 0:00:00.000396

Skipped: unconditional skip

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/backups/tests/test_ssh_remotes.py', 71, 'Skipped: unconditional skip')

Teardown

SKIPPED test_add_repository_when_directory_is_missing 0:00:00.000368

Skipped: unconditional skip

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/backups/tests/test_ssh_remotes.py', 77, 'Skipped: unconditional skip')

Teardown

SKIPPED test_add_repository_when_directory_exists_and_empty 0:00:00.000355

Skipped: unconditional skip

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/backups/tests/test_ssh_remotes.py', 92, 'Skipped: unconditional skip')

Teardown

SKIPPED test_add_repository_when_directory_exists_and_not_empty 0:00:00.000359

Skipped: unconditional skip

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/backups/tests/test_ssh_remotes.py', 108, 'Skipped: unconditional skip')

Teardown

plinth/modules/backups/tests/test_store.py 4 0:00:00.018647

PASSED test_add 0:00:00.004258

Add a storage item

Setup

Call

Teardown

PASSED test_add_invalid 0:00:00.002603

Add a storage item

Setup

Call

Teardown

PASSED test_remove 0:00:00.005753

Add and remove storage items

Setup

Call

Teardown

PASSED test_update 0:00:00.006032

Update existing storage items

Setup

Call

Teardown

plinth/modules/backups/tests/test_validators.py 5 0:00:00.013287

PASSED test_repository_paths_validation 0:00:00.002803

Test that repository strings are validated properly.

Setup

Call

Teardown

PASSED test_repository_username_validation 0:00:00.003595

Test that usernames in repository string are validated properly.

Setup

Call

Teardown

PASSED test_repository_hostname_validation 0:00:00.002702

Test that hostnames in repository string are validated properly.

Setup

Call

Teardown

PASSED test_repository_dir_path_validation 0:00:00.002279

Test that paths in repository string are validated properly.

Setup

Call

Teardown

PASSED test_repository_with_colon_path 0:00:00.001909

Test that a colon is possible in directory path.

Setup

Call

Teardown

plinth/modules/bepasty/tests/test_functional.py 8 0:05:31.101103

PASSED TestBepastyApp::test_set_default_permissions_list_and_read_all 0:02:53.867740

Setup

Call

Teardown

PASSED TestBepastyApp::test_set_default_permissions_read_files 0:00:12.062320

Setup

Call

Teardown

PASSED TestBepastyApp::test_add_password 0:00:21.262405

Setup

Call

Teardown

PASSED TestBepastyApp::test_remove_password 0:00:18.091495

Setup

Call

Teardown

PASSED TestBepastyApp::test_backup_and_restore 0:00:41.280101

Setup

Call

Captured stdout call
URL = https://mordor:4430/bepasty/ https://mordor:4430/bepasty Bepasty

Teardown

PASSED TestBepastyApp::test_enable_disable 0:00:19.576099

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/bepasty/ https://mordor:4430/bepasty 404 Not Found
URL = https://mordor:4430/bepasty/ https://mordor:4430/bepasty Bepasty

Teardown

PASSED TestBepastyApp::test_run_diagnostics 0:00:07.951709

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestBepastyApp::test_backup_restore 0:00:37.009235

Test that backup and restore operations work on the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/bepasty/ https://mordor:4430/bepasty Bepasty

Teardown

plinth/modules/bind/tests/test_bind.py 3 0:00:00.113287

PASSED test_set_forwarders 0:00:00.005197

Test that setting forwarders works.

Setup

Call

Teardown

PASSED test_enable_dnssec 0:00:00.003879

Test that enabling DNSSEC works.

Setup

Call

Teardown

PASSED test_get_correct_served_domains 0:00:00.104210

Test that get_served_domains collects the right a/aaaa records from zone files

Setup

Call

Teardown

plinth/modules/bind/tests/test_functional.py 5 0:00:56.840601

PASSED TestBindApp::test_set_forwarders 0:00:06.165634

Test setting forwarders.

Setup

Call

Teardown

PASSED TestBindApp::test_enable_disable_dnssec 0:00:08.247434

Test enabling/disabling DNSSEC.

Setup

Call

Teardown

PASSED TestBindApp::test_backup_restore 0:00:25.133686

Test backup and restore.

Setup

Call

Teardown

PASSED TestBindApp::test_enable_disable 0:00:10.694678

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestBindApp::test_run_diagnostics 0:00:06.599169

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/calibre/tests/test_actions.py 12 0:00:00.063751

PASSED test_list_libraries 0:00:00.036424

Test listing libraries.

Setup

Call

Teardown

FAILED test_create_library 0:00:00.011502

Test creating a library.

assert 16832 == 16877
  +16832
  -16877

Setup

Call

chown = <MagicMock name='chown' id='140662277492896'>
call_action = <function fixture_call_action.<locals>._call_action at 0x7fee7cd1bb80>
actions_module = <module 'calibre' from '/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/actions/calibre'>

    @patch('shutil.chown')
    def test_create_library(chown, call_action, actions_module):
        """Test creating a library."""
        call_action(['create-library', 'TestLibrary'])
        library = actions_module.LIBRARIES_PATH / 'TestLibrary'
        assert (library / 'metadata.db').exists()
>       assert library.stat().st_mode == 0o40755
E       assert 16832 == 16877
E         +16832
E         -16877

plinth/modules/calibre/tests/test_actions.py:52: AssertionError

Teardown

PASSED test_delete_library 0:00:00.015825

Test deleting a library.

Setup

Call

Teardown

plinth/modules/calibre/tests/test_functional.py 5 0:42:05.701637

PASSED TestCalibreApp::test_add_delete_library 0:40:34.799687

Test adding/deleting a new library.

Setup

Call

Teardown

PASSED TestCalibreApp::test_add_delete_book 0:00:28.434901

Test adding/delete book in the library.

Setup

Call

Teardown

PASSED TestCalibreApp::test_backup_restore 0:00:32.837218

Test backing up and restoring.

Setup

Call

Teardown

PASSED TestCalibreApp::test_enable_disable 0:00:20.913653

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/calibre https://mordor:4430/calibre 404 Not Found
URL = https://mordor:4430/calibre https://mordor:4430/calibre calibre

Teardown

PASSED TestCalibreApp::test_run_diagnostics 0:00:08.716178

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/calibre/tests/test_views.py 8 0:00:00.099742

PASSED test_create_library 0:00:00.041232

Test that create library view works.

Setup

Call

Teardown

PASSED test_create_library_failed 0:00:00.007626

Test that create library fails as expected.

Setup

Call

Teardown

PASSED test_create_library_existing_library 0:00:00.007084

Test that create library errors out for an existing library name.

Setup

Call

Teardown

PASSED test_create_library_invalid_name 0:00:00.008883

Test that create library errors out for invalid name.

Setup

Call

Teardown

PASSED test_delete_library_confirmation_view 0:00:00.005397

Test that deleting library confirmation shows correct name.

Setup

Call

Teardown

PASSED test_delete_library 0:00:00.021422

Test that deleting a library works.

Setup

Call

Teardown

PASSED test_delete_library_error 0:00:00.004652

Test that deleting a library shows error when operation fails.

Setup

Call

Teardown

PASSED test_delete_library_non_existing 0:00:00.003447

Test that deleting a library shows error when operation fails.

Setup

Call

Teardown

plinth/modules/cockpit/tests/test_functional.py 3 0:00:45.085567

PASSED TestCockpitApp::test_enable_disable 0:00:16.206742

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/_cockpit/ https://mordor:4430/_cockpit/ 404 Not Found
URL = https://mordor:4430/_cockpit/ https://mordor:4430/_cockpit/ freedombox

Teardown

PASSED TestCockpitApp::test_run_diagnostics 0:00:06.419139

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestCockpitApp::test_backup_restore 0:00:22.459686

Test that backup and restore operations work on the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/_cockpit/ https://mordor:4430/_cockpit/ freedombox

Teardown

plinth/modules/config/tests/test_config.py 42 0:00:00.020493

PASSED test_hostname_field 0:00:00.006406

Test that hostname field accepts only valid hostnames.

Setup

Call

Teardown

PASSED test_domainname_field 0:00:00.007086

Test that domainname field accepts only valid domainnames.

Setup

Call

Teardown

PASSED test_homepage_mapping 0:00:00.001965

Basic tests for homepage functions.

Setup

Call

Teardown

SKIPPED test_homepage_mapping_skip_ci 0:00:00.001969

Special tests for homepage functions.

Skipped: Needs access to ~/ directory. CI sandboxed workspace doesn't provide it.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/config/tests/test_config.py', 98, "Skipped: Needs access to ~/ directory. CI sandboxed workspace doesn't provide it.")

Teardown

SKIPPED test_homepage_field 0:00:00.000565

Test homepage changes.

Test Cases:
  1. FreedomBox Homepage (default),

  2. Apache default,

3) A user's website of an... 3.1) unexisting user 3.2) existing user without a page 3.3) existing user page. 4) A FreedomBox App. 4.1) unknown app 4.2) uninstalled app 4.3) disabled app 4.4) enabled app

Note: If run on a pristine unconfigured FreedomBox, this test will leave

the homepage default-configured. (Imperfect cleanup in such case).

Note: We take fbx as website user because of our testing container.

Pending: - Specific test cases to distinguish 4.1,2,3.

Currently they share the same test case.

  • Search for another valid user apart from fbx.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

PASSED test_locale_path 0:00:00.002502

Test that the 'locale' directory is in the same folder as __main__.py. This is required for detecting translated languages.

Setup

Call

Teardown

plinth/modules/config/tests/test_functional.py 3 0:01:07.213816

PASSED test_change_hostname 0:00:04.660829

Test changing the hostname.

Setup

Call

Teardown

PASSED test_change_domain_name 0:00:18.644960

Test changing the domain name.

Setup

Call

Teardown

PASSED test_change_home_page 0:00:43.908027

Test changing webserver home page.

Setup

Call

Teardown

plinth/modules/coturn/tests/test_components.py 4 0:00:00.012840

PASSED test_configuration_init 0:00:00.002441

Test creating configuration object.

Setup

Call

Teardown

PASSED test_component_init_and_list 0:00:00.003064

Test initializing and listing all the components.

Setup

Call

Teardown

PASSED test_notify_on_configuration_changed 0:00:00.004029

Test configuration change notifications.

Setup

Call

Teardown

PASSED test_get_configuration 0:00:00.003306

Test coturn configuration retrieval using component.

Setup

Call

Teardown

plinth/modules/coturn/tests/test_functional.py 21 0:01:55.129482

PASSED TestCoturnApp::test_enable_disable 0:01:24.994995

Test enabling and disabling the app.

Setup

Call

Teardown

SKIPPED TestCoturnApp::test_run_diagnostics 0:00:05.220545

Test that all app diagnostics are passing.

Skipped: Skipping diagnostics check for coturn.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/functional/__init__.py', 643, 'Skipped: Skipping diagnostics check for coturn.')

Teardown

PASSED TestCoturnApp::test_backup_restore 0:00:24.913942

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/datetime/tests/test_functional.py 3 0:00:23.971829

PASSED test_enable_disable 0:00:06.005627

Test enabling the app.

Setup

Call

Teardown

PASSED test_set_timezone 0:00:00.733594

Test setting the timezone.

Setup

Call

Teardown

PASSED test_backup_and_restore 0:00:17.232608

Test backup and restore of datetime settings.

Setup

Call

Teardown

plinth/modules/deluge/tests/test_functional.py 14 0:06:22.163724

PASSED TestDelugeApp::test_bittorrent_group 0:04:25.904104

Test if only users in bit-torrent group can access Deluge.

Setup

Call

Captured stdout call
URL = https://mordor:4430/deluge https://mordor:4430/deluge Deluge WebUI 2.0.3
URL = https://mordor:4430/plinth?next=https%3a%2f%2fmordor%3a4430%2fdeluge https://mordor:4430/deluge FreedomBox

Teardown

PASSED TestDelugeApp::test_upload_torrent 0:00:18.764663

Test uploading a torrent.

Setup

Call

Teardown

PASSED TestDelugeApp::test_backup_restore 0:00:51.710048

Test backup and restore.

Setup

Call

Teardown

ERROR TestDelugeApp::test_enable_disable 0:00:31.578781

Test enabling and disabling the app.

TypeError: expected string or bytes-like object

Setup

Call

Captured stdout call
URL = https://mordor:4430/deluge https://mordor:4430/deluge 404 Not Found
URL = https://mordor:4430/deluge https://mordor:4430/deluge Deluge WebUI 2.0.3

Teardown

self = <plinth.modules.deluge.tests.test_functional.TestDelugeApp object at 0x7fee7dc1c580>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
        app_enable(session_browser, self.app_name)
        yield
        login(session_browser)
>       app_disable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:630: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:387: in app_disable
    _change_app_status(browser, app_name, 'disabled')
plinth/tests/functional/__init__.py:370: in _change_app_status
    submit(browser, element=button)
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:71: in until
    value = method(self._driver)
plinth/tests/functional/__init__.py:101: in __call__
    self.element.has_class('whatever_class')
../../../../.local/lib/python3.9/site-packages/splinter/driver/webdriver/__init__.py:917: in has_class
    re.search(r"(?:^|\s)" + re.escape(class_name) + r"(?:$|\s)", self["class"])
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

pattern = '(?:^|\\s)whatever_class(?:$|\\s)', string = None, flags = 0

    def search(pattern, string, flags=0):
        """Scan through string looking for a match to the pattern, returning
        a Match object, or None if no match was found."""
>       return _compile(pattern, flags).search(string)
E       TypeError: expected string or bytes-like object

/usr/lib/python3.9/re.py:201: TypeError

PASSED TestDelugeApp::test_run_diagnostics 0:00:14.206128

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/deluge/tests/test_utils.py 3 0:00:00.071901

PASSED test_initialization 0:00:00.003623

Test object initialization.

Setup

Call

Teardown

PASSED test_load 0:00:00.004189

Test loading the configuration file.

Setup

Call

Teardown

PASSED test_save 0:00:00.064089

Test save the configuration file.

Setup

Call

Teardown

plinth/modules/dynamicdns/tests/test_functional.py 81 0:02:15.359552

PASSED TestDynamicDNSApp::test_capitalized_domain_name 0:00:13.906356

Test handling of capitalized domain name.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_various_form_values[gnudip1] 0:00:03.563125

Test feeding various values and check that they are saved.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_various_form_values[gnudip2] 0:00:15.707514

Test feeding various values and check that they are saved.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_various_form_values[noip.com] 0:00:16.364693

Test feeding various values and check that they are saved.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_various_form_values[freedns.afraid.org] 0:00:16.353067

Test feeding various values and check that they are saved.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_various_form_values[other] 0:00:17.025162

Test feeding various values and check that they are saved.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_backup_restore 0:00:47.469504

Test backup and restore of configuration.

Setup

Call

Teardown

PASSED TestDynamicDNSApp::test_enable_disable 0:00:03.214004

Test enabling and disabling the app.

Setup

Call

Teardown

SKIPPED TestDynamicDNSApp::test_run_diagnostics 0:00:01.756127

Test that all app diagnostics are passing.

Skipped: Skipping diagnostics check for dynamicdns.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/functional/__init__.py', 643, 'Skipped: Skipping diagnostics check for dynamicdns.')

Teardown

plinth/modules/ejabberd/tests/test_functional.py 13 0:11:47.843792

PASSED TestEjabberdApp::test_message_archive_management 0:05:36.324633

Test enabling message archive management.

Setup

Call

Teardown

FAILED TestEjabberdApp::test_backup_restore 0:05:21.897852

Test backup and restore of app data.

selenium.common.exceptions.TimeoutException: Message:

Setup

Call

self = <plinth.modules.ejabberd.tests.test_functional.TestEjabberdApp object at 0x7fee7cca37c0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.mark.backups
    def test_backup_restore(self, session_browser):
        """Test backup and restore of app data."""
        functional.app_enable(session_browser, 'ejabberd')
>       _jsxc_add_contact(session_browser)

plinth/modules/ejabberd/tests/test_functional.py:33: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/ejabberd/tests/test_functional.py:87: in _jsxc_add_contact
    functional.set_domain_name(browser, 'localhost')
plinth/tests/functional/__init__.py:411: in set_domain_name
    submit(browser, element=update_setup)
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WebDriver' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x7fee7cddd790>
method = <plinth.tests.functional._PageLoaded object at 0x7fee7cdc0cd0>
message = ''

    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None
    
        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
>       raise TimeoutException(message, screen, stacktrace)
E       selenium.common.exceptions.TimeoutException: Message:

../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:80: TimeoutException

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.ejabberd.tests.test_functional.TestEjabberdApp/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.ejabberd.tests.test_functional.TestEjabberdApp/test_backup_restore-session_browser.html

Teardown

PASSED TestEjabberdApp::test_enable_disable 0:00:30.957654

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestEjabberdApp::test_run_diagnostics 0:00:18.663653

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/ejabberd/tests/test_turn_config.py 3 0:00:00.676824

PASSED test_managed_turn_server_configuration 0:00:00.268776

Setup

Call

Teardown

PASSED test_overridden_turn_server_configuration 0:00:00.161296

Setup

Call

Teardown

PASSED test_remove_turn_configuration 0:00:00.246752

Setup

Call

Teardown

plinth/modules/email/tests/test_functional.py 12 0:07:05.290357

ERROR TestEmailApp::test_enable_disable 0:05:34.961236

Test enabling and disabling the app.

KeyError: 'email'

Setup

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'email'

    def app_enable(browser, app_name):
        nav_to_module(browser, app_name)
>       _change_app_status(browser, app_name, 'enabled')

plinth/tests/functional/__init__.py:382: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'email', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'email'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.email.tests.test_functional.TestEmailApp/test_enable_disable-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.email.tests.test_functional.TestEmailApp/test_enable_disable-session_browser.html

Teardown

PASSED TestEmailApp::test_run_diagnostics 0:00:20.950947

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestEmailApp::test_backup_restore 0:01:09.378174

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/firewall/tests/test_components.py 6 0:00:00.018750

PASSED test_init_without_arguments 0:00:00.002523

Test initializing the component without arguments.

Setup

Call

Teardown

PASSED test_init 0:00:00.001966

Test initializing the component.

Setup

Call

Teardown

PASSED test_port_details 0:00:00.002816

Test retrieving port details for a firewall component.

Setup

Call

Teardown

PASSED test_enable 0:00:00.003886

Test enabling a firewall component.

Setup

Call

Teardown

PASSED test_disable 0:00:00.004494

Test disabling a firewall component.

Setup

Call

Teardown

PASSED test_diagnose 0:00:00.003065

Test diagnosing open/closed firewall ports.

Setup

Call

Teardown

plinth/modules/gitweb/tests/test_actions.py 14 0:00:00.500511

PASSED test_create_repo 0:00:00.095379

Test creating a repository.

Setup

Call

Teardown

PASSED test_change_repo_medatada 0:00:00.075830

Test change a metadata of the repository.

Setup

Call

Teardown

PASSED test_rename_repository 0:00:00.067794

Test renaming a repository.

Setup

Call

Teardown

PASSED test_get_branches 0:00:00.055105

Test getting all the branches of the repository.

Setup

Call

Teardown

PASSED test_delete_repository 0:00:00.049072

Test deleting a repository.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_names[.Test-repo] 0:00:00.011991

Test that creating repository with invalid names fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_names[Test-repo.git.git] 0:00:00.011111

Test that creating repository with invalid names fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_names[/root/Test-repo] 0:00:00.011069

Test that creating repository with invalid names fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_names[Test-rep\xf6] 0:00:00.012462

Test that creating repository with invalid names fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_urls[Test-repo] 0:00:00.010906

Test that cloning repository with invalid URL fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_urls[file://root/Test-repo] 0:00:00.010878

Test that cloning repository with invalid URL fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_urls[localhost/Test-repo] 0:00:00.011013

Test that cloning repository with invalid URL fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_urls[ssh://localhost/Test-repo] 0:00:00.010904

Test that cloning repository with invalid URL fails.

Setup

Call

Teardown

PASSED test_action_create_repo_with_invalid_urls[https://localhost/.Test-repo] 0:00:00.066998

Test that cloning repository with invalid URL fails.

Setup

Call

Teardown

plinth/modules/gitweb/tests/test_functional.py 19 0:03:51.091119

PASSED TestGitwebApp::test_all_repos_private 0:02:26.188319

Test repo accessability when all repos are private.

Setup

Call

Captured stdout call
URL = https://mordor:4430/gitweb/ https://mordor:4430/gitweb mordor Git
URL = https://mordor:4430/plinth?next=https%3a%2f%2fmordor%3a4430%2fgitweb%2f https://mordor:4430/gitweb FreedomBox

Teardown

PASSED TestGitwebApp::test_backup_restore 0:00:24.096513

Test backing up and restoring.

Setup

Call

Captured stdout call
URL = https://mordor:4430/gitweb/ https://mordor:4430/gitweb mordor Git

Teardown

PASSED TestGitwebApp::test_create_delete_repo[Test-repo-public] 0:00:08.280688

Test creating and deleting a repo and accessing with a git client.

Setup

Call

Teardown

PASSED TestGitwebApp::test_create_delete_repo[Test-repo-private] 0:00:06.962270

Test creating and deleting a repo and accessing with a git client.

Setup

Call

Teardown

PASSED TestGitwebApp::test_create_delete_repo[Test-repo.git-public] 0:00:07.500611

Test creating and deleting a repo and accessing with a git client.

Setup

Call

Teardown

PASSED TestGitwebApp::test_create_delete_repo[Test-repo.git-private] 0:00:06.613964

Test creating and deleting a repo and accessing with a git client.

Setup

Call

Teardown

PASSED TestGitwebApp::test_both_private_and_public_repo_exist 0:00:10.352021

Tests when both private and public repo exist.

Setup

Call

Teardown

ERROR TestGitwebApp::test_edit_repo_metadata 0:00:05.373572

Test edit repo metadata.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_gitweb-name"
splinter.exceptions.ElementDoesNotExist: no elements could be found with name "username"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7cdf8be0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.gitweb.tests.test_functional.TestGitwebApp object at 0x7fee7cd59220>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_edit_repo_metadata(self, session_browser):
        """Test edit repo metadata."""
        _create_repo(session_browser, 'Test-repo2', 'public',
                     ok_if_exists=True)
        _delete_repo(session_browser, 'Test-repo', ignore_missing=True)
        repo_metadata = {
            'name': 'Test-repo',
            'description': 'Test Description',
            'owner': 'Test Owner',
            'access': 'private',
        }
>       _edit_repo_metadata(session_browser, 'Test-repo2', repo_metadata)

plinth/modules/gitweb/tests/test_functional.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/gitweb/tests/test_functional.py:182: in _edit_repo_metadata
    browser.find_by_id('id_gitweb-name').fill(metadata['name'])
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7cdf8be0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_gitweb-name"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.gitweb.tests.test_functional.TestGitwebApp/test_edit_repo_metadata-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.gitweb.tests.test_functional.TestGitwebApp/test_edit_repo_metadata-session_browser.html

Teardown

self = <splinter.element_list.ElementList object at 0x7fee7cda2ac0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.gitweb.tests.test_functional.TestGitwebApp object at 0x7fee7cd59220>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
        app_enable(session_browser, self.app_name)
        yield
>       login(session_browser)

plinth/tests/functional/__init__.py:629: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:253: in login
    login_with_account(browser, base_url, config['DEFAULT']['username'],
plinth/tests/functional/__init__.py:277: in login_with_account
    browser.fill('username', username)
../../../../.local/lib/python3.9/site-packages/splinter/driver/webdriver/__init__.py:596: in fill
    field = self.find_by_name(name).first
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7cda2ac0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with name "username"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

PASSED TestGitwebApp::test_enable_disable 0:00:10.608264

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/gitweb/ https://mordor:4430/gitweb 404 Not Found
URL = https://mordor:4430/gitweb/ https://mordor:4430/gitweb mordor Git

Teardown

PASSED TestGitwebApp::test_run_diagnostics 0:00:05.114898

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/gitweb/tests/test_views.py 17 0:00:00.118614

PASSED test_repos_view 0:00:00.023567

Test that a repo list has correct view data.

Setup

Call

Teardown

PASSED test_create_repo_view 0:00:00.009671

Test that repo create view sends correct success message.

Setup

Call

Teardown

PASSED test_create_repo_duplicate_name_view 0:00:00.007067

Test that repo create view shows correct error message.

Setup

Call

Teardown

PASSED test_create_repo_invalid_name_view 0:00:00.005038

Test that repo create view shows correct error message.

Setup

Call

Teardown

PASSED test_create_repo_failed_view 0:00:00.006365

Test that repo creation failure sends correct error message.

Setup

Call

Teardown

PASSED test_clone_repo_view 0:00:00.005743

Test that cloning repo sends correct succcess message.

Setup

Call

Teardown

PASSED test_clone_repo_missing_remote_view 0:00:00.005664

Test that cloning non-existing repo shows correct error message.

Setup

Call

Teardown

PASSED test_edit_repository_view 0:00:00.008125

Test that editing repo sends correct success message.

Setup

Call

Teardown

PASSED test_edit_nonexisting_repository_view 0:00:00.003852

Test that trying to edit non-existing repository raises 404.

Setup

Call

Teardown

PASSED test_edit_repository_duplicate_name_view 0:00:00.006124

Test that renaming to already existing repo name shows correct error message.

Setup

Call

Teardown

PASSED test_edit_repository_invalid_name_view 0:00:00.005227

Test that renaming repo to invalid name shows correct error message.

Setup

Call

Teardown

PASSED test_edit_repository_no_change_view 0:00:00.005950

Test that not changing any values don't edit the repo.

Setup

Call

Teardown

PASSED test_edit_repository_failed_view 0:00:00.006166

Test that failed repo editing sends correct error message.

Setup

Call

Teardown

PASSED test_delete_repository_confirmation_view 0:00:00.004396

Test that repo deletion confirmation shows correct repo name.

Setup

Call

Teardown

PASSED test_delete_repository_view 0:00:00.006808

Test that repo deletion sends correct success message.

Setup

Call

Teardown

PASSED test_delete_repository_fail_view 0:00:00.004860

Test that failed repository deletion sends correct error message.

Setup

Call

Teardown

PASSED test_delete_non_existing_repository_view 0:00:00.003993

Test that deleting non-existing repository raises 404.

Setup

Call

Teardown

plinth/modules/help/tests/test_functional.py 1 0:00:00.325462

PASSED test_view_status_logs 0:00:00.325462

Test viewing the status logs.

Setup

Call

Teardown

plinth/modules/help/tests/test_views.py 104 0:00:00.474156

PASSED test_simple_help_pages[contribute-contribute] 0:00:00.040222

Simple common test for certain help views.

Setup

Call

Teardown

PASSED test_simple_help_pages[feedback-feedback] 0:00:00.003915

Simple common test for certain help views.

Setup

Call

Teardown

PASSED test_simple_help_pages[support-support] 0:00:00.003175

Simple common test for certain help views.

Setup

Call

Teardown

PASSED test_simple_help_pages[index-index] 0:00:00.002936

Simple common test for certain help views.

Setup

Call

Teardown

PASSED test_about 0:00:00.286222

Test some expected items in about view.

Setup

Call

Teardown

PASSED test_full_default_manual[None] 0:00:00.005636

Test request for the full default manual.

Expected: Redirect to the full manual in the fallback language.

Setup

Call

Teardown

PASSED test_full_default_manual[-] 0:00:00.003220

Test request for the full default manual.

Expected: Redirect to the full manual in the fallback language.

Setup

Call

Teardown

PASSED test_default_manual_by_pages[None] 0:00:00.061883

Test page-specific requests for the (default) manual.

Expected: Redirect to their respective twins in the fallback language. Pending.: Redirect pages with plus-sign '+' in their name.

Setup

Call

Teardown

PASSED test_default_manual_by_pages[-] 0:00:00.061116

Test page-specific requests for the (default) manual.

Expected: Redirect to their respective twins in the fallback language. Pending.: Redirect pages with plus-sign '+' in their name.

Setup

Call

Teardown

SKIPPED test_specific_full_manual_translation 0:00:00.000440

Test request for specific translated manuals.

Expected: All return a page.

Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/help/tests/test_views.py', 173, 'Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.')

Teardown

SKIPPED test_specific_manual_translation_by_pages 0:00:00.000366

Test that translated-page-specific requests.

Expected: All known page names return pages.

Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/help/tests/test_views.py', 186, 'Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.')

Teardown

SKIPPED test_full_manual_requested_by_page_name 0:00:00.000398

Test requests for 'Manual'.

Note: 'Manual' is a file, not a manual page. Expected: Return a proper not found message (HTTP 404) Currently: Non fallback languages return a page.

This is wrong, but doesn't cause any harm.

Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/help/tests/test_views.py', 200, 'Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.')

Teardown

PASSED test_missing_page 0:00:00.003899

Test requests for missing pages.

Expected: - Unspecified language: Fall back to its fallback twin. - Translated languages: Fall back to its fallback twin. - Fallback language...: Return a proper not found message (HTTP 404) - Unknown languages...: Fall back to its fallback twin.

Setup

Call

Teardown

SKIPPED test_download_full_manual_file 0:00:00.000729

Test download of manual.

Design: - Downloads the default manual, a translated one and the

fallback translation. None should fail. Then compares them.

  • Call diff command for fast comparision. Comparing the over 10MB bytestrings in python is insanely slow.

Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/help/tests/test_views.py', 242, 'Skipped: Needs installed manual. CI speed-optimized workspace does not provide it.')

Teardown

plinth/modules/i2p/tests/test_functional.py 3 0:04:41.070108

ERROR TestI2pApp::test_enable_disable 0:04:40.584725

Test enabling and disabling the app.

KeyError: 'i2p'

Setup

self = <plinth.modules.i2p.tests.test_functional.TestI2pApp object at 0x7fee82bcfb80>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'i2p', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'i2p'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_enable_disable-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_enable_disable-session_browser.html

Teardown

ERROR TestI2pApp::test_run_diagnostics 0:00:00.234479

Test that all app diagnostics are passing.

KeyError: 'i2p'

Setup

self = <plinth.modules.i2p.tests.test_functional.TestI2pApp object at 0x7fee7c7405e0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'i2p', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'i2p'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_run_diagnostics-session_browser.html

Teardown

ERROR TestI2pApp::test_backup_restore 0:00:00.250905

Test that backup and restore operations work on the app.

KeyError: 'i2p'

Setup

self = <plinth.modules.i2p.tests.test_functional.TestI2pApp object at 0x7fee7ccf3d30>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'i2p', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'i2p'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.i2p.tests.test_functional.TestI2pApp/test_backup_restore-session_browser.html

Teardown

plinth/modules/i2p/tests/test_helpers.py 5 0:00:00.109425

PASSED test_reading_conf 0:00:00.051782

Test reading configuration file.

Setup

Call

Teardown

PASSED test_setting_idx 0:00:00.022615

Test setting index for editing a tunnel.

Setup

Call

Teardown

PASSED test_setting_tunnel_props 0:00:00.013489

Test setting a tunnel property.

Setup

Call

Teardown

PASSED test_getting_nonexistent_props 0:00:00.010750

Test getting nonexistent property.

Setup

Call

Teardown

PASSED test_setting_new_props 0:00:00.010789

Test setting new properties.

Setup

Call

Teardown

plinth/modules/i2p/tests/test_router_editor.py 4 0:00:00.032298

PASSED test_count_favorites 0:00:00.015567

Test counting favorites.

Setup

Call

Teardown

PASSED test_add_normal_favorite 0:00:00.006217

Test adding a normal favorite.

Setup

Call

Teardown

PASSED test_add_favorite_with_comma 0:00:00.006141

Test adding a favorite with common in its name.

Setup

Call

Teardown

PASSED test_add_fav_to_empty_config 0:00:00.004372

Test adding favorite to empty configuration.

Setup

Call

Teardown

plinth/modules/ikiwiki/tests/test_functional.py 3 0:12:10.869722

PASSED TestIkiwikiApp::test_backup_restore 0:11:51.018872

Test backup and restore of app data.

Setup

Call

Teardown

PASSED TestIkiwikiApp::test_enable_disable 0:00:11.089838

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/ikiwiki https://mordor:4430/ikiwiki 404 Not Found
URL = https://mordor:4430/ikiwiki/ https://mordor:4430/ikiwiki Index of /ikiwiki

Teardown

PASSED TestIkiwikiApp::test_run_diagnostics 0:00:08.761013

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/infinoted/tests/test_functional.py 3 0:01:25.848008

PASSED TestInfinotedApp::test_enable_disable 0:00:56.238496

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestInfinotedApp::test_run_diagnostics 0:00:05.345158

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestInfinotedApp::test_backup_restore 0:00:24.264354

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/jsxc/tests/test_functional.py 2 0:01:58.999906

PASSED test_install 0:01:40.956713

Test installing the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/plinth/apps/jsxc/jsxc/ https://mordor:4430/plinth/apps/jsxc/jsxc/ Jabber Chat (JSXC)

Teardown

PASSED test_backup 0:00:18.043193

Test backing up and restoring.

Setup

Call

Captured stdout call
URL = https://mordor:4430/plinth/apps/jsxc/jsxc/ https://mordor:4430/plinth/apps/jsxc/jsxc/ Jabber Chat (JSXC)

Teardown

plinth/modules/letsencrypt/tests/test_components.py 25 0:00:00.075909

PASSED test_init_without_arguments 0:00:00.002582

Test that component is initialized with defaults properly.

Setup

Call

Teardown

PASSED test_init 0:00:00.002259

Test initializing the component.

Setup

Call

Teardown

PASSED test_init_values 0:00:00.002375

Test initializing with invalid values.

Setup

Call

Teardown

PASSED test_domains 0:00:00.002034

Test getting domains.

Setup

Call

Teardown

PASSED test_list 0:00:00.002302

Test listing components.

Setup

Call

Teardown

PASSED test_setup_certificates 0:00:00.004110

Test that initial copying of certs for an app works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])]
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])]

Teardown

PASSED test_setup_certificates_without_copy 0:00:00.003579

Test that initial copying of certs for an app works.

Setup

Call

Teardown

PASSED test_setup_certificates_with_app_domains 0:00:00.003632

Test that initial copying of certs for an app works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])]
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid.example/private.path', '--certificate-path', '/etc/test-app/invalid.example/certificate.path'])]

Teardown

PASSED test_setup_certificates_with_all_domains 0:00:00.004020

Test that initial copying for certs works when app domains is '*'.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid2.example/private.path', '--certificate-path', '/etc/test-app/invalid2.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid1.example/private.path', '--certificate-path', '/etc/test-app/invalid1.example/certificate.path'])]
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid1.example/private.path', '--certificate-path', '/etc/test-app/invalid1.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid2.example/private.path', '--certificate-path', '/etc/test-app/invalid2.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid1.example/private.path', '--certificate-path', '/etc/test-app/invalid1.example/certificate.path'])]
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid2.example/private.path', '--certificate-path', '/etc/test-app/invalid2.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid2.example/private.path', '--certificate-path', '/etc/test-app/invalid2.example/certificate.path']), call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/invalid1.example/private.path', '--certificate-path', '/etc/test-app/invalid1.example/certificate.path'])]

Teardown

PASSED test_get_status 0:00:00.003047

Test that getting domain status works.

Setup

Call

Teardown

PASSED test_get_status_outdate_copy 0:00:00.003691

Test that getting domain status works with outdated copy.

Setup

Call

Teardown

PASSED test_get_status_without_copy 0:00:00.003067

Test that getting domain status works without copying.

Setup

Call

Teardown

PASSED test_on_certificate_obtained 0:00:00.002877

Test that certificate obtained event handler works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])]

Teardown

PASSED test_on_certificate_obtained_with_all_domains 0:00:00.003047

Test that certificate obtained event handler works for app with all domains.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])]

Teardown

PASSED test_on_certificate_obtained_irrelevant 0:00:00.002675

Test that certificate obtained event handler works with irrelevant domain.

Setup

Call

Teardown

PASSED test_on_certificate_obtained_without_copy 0:00:00.003276

Test that certificate obtained event handler works without copying.

Setup

Call

Teardown

PASSED test_on_certificate_renewed 0:00:00.003076

Test that certificate renewed event handler works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/letsencrypt/live/valid.example/privkey.pem', '--source-certificate-path', '/etc/letsencrypt/live/valid.example/fullchain.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])]

Teardown

PASSED test_on_certificate_renewed_irrelevant 0:00:00.002456

Test that certificate renewed event handler works for irrelevant domains.

Setup

Call

Teardown

PASSED test_on_certificate_renewed_without_copy 0:00:00.002947

Test that certificate renewed event handler works without copying.

Setup

Call

Teardown

PASSED test_on_certificate_revoked 0:00:00.003515

Test that certificate revoked event handler works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])]

Teardown

PASSED test_on_certificate_revoked_irrelevant 0:00:00.003872

Test that certificate revoked event handler works for irrelevant domains.

Setup

Call

Teardown

PASSED test_on_certificate_revoked_without_copy 0:00:00.002636

Test that certificate revoked event handler works without copying.

Setup

Call

Teardown

PASSED test_on_certificate_deleted 0:00:00.002940

Test that certificate deleted event handler works.

Setup

Call

Captured stdout call
call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])
[call('letsencrypt', ['copy-certificate', '--managing-app', 'test-app', '--user-owner', 'test-user', '--group-owner', 'test-group', '--source-private-key-path', '/etc/ssl/private/ssl-cert-snakeoil.key', '--source-certificate-path', '/etc/ssl/certs/ssl-cert-snakeoil.pem', '--private-key-path', '/etc/test-app/valid.example/private.path', '--certificate-path', '/etc/test-app/valid.example/certificate.path'])]

Teardown

PASSED test_on_certificate_deleted_irrelevant 0:00:00.002790

Test that certificate deleted event handler works for irrelevant domains.

Setup

Call

Teardown

PASSED test_on_certificate_deleted_without_copy 0:00:00.003104

Test that certificate deleted event handler works without copying.

Setup

Call

Teardown

plinth/modules/letsencrypt/tests/test_domain_name_changes.py 7 0:00:00.026643

PASSED test_add_onion_domain 0:00:00.001931

Test that .onion domains are ignored when added/removed.

Setup

Call

Teardown

PASSED test_add_valid_domain[domain1.tld-status_input0-True-True] 0:00:00.004342

Test adding a domain that can have certificates.

Setup

Call

Teardown

PASSED test_add_valid_domain[domain2.tld-status_input1-True-True] 0:00:00.004676

Test adding a domain that can have certificates.

Setup

Call

Teardown

PASSED test_add_valid_domain[domain3.tld-status_input2-False-False] 0:00:00.004006

Test adding a domain that can have certificates.

Setup

Call

Teardown

PASSED test_add_valid_domain[-status_input3-False-True] 0:00:00.003645

Test adding a domain that can have certificates.

Setup

Call

Teardown

PASSED test_remove_domain[domain1.tld-True-True] 0:00:00.004158

Test removing a domain that can certificates.

Setup

Call

Teardown

PASSED test_remove_domain[-False-True] 0:00:00.003886

Test removing a domain that can certificates.

Setup

Call

Teardown

plinth/modules/matrixsynapse/tests/test_functional.py 3 0:05:06.255062

ERROR TestMatrixSynapseApp::test_enable_disable 0:05:06.252214

Test enabling and disabling the app.

selenium.common.exceptions.TimeoutException: Message:

Setup

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
domain_name = 'mydomain.example'

    def set_domain_name(browser, domain_name):
        nav_to_module(browser, 'config')
        browser.find_by_id('id_domainname').fill(domain_name)
        update_setup = browser.find_by_css('.btn-primary[type="submit"]')
>       submit(browser, element=update_setup)

plinth/tests/functional/__init__.py:411: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WebDriver' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x7fee7cda2c10>
method = <plinth.tests.functional._PageLoaded object at 0x7fee7ce2cbb0>
message = ''

    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None
    
        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
>       raise TimeoutException(message, screen, stacktrace)
E       selenium.common.exceptions.TimeoutException: Message:

../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:80: TimeoutException

Teardown

ERROR TestMatrixSynapseApp::test_run_diagnostics 0:00:00.001357

Test that all app diagnostics are passing.

selenium.common.exceptions.TimeoutException: Message:

Setup

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
domain_name = 'mydomain.example'

    def set_domain_name(browser, domain_name):
        nav_to_module(browser, 'config')
        browser.find_by_id('id_domainname').fill(domain_name)
        update_setup = browser.find_by_css('.btn-primary[type="submit"]')
>       submit(browser, element=update_setup)

plinth/tests/functional/__init__.py:411: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WebDriver' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x7fee7cda2c10>
method = <plinth.tests.functional._PageLoaded object at 0x7fee7ce2cbb0>
message = ''

    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None
    
        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
>       raise TimeoutException(message, screen, stacktrace)
E       selenium.common.exceptions.TimeoutException: Message:

../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:80: TimeoutException

Teardown

ERROR TestMatrixSynapseApp::test_backup_restore 0:00:00.001490

Test that backup and restore operations work on the app.

selenium.common.exceptions.TimeoutException: Message:

Setup

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
domain_name = 'mydomain.example'

    def set_domain_name(browser, domain_name):
        nav_to_module(browser, 'config')
        browser.find_by_id('id_domainname').fill(domain_name)
        update_setup = browser.find_by_css('.btn-primary[type="submit"]')
>       submit(browser, element=update_setup)

plinth/tests/functional/__init__.py:411: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WebDriver' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x7fee7cda2c10>
method = <plinth.tests.functional._PageLoaded object at 0x7fee7ce2cbb0>
message = ''

    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None
    
        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
>       raise TimeoutException(message, screen, stacktrace)
E       selenium.common.exceptions.TimeoutException: Message:

../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:80: TimeoutException

Teardown

plinth/modules/matrixsynapse/tests/test_turn_config.py 4 0:00:00.154297

PASSED test_managed_turn_server_configuration 0:00:00.100244

Test setting and getting managed TURN server configuration.

Setup

Call

Teardown

PASSED test_overridden_turn_server_configuration 0:00:00.012311

Test setting and getting overridden TURN sever configuration.

Setup

Call

Teardown

PASSED test_revert_to_managed_turn_server_configuration 0:00:00.020152

Test setting and getting overridden TURN sever configuration.

Setup

Call

Teardown

PASSED test_coturn_configuration_update_after_admin_override 0:00:00.021589

Test that overridden conf prevails even if managed conf is updated.

Setup

Call

Teardown

plinth/modules/mediawiki/tests/test_functional.py 18 0:08:24.177113

PASSED TestMediawikiApp::test_public_registrations 0:05:47.028003

Test enabling public registrations.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_private_mode 0:00:12.398965

Test enabling private mode.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_private_mode_public_registrations 0:00:16.143774

Test interactive between private mode and public registrations.

Requires JS.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_upload_files 0:00:13.651754

Test that logged in user can see upload files option.

Requires JS.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_upload_images 0:00:21.985915

Test uploading an image.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_upload_svg_image 0:00:17.129929

Test uploading an SVG image.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_backup_restore 0:00:45.836164

Test backup and restore of pages and images.

Setup

Call

Teardown

PASSED TestMediawikiApp::test_enable_disable 0:00:20.471822

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/mediawiki/ https://mordor:4430/mediawiki 404 Not Found
URL = https://mordor:4430/mediawiki/Main_Page https://mordor:4430/mediawiki Wiki

Teardown

FAILED TestMediawikiApp::test_run_diagnostics 0:00:09.530787

Test that all app diagnostics are passing.

AssertionError

Setup

Call

self = <plinth.modules.mediawiki.tests.test_functional.TestMediawikiApp object at 0x7fee7d2008e0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_run_diagnostics(self, session_browser):
        """Test that all app diagnostics are passing."""
        if not self.check_diagnostics:
            pytest.skip(f'Skipping diagnostics check for {self.app_name}.')
    
        time.sleep(self.diagnostics_delay)
        session_browser.find_by_id('id_extra_actions_button').click()
        submit(session_browser, form_class='form-diagnostics-button')
    
        warning_results = session_browser.find_by_css('.badge-warning')
        if warning_results:
            warnings.warn(
                f'Diagnostics warnings for {self.app_name}: {warning_results}')
    
        failure_results = session_browser.find_by_css('.badge-danger')
>       assert not failure_results
E       AssertionError

plinth/tests/functional/__init__.py:655: AssertionError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.mediawiki.tests.test_functional.TestMediawikiApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.mediawiki.tests.test_functional.TestMediawikiApp/test_run_diagnostics-session_browser.html

Teardown

plinth/modules/mediawiki/tests/test_settings.py 2 0:00:00.033777

PASSED test_default_skin 0:00:00.023753

Test getting and setting the default skin.

Setup

Call

Teardown

PASSED test_server_url 0:00:00.010025

Test getting and setting $wgServer.

Setup

Call

Teardown

plinth/modules/minetest/tests/test_functional.py 3 0:06:32.786196

PASSED TestMinetestApp::test_enable_disable 0:05:52.030799

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestMinetestApp::test_run_diagnostics 0:00:14.748838

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestMinetestApp::test_backup_restore 0:00:26.006559

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/minidlna/tests/test_functional.py 12 0:01:28.098358

PASSED TestMinidlnaApp::test_enable_disable 0:00:53.429622

Test enabling and disabling the app.

Setup

Call

Teardown

FAILED TestMinidlnaApp::test_run_diagnostics 0:00:08.219327

Test that all app diagnostics are passing.

AssertionError

Setup

Call

self = <plinth.modules.minidlna.tests.test_functional.TestMinidlnaApp object at 0x7fee7cad4550>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_run_diagnostics(self, session_browser):
        """Test that all app diagnostics are passing."""
        if not self.check_diagnostics:
            pytest.skip(f'Skipping diagnostics check for {self.app_name}.')
    
        time.sleep(self.diagnostics_delay)
        session_browser.find_by_id('id_extra_actions_button').click()
        submit(session_browser, form_class='form-diagnostics-button')
    
        warning_results = session_browser.find_by_css('.badge-warning')
        if warning_results:
            warnings.warn(
                f'Diagnostics warnings for {self.app_name}: {warning_results}')
    
        failure_results = session_browser.find_by_css('.badge-danger')
>       assert not failure_results
E       AssertionError

plinth/tests/functional/__init__.py:655: AssertionError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.minidlna.tests.test_functional.TestMinidlnaApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.minidlna.tests.test_functional.TestMinidlnaApp/test_run_diagnostics-session_browser.html

Teardown

PASSED TestMinidlnaApp::test_backup_restore 0:00:26.449409

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/mumble/tests/test_functional.py 31 0:01:59.992440

PASSED TestMumbleApp::test_change_root_channel_name 0:01:08.792437

Setup

Call

Teardown

PASSED TestMumbleApp::test_enable_disable 0:00:13.150218

Test enabling and disabling the app.

Setup

Call

Teardown

SKIPPED TestMumbleApp::test_run_diagnostics 0:00:07.319867

Test that all app diagnostics are passing.

Skipped: Skipping diagnostics check for mumble.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/functional/__init__.py', 643, 'Skipped: Skipping diagnostics check for mumble.')

Teardown

PASSED TestMumbleApp::test_backup_restore 0:00:30.729919

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/names/tests/test_components.py 11 0:00:00.027508

PASSED test_domain_type_init 0:00:00.002900

Test initialization of domain type object.

Setup

Call

Teardown

PASSED test_domain_type_get 0:00:00.002038

Test getting domain type object.

Setup

Call

Teardown

PASSED test_domain_type_list 0:00:00.001934

Test listing of all domain types.

Setup

Call

Teardown

PASSED test_domain_name_init 0:00:00.001986

Test initializing a domain name.

Setup

Call

Teardown

PASSED test_domain_name_service_normalization 0:00:00.002046

Test that passed services get normalized during initialization.

Setup

Call

Teardown

PASSED test_domain_name_getting_readable_services 0:00:00.002253

Test that getting readable string for services works

Setup

Call

Teardown

PASSED test_domain_name_has_service 0:00:00.003966

Test checking if a domain name provides a service.

Setup

Call

Teardown

PASSED test_domain_name_remove 0:00:00.003698

Test removing a domain name from global list.

Setup

Call

Teardown

PASSED test_domain_name_get 0:00:00.002139

Test retrieving a domain name using component ID.

Setup

Call

Teardown

PASSED test_domain_name_list 0:00:00.002126

Test that retrieving list of domain name objects.

Setup

Call

Teardown

PASSED test_domain_name_list_names 0:00:00.002423

Test that retrieving list of unique domain names works.

Setup

Call

Teardown

plinth/modules/names/tests/test_names.py 2 0:00:00.004515

PASSED test_on_domain_added 0:00:00.002363

Test adding a domain to the global list.

Setup

Call

Teardown

PASSED test_on_domain_removed 0:00:00.002152

Test removing a domain from the global list.

Setup

Call

Teardown

plinth/modules/openvpn/tests/test_configuration.py 4 0:00:00.033419

PASSED test_identify_rsa_configuration 0:00:00.017259

Identify RSA configuration based on configuration file.

Setup

Call

Teardown

PASSED test_identify_ecc_configuration 0:00:00.002860

Identify ECC configuration based on configuration file.

Setup

Call

Teardown

PASSED test_is_setup_with_rsa 0:00:00.007198

is_setup should work with RSA configuration.

Setup

Call

Teardown

PASSED test_is_setup_with_ecc 0:00:00.006103

is_setup should work with RSA configuration.

Setup

Call

Teardown

plinth/modules/openvpn/tests/test_functional.py 5 0:01:23.097598

ERROR TestOpenvpnApp::test_download_profile 0:01:22.208460

Test that OpenVPN profile is downloadable.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7cd4e7c0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp object at 0x7fee7c7133d0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:373: in _change_app_status
    change_checkbox_status(browser, app_name, checkbox_id,
plinth/tests/functional/__init__.py:211: in change_checkbox_status
    checkbox.check()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7cd4e7c0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_download_profile-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_download_profile-session_browser.html

Teardown

ERROR TestOpenvpnApp::test_user_group 0:00:00.204477

Test that only users in vpn group have access.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7ce1d820>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp object at 0x7fee7c5d8280>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:373: in _change_app_status
    change_checkbox_status(browser, app_name, checkbox_id,
plinth/tests/functional/__init__.py:211: in change_checkbox_status
    checkbox.check()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7ce1d820>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_user_group-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_user_group-session_browser.html

Teardown

ERROR TestOpenvpnApp::test_backup_restore 0:00:00.216729

Test backup and restore of app data.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7c5d6280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp object at 0x7fee7cc39940>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:373: in _change_app_status
    change_checkbox_status(browser, app_name, checkbox_id,
plinth/tests/functional/__init__.py:211: in change_checkbox_status
    checkbox.check()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7c5d6280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_backup_restore-session_browser.html

Teardown

ERROR TestOpenvpnApp::test_enable_disable 0:00:00.228162

Test enabling and disabling the app.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7cd31c10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp object at 0x7fee7c7546d0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:373: in _change_app_status
    change_checkbox_status(browser, app_name, checkbox_id,
plinth/tests/functional/__init__.py:211: in change_checkbox_status
    checkbox.check()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7cd31c10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_enable_disable-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_enable_disable-session_browser.html

Teardown

ERROR TestOpenvpnApp::test_run_diagnostics 0:00:00.239770

Test that all app diagnostics are passing.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7c72be50>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp object at 0x7fee7c72b1f0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:373: in _change_app_status
    change_checkbox_status(browser, app_name, checkbox_id,
plinth/tests/functional/__init__.py:211: in change_checkbox_status
    checkbox.check()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7c72be50>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "id_openvpn-enabled"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.openvpn.tests.test_functional.TestOpenvpnApp/test_run_diagnostics-session_browser.html

Teardown

plinth/modules/pagekite/tests/test_functional.py 4 0:06:29.182933

PASSED TestPagekiteApp::test_configure 0:02:09.814193

Test pagekite configuration.

Setup

Call

Teardown

PASSED TestPagekiteApp::test_backup_restore 0:02:10.455792

Test backup and restore of configuration.

Setup

Call

Teardown

PASSED TestPagekiteApp::test_enable_disable 0:01:24.595572

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestPagekiteApp::test_run_diagnostics 0:00:44.317376

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/pagekite/tests/test_pagekite.py 1 0:00:00.001987

PASSED test_convert_service_to_string 0:00:00.001987

Test deconstructing parameter dictionaries into strings

Setup

Call

Teardown

plinth/modules/performance/tests/test_functional.py 3 0:04:50.226117

PASSED TestPerformanceApp::test_enable_disable 0:03:49.756307

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestPerformanceApp::test_run_diagnostics 0:00:23.456273

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestPerformanceApp::test_backup_restore 0:00:37.013537

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/privoxy/tests/test_functional.py 3 0:02:05.492613

PASSED TestPrivoxyApp::test_enable_disable 0:01:23.614374

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestPrivoxyApp::test_run_diagnostics 0:00:21.598623

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestPrivoxyApp::test_backup_restore 0:00:20.279616

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/quassel/tests/test_functional.py 3 0:01:20.356925

PASSED TestQuasselApp::test_enable_disable 0:00:48.066547

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestQuasselApp::test_run_diagnostics 0:00:06.918399

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestQuasselApp::test_backup_restore 0:00:25.371980

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/radicale/tests/test_functional.py 4 0:02:11.475326

PASSED TestRadicaleApp::test_access_rights 0:01:22.336795

Test setting the access rights.

Setup

Call

Teardown

PASSED TestRadicaleApp::test_backup_restore 0:00:31.953061

Test backup and restore of configuration.

Setup

Call

Teardown

PASSED TestRadicaleApp::test_enable_disable 0:00:10.432719

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestRadicaleApp::test_run_diagnostics 0:00:06.752751

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/roundcube/tests/test_functional.py 3 0:04:21.779120

PASSED TestRoundcubeApp::test_enable_disable 0:03:48.116579

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/roundcube https://mordor:4430/roundcube 404 Not Found
URL = https://mordor:4430/roundcube/ https://mordor:4430/roundcube Roundcube Webmail :: Welcome to Roundcube Webmail

Teardown

PASSED TestRoundcubeApp::test_run_diagnostics 0:00:10.862217

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestRoundcubeApp::test_backup_restore 0:00:22.800323

Test that backup and restore operations work on the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/roundcube/ https://mordor:4430/roundcube Roundcube Webmail :: Welcome to Roundcube Webmail

Teardown

plinth/modules/samba/tests/test_functional.py 141 0:04:07.495722

FAILED TestSambaApp::test_backup_restore 0:02:57.888725

Test backing up and restoring.

subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_home', '-c', 'mkdir _plinth-test_wtNtYVAv; rmdir _plinth-test_wtNtYVAv']' returned non-zero exit status 1.

Setup

Call

self = <plinth.modules.samba.tests.test_functional.TestSambaApp object at 0x7fee82b9a190>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.mark.backups
    def test_backup_restore(self, session_browser):
        """Test backing up and restoring."""
        _set_share(session_browser, 'home', status='enabled')
        functional.backup_create(session_browser, 'samba', 'test_samba')
        _set_share(session_browser, 'home', status='disabled')
        functional.backup_restore(session_browser, 'samba', 'test_samba')
        assert functional.service_is_running(session_browser, 'samba')
>       _assert_share_is_writable('home')

plinth/modules/samba/tests/test_functional.py:37: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/samba/tests/test_functional.py:100: in _assert_share_is_writable
    output = _write_to_share(share_type, as_guest)
plinth/modules/samba/tests/test_functional.py:95: in _write_to_share
    return subprocess.check_output(smb_command).decode()
/usr/lib/python3.9/subprocess.py:424: in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

input = None, capture_output = False, timeout = None, check = True
popenargs = (['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', ...],)
kwargs = {'stdout': -1}
process = <Popen: returncode: 1 args: ['smbclient', '-W', 'WORKGROUP', '-p', '445', '-...>
stdout = b'', stderr = None, retcode = 1

    def run(*popenargs,
            input=None, capture_output=False, timeout=None, check=False, **kwargs):
        """Run command with arguments and return a CompletedProcess instance.
    
        The returned instance will have attributes args, returncode, stdout and
        stderr. By default, stdout and stderr are not captured, and those attributes
        will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
    
        If check is True and the exit code was non-zero, it raises a
        CalledProcessError. The CalledProcessError object will have the return code
        in the returncode attribute, and output & stderr attributes if those streams
        were captured.
    
        If timeout is given, and the process takes too long, a TimeoutExpired
        exception will be raised.
    
        There is an optional argument "input", allowing you to
        pass bytes or a string to the subprocess's stdin.  If you use this argument
        you may not also use the Popen constructor's "stdin" argument, as
        it will be used internally.
    
        By default, all communication is in bytes, and therefore any "input" should
        be bytes, and the stdout and stderr will be bytes. If in text mode, any
        "input" should be a string, and stdout and stderr will be strings decoded
        according to locale encoding, or by "encoding" if set. Text mode is
        triggered by setting any of text, encoding, errors or universal_newlines.
    
        The other arguments are the same as for the Popen constructor.
        """
        if input is not None:
            if kwargs.get('stdin') is not None:
                raise ValueError('stdin and input arguments may not both be used.')
            kwargs['stdin'] = PIPE
    
        if capture_output:
            if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
                raise ValueError('stdout and stderr arguments may not be used '
                                 'with capture_output.')
            kwargs['stdout'] = PIPE
            kwargs['stderr'] = PIPE
    
        with Popen(*popenargs, **kwargs) as process:
            try:
                stdout, stderr = process.communicate(input, timeout=timeout)
            except TimeoutExpired as exc:
                process.kill()
                if _mswindows:
                    # Windows accumulates the output in a single blocking
                    # read() call run on child threads, with the timeout
                    # being done in a join() on those threads.  communicate()
                    # _after_ kill() is required to collect that and add it
                    # to the exception.
                    exc.stdout, exc.stderr = process.communicate()
                else:
                    # POSIX _communicate already populated the output so
                    # far into the TimeoutExpired exception.
                    process.wait()
                raise
            except:  # Including KeyboardInterrupt, communicate handled that.
                process.kill()
                # We don't call process.wait() as .__exit__ does that for us.
                raise
            retcode = process.poll()
            if check and retcode:
>               raise CalledProcessError(retcode, process.args,
                                         output=stdout, stderr=stderr)
E               subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_home', '-c', 'mkdir _plinth-test_wtNtYVAv; rmdir _plinth-test_wtNtYVAv']' returned non-zero exit status 1.

/usr/lib/python3.9/subprocess.py:528: CalledProcessError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_backup_restore-session_browser.html
Captured stderr call
do_connect: Connection to mordor failed (Error NT_STATUS_CONNECTION_REFUSED)

Teardown

FAILED TestSambaApp::test_enable_disable_samba_share[open] 0:00:15.176905

Test enabling and disabling Samba share.

subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk', '-c', 'mkdir _plinth-test_BwicYiGi; rmdir _plinth-test_BwicYiGi']' returned non-zero exit status 1.

Setup

Call

self = <plinth.modules.samba.tests.test_functional.TestSambaApp object at 0x7fee7c5c55b0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
share_type = 'open'

    @pytest.mark.parametrize('share_type', ['open', 'group', 'home'])
    def test_enable_disable_samba_share(self, session_browser, share_type):
        """Test enabling and disabling Samba share."""
        _set_share(session_browser, share_type, status='enabled')
    
>       _assert_share_is_writable(share_type)

plinth/modules/samba/tests/test_functional.py:44: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/samba/tests/test_functional.py:100: in _assert_share_is_writable
    output = _write_to_share(share_type, as_guest)
plinth/modules/samba/tests/test_functional.py:95: in _write_to_share
    return subprocess.check_output(smb_command).decode()
/usr/lib/python3.9/subprocess.py:424: in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

input = None, capture_output = False, timeout = None, check = True
popenargs = (['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', ...],)
kwargs = {'stdout': -1}
process = <Popen: returncode: 1 args: ['smbclient', '-W', 'WORKGROUP', '-p', '445', '-...>
stdout = b'', stderr = None, retcode = 1

    def run(*popenargs,
            input=None, capture_output=False, timeout=None, check=False, **kwargs):
        """Run command with arguments and return a CompletedProcess instance.
    
        The returned instance will have attributes args, returncode, stdout and
        stderr. By default, stdout and stderr are not captured, and those attributes
        will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
    
        If check is True and the exit code was non-zero, it raises a
        CalledProcessError. The CalledProcessError object will have the return code
        in the returncode attribute, and output & stderr attributes if those streams
        were captured.
    
        If timeout is given, and the process takes too long, a TimeoutExpired
        exception will be raised.
    
        There is an optional argument "input", allowing you to
        pass bytes or a string to the subprocess's stdin.  If you use this argument
        you may not also use the Popen constructor's "stdin" argument, as
        it will be used internally.
    
        By default, all communication is in bytes, and therefore any "input" should
        be bytes, and the stdout and stderr will be bytes. If in text mode, any
        "input" should be a string, and stdout and stderr will be strings decoded
        according to locale encoding, or by "encoding" if set. Text mode is
        triggered by setting any of text, encoding, errors or universal_newlines.
    
        The other arguments are the same as for the Popen constructor.
        """
        if input is not None:
            if kwargs.get('stdin') is not None:
                raise ValueError('stdin and input arguments may not both be used.')
            kwargs['stdin'] = PIPE
    
        if capture_output:
            if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
                raise ValueError('stdout and stderr arguments may not be used '
                                 'with capture_output.')
            kwargs['stdout'] = PIPE
            kwargs['stderr'] = PIPE
    
        with Popen(*popenargs, **kwargs) as process:
            try:
                stdout, stderr = process.communicate(input, timeout=timeout)
            except TimeoutExpired as exc:
                process.kill()
                if _mswindows:
                    # Windows accumulates the output in a single blocking
                    # read() call run on child threads, with the timeout
                    # being done in a join() on those threads.  communicate()
                    # _after_ kill() is required to collect that and add it
                    # to the exception.
                    exc.stdout, exc.stderr = process.communicate()
                else:
                    # POSIX _communicate already populated the output so
                    # far into the TimeoutExpired exception.
                    process.wait()
                raise
            except:  # Including KeyboardInterrupt, communicate handled that.
                process.kill()
                # We don't call process.wait() as .__exit__ does that for us.
                raise
            retcode = process.poll()
            if check and retcode:
>               raise CalledProcessError(retcode, process.args,
                                         output=stdout, stderr=stderr)
E               subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk', '-c', 'mkdir _plinth-test_BwicYiGi; rmdir _plinth-test_BwicYiGi']' returned non-zero exit status 1.

/usr/lib/python3.9/subprocess.py:528: CalledProcessError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[open]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[open]-session_browser.html
Captured stderr call
do_connect: Connection to mordor failed (Error NT_STATUS_CONNECTION_REFUSED)

Teardown

FAILED TestSambaApp::test_enable_disable_samba_share[group] 0:00:15.563759

Test enabling and disabling Samba share.

subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_group', '-c', 'mkdir _plinth-test_XLVkkYUH; rmdir _plinth-test_XLVkkYUH']' returned non-zero exit status 1.

Setup

Call

self = <plinth.modules.samba.tests.test_functional.TestSambaApp object at 0x7fee7cd24910>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
share_type = 'group'

    @pytest.mark.parametrize('share_type', ['open', 'group', 'home'])
    def test_enable_disable_samba_share(self, session_browser, share_type):
        """Test enabling and disabling Samba share."""
        _set_share(session_browser, share_type, status='enabled')
    
>       _assert_share_is_writable(share_type)

plinth/modules/samba/tests/test_functional.py:44: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/samba/tests/test_functional.py:100: in _assert_share_is_writable
    output = _write_to_share(share_type, as_guest)
plinth/modules/samba/tests/test_functional.py:95: in _write_to_share
    return subprocess.check_output(smb_command).decode()
/usr/lib/python3.9/subprocess.py:424: in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

input = None, capture_output = False, timeout = None, check = True
popenargs = (['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', ...],)
kwargs = {'stdout': -1}
process = <Popen: returncode: 1 args: ['smbclient', '-W', 'WORKGROUP', '-p', '445', '-...>
stdout = b'', stderr = None, retcode = 1

    def run(*popenargs,
            input=None, capture_output=False, timeout=None, check=False, **kwargs):
        """Run command with arguments and return a CompletedProcess instance.
    
        The returned instance will have attributes args, returncode, stdout and
        stderr. By default, stdout and stderr are not captured, and those attributes
        will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
    
        If check is True and the exit code was non-zero, it raises a
        CalledProcessError. The CalledProcessError object will have the return code
        in the returncode attribute, and output & stderr attributes if those streams
        were captured.
    
        If timeout is given, and the process takes too long, a TimeoutExpired
        exception will be raised.
    
        There is an optional argument "input", allowing you to
        pass bytes or a string to the subprocess's stdin.  If you use this argument
        you may not also use the Popen constructor's "stdin" argument, as
        it will be used internally.
    
        By default, all communication is in bytes, and therefore any "input" should
        be bytes, and the stdout and stderr will be bytes. If in text mode, any
        "input" should be a string, and stdout and stderr will be strings decoded
        according to locale encoding, or by "encoding" if set. Text mode is
        triggered by setting any of text, encoding, errors or universal_newlines.
    
        The other arguments are the same as for the Popen constructor.
        """
        if input is not None:
            if kwargs.get('stdin') is not None:
                raise ValueError('stdin and input arguments may not both be used.')
            kwargs['stdin'] = PIPE
    
        if capture_output:
            if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
                raise ValueError('stdout and stderr arguments may not be used '
                                 'with capture_output.')
            kwargs['stdout'] = PIPE
            kwargs['stderr'] = PIPE
    
        with Popen(*popenargs, **kwargs) as process:
            try:
                stdout, stderr = process.communicate(input, timeout=timeout)
            except TimeoutExpired as exc:
                process.kill()
                if _mswindows:
                    # Windows accumulates the output in a single blocking
                    # read() call run on child threads, with the timeout
                    # being done in a join() on those threads.  communicate()
                    # _after_ kill() is required to collect that and add it
                    # to the exception.
                    exc.stdout, exc.stderr = process.communicate()
                else:
                    # POSIX _communicate already populated the output so
                    # far into the TimeoutExpired exception.
                    process.wait()
                raise
            except:  # Including KeyboardInterrupt, communicate handled that.
                process.kill()
                # We don't call process.wait() as .__exit__ does that for us.
                raise
            retcode = process.poll()
            if check and retcode:
>               raise CalledProcessError(retcode, process.args,
                                         output=stdout, stderr=stderr)
E               subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_group', '-c', 'mkdir _plinth-test_XLVkkYUH; rmdir _plinth-test_XLVkkYUH']' returned non-zero exit status 1.

/usr/lib/python3.9/subprocess.py:528: CalledProcessError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[group]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[group]-session_browser.html
Captured stderr call
do_connect: Connection to mordor failed (Error NT_STATUS_CONNECTION_REFUSED)

Teardown

FAILED TestSambaApp::test_enable_disable_samba_share[home] 0:00:10.782828

Test enabling and disabling Samba share.

subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_home', '-c', 'mkdir _plinth-test_iiKbEPxF; rmdir _plinth-test_iiKbEPxF']' returned non-zero exit status 1.

Setup

Call

self = <plinth.modules.samba.tests.test_functional.TestSambaApp object at 0x7fee7ce2c9a0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
share_type = 'home'

    @pytest.mark.parametrize('share_type', ['open', 'group', 'home'])
    def test_enable_disable_samba_share(self, session_browser, share_type):
        """Test enabling and disabling Samba share."""
        _set_share(session_browser, share_type, status='enabled')
    
>       _assert_share_is_writable(share_type)

plinth/modules/samba/tests/test_functional.py:44: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/samba/tests/test_functional.py:100: in _assert_share_is_writable
    output = _write_to_share(share_type, as_guest)
plinth/modules/samba/tests/test_functional.py:95: in _write_to_share
    return subprocess.check_output(smb_command).decode()
/usr/lib/python3.9/subprocess.py:424: in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

input = None, capture_output = False, timeout = None, check = True
popenargs = (['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', ...],)
kwargs = {'stdout': -1}
process = <Popen: returncode: 1 args: ['smbclient', '-W', 'WORKGROUP', '-p', '445', '-...>
stdout = b'', stderr = None, retcode = 1

    def run(*popenargs,
            input=None, capture_output=False, timeout=None, check=False, **kwargs):
        """Run command with arguments and return a CompletedProcess instance.
    
        The returned instance will have attributes args, returncode, stdout and
        stderr. By default, stdout and stderr are not captured, and those attributes
        will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
    
        If check is True and the exit code was non-zero, it raises a
        CalledProcessError. The CalledProcessError object will have the return code
        in the returncode attribute, and output & stderr attributes if those streams
        were captured.
    
        If timeout is given, and the process takes too long, a TimeoutExpired
        exception will be raised.
    
        There is an optional argument "input", allowing you to
        pass bytes or a string to the subprocess's stdin.  If you use this argument
        you may not also use the Popen constructor's "stdin" argument, as
        it will be used internally.
    
        By default, all communication is in bytes, and therefore any "input" should
        be bytes, and the stdout and stderr will be bytes. If in text mode, any
        "input" should be a string, and stdout and stderr will be strings decoded
        according to locale encoding, or by "encoding" if set. Text mode is
        triggered by setting any of text, encoding, errors or universal_newlines.
    
        The other arguments are the same as for the Popen constructor.
        """
        if input is not None:
            if kwargs.get('stdin') is not None:
                raise ValueError('stdin and input arguments may not both be used.')
            kwargs['stdin'] = PIPE
    
        if capture_output:
            if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
                raise ValueError('stdout and stderr arguments may not be used '
                                 'with capture_output.')
            kwargs['stdout'] = PIPE
            kwargs['stderr'] = PIPE
    
        with Popen(*popenargs, **kwargs) as process:
            try:
                stdout, stderr = process.communicate(input, timeout=timeout)
            except TimeoutExpired as exc:
                process.kill()
                if _mswindows:
                    # Windows accumulates the output in a single blocking
                    # read() call run on child threads, with the timeout
                    # being done in a join() on those threads.  communicate()
                    # _after_ kill() is required to collect that and add it
                    # to the exception.
                    exc.stdout, exc.stderr = process.communicate()
                else:
                    # POSIX _communicate already populated the output so
                    # far into the TimeoutExpired exception.
                    process.wait()
                raise
            except:  # Including KeyboardInterrupt, communicate handled that.
                process.kill()
                # We don't call process.wait() as .__exit__ does that for us.
                raise
            retcode = process.poll()
            if check and retcode:
>               raise CalledProcessError(retcode, process.args,
                                         output=stdout, stderr=stderr)
E               subprocess.CalledProcessError: Command '['smbclient', '-W', 'WORKGROUP', '-p', '445', '-U', 'tester%testingtesting', '\\\\mordor\\disk_home', '-c', 'mkdir _plinth-test_iiKbEPxF; rmdir _plinth-test_iiKbEPxF']' returned non-zero exit status 1.

/usr/lib/python3.9/subprocess.py:528: CalledProcessError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[home]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_enable_disable_samba_share[home]-session_browser.html
Captured stderr call
do_connect: Connection to mordor failed (Error NT_STATUS_CONNECTION_REFUSED)

Teardown

PASSED TestSambaApp::test_enable_disable 0:00:22.602744

Test enabling and disabling the app.

Setup

Call

Teardown

ERROR TestSambaApp::test_run_diagnostics 0:00:05.480760

Test that all app diagnostics are passing.

TypeError: expected string or bytes-like object

Setup

self = <plinth.modules.samba.tests.test_functional.TestSambaApp object at 0x7fee7c752730>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
plinth/tests/functional/__init__.py:370: in _change_app_status
    submit(browser, element=button)
plinth/tests/functional/__init__.py:203: in submit
    browser.find_by_css('input[type=submit]').click()
/usr/lib/python3.9/contextlib.py:124: in __exit__
    next(self.gen)
plinth/tests/functional/__init__.py:134: in wait_for_page_update
    WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url))
../../../../.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py:71: in until
    value = method(self._driver)
plinth/tests/functional/__init__.py:101: in __call__
    self.element.has_class('whatever_class')
../../../../.local/lib/python3.9/site-packages/splinter/driver/webdriver/__init__.py:917: in has_class
    re.search(r"(?:^|\s)" + re.escape(class_name) + r"(?:$|\s)", self["class"])
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

pattern = '(?:^|\\s)whatever_class(?:$|\\s)', string = None, flags = 0

    def search(pattern, string, flags=0):
        """Scan through string looking for a match to the pattern, returning
        a Match object, or None if no match was found."""
>       return _compile(pattern, flags).search(string)
E       TypeError: expected string or bytes-like object

/usr/lib/python3.9/re.py:201: TypeError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.samba.tests.test_functional.TestSambaApp/test_run_diagnostics-session_browser.html

Teardown

plinth/modules/samba/tests/test_views.py 5 0:00:00.049592

PASSED test_samba_shares_view 0:00:00.018867

Test that a share list has correct view data.

Setup

Call

Teardown

PASSED test_enable_samba_share_view 0:00:00.012996

Test that enabling share sends correct success message.

Setup

Call

Teardown

PASSED test_enable_samba_share_failed_view 0:00:00.005825

Test that share enabling failure sends correct error message.

Setup

Call

Teardown

PASSED test_disable_samba_share 0:00:00.005504

Test that enabling share sends correct success message.

Setup

Call

Teardown

PASSED test_disable_samba_share_failed_view 0:00:00.006399

Test that share disabling failure sends correct error message.

Setup

Call

Teardown

plinth/modules/searx/tests/test_functional.py 4 0:03:12.995813

PASSED test_enable_disable 0:02:01.452901

Test enabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/searx/ https://mordor:4430/searx FreedomBox Web Search
URL = https://mordor:4430/searx/ https://mordor:4430/searx 404 Not Found

Teardown

PASSED test_backup_restore 0:00:23.565106

Test backup and restore.

Setup

Call

Captured stdout call
URL = https://mordor:4430/searx/ https://mordor:4430/searx FreedomBox Web Search

Teardown

PASSED test_public_access 0:00:21.349283

Test enabling public access.

Setup

Call

Captured stdout call
URL = https://mordor:4430/searx/ https://mordor:4430/searx FreedomBox Web Search
URL = https://mordor:4430/plinth/accounts/sso/login/?next=https%3a%2f%2fmordor%3a4430%2fsearx%2f https://mordor:4430/searx FreedomBox

Teardown

PASSED test_preserve_public_access_setting 0:00:26.628522

Test that public access setting is preserved when disabling and re-enabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/searx/ https://mordor:4430/searx FreedomBox Web Search

Teardown

plinth/modules/security/tests/test_functional.py 2 0:00:19.427253

PASSED test_restricted_console_logins 0:00:02.371983

Test enabling and disabling restricted console logins.

Setup

Call

Teardown

PASSED test_backup_restore 0:00:17.055270

Test backup and restore of configuration.

Setup

Call

Teardown

plinth/modules/shaarli/tests/test_functional.py 4 0:03:01.068737

PASSED TestShaarliApp::test_add_bookmark 0:02:24.741034

Test adding a bookmark.

Setup

Call

Teardown

PASSED TestShaarliApp::test_enable_disable 0:00:11.413178

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/shaarli/ https://mordor:4430/shaarli 404 Not Found
URL = https://mordor:4430/shaarli/ https://mordor:4430/shaarli Shared bookmarks on https://mordor:4430/shaarli/

Teardown

PASSED TestShaarliApp::test_run_diagnostics 0:00:03.202137

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestShaarliApp::test_backup_restore 0:00:21.712388

Test that backup and restore operations work on the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/shaarli/ https://mordor:4430/shaarli Shared bookmarks on https://mordor:4430/shaarli/

Teardown

plinth/modules/shadowsocks/tests/test_functional.py 3 0:01:45.449590

PASSED TestShadowsocksApp::test_backup_restore 0:01:28.139966

Test backup and restore of configuration.

Setup

Call

Teardown

PASSED TestShadowsocksApp::test_enable_disable 0:00:10.094572

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestShadowsocksApp::test_run_diagnostics 0:00:07.215053

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/sharing/tests/test_functional.py 4 0:00:46.255854

PASSED test_add_remove_share 0:00:04.695333

Test adding and removing a share.

Setup

Call

Teardown

PASSED test_edit_share 0:00:06.222212

Test editing a share.

Setup

Call

Teardown

PASSED test_share_permissions 0:00:12.263921

Test share permissions.

Setup

Call

Captured stdout call
URL = https://mordor:4430/share/tmp/ https://mordor:4430/share/tmp Index of /share/tmp

Teardown

PASSED test_backup_restore 0:00:23.074388

Test backup and restore.

Setup

Call

Teardown

plinth/modules/snapshot/tests/test_functional.py 3 0:00:37.898827

PASSED test_create 0:00:09.706981

Test creating a snapshot.

Setup

Call

Teardown

PASSED test_configure 0:00:04.778412

Test configuring snapshots.

Setup

Call

Teardown

PASSED test_backup_restore 0:00:23.413435

Test backup and restore of configuration.

Setup

Call

Teardown

plinth/modules/ssh/tests/test_functional.py 3 0:00:37.392259

PASSED TestSshApp::test_enable_disable 0:00:09.391496

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestSshApp::test_run_diagnostics 0:00:07.449914

Test that all app diagnostics are passing.

Setup

Call

Teardown

PASSED TestSshApp::test_backup_restore 0:00:20.550849

Test that backup and restore operations work on the app.

Setup

Call

Teardown

plinth/modules/sso/tests/test_actions.py 1 0:00:02.307457

PASSED test_generate_ticket 0:00:02.307457

Test generating a ticket.

Setup

Call

Teardown

plinth/modules/sso/tests/test_functional.py 1 0:00:14.573161

PASSED test_app_access 0:00:14.573161

Test that only logged-in users can access Syncthing web interface.

Setup

Call

Captured stdout call
URL = https://mordor:4430/syncthing/ https://mordor:4430/syncthing/ (unknown device) | Syncthing

Teardown

plinth/modules/storage/tests/test_functional.py 1 0:00:00.039753

SKIPPED test_list_disks 0:00:00.039753

Test that root disk is shown on storage page.

Skipped: Storage doesn't work inside a container

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/storage/tests/test_functional.py', 21, "Skipped: Storage doesn't work inside a container")

Teardown

plinth/modules/storage/tests/test_storage.py 109 0:00:01.032816

SKIPPED test_simple_case 0:00:00.000580

Test a simple with no complications

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_extended_partition_free_space 0:00:00.000958

Test that free space does not show up when outside extended.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_gpt_partition_free_space 0:00:00.000566

Test that GPT partitions can be expanded.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_unsupported_file_system[gpt] 0:00:00.000477

Test that free space after unknown file system does not count.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_unsupported_file_system[msdos] 0:00:00.000466

Test that free space after unknown file system does not count.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_btrfs_expansion[gpt] 0:00:00.000530

Test that btrfs file system can be expanded.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_btrfs_expansion[msdos] 0:00:00.000464

Test that btrfs file system can be expanded.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_ext4_expansion[gpt] 0:00:00.000466

Test that ext4 file system can be expanded.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_ext4_expansion[msdos] 0:00:00.000471

Test that ext4 file system can be expanded.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

PASSED test_validate_directory[/missing-1] 0:00:00.116397

Test that directory validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory[/etc/os-release-2] 0:00:00.108358

Test that directory validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory[/root-3] 0:00:00.104446

Test that directory validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory[/-] 0:00:00.099184

Test that directory validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory[/etc/..-] 0:00:00.105617

Test that directory validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory_writable[/-4] 0:00:00.100001

Test that directory writable validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory_writable[/tmp-] 0:00:00.098985

Test that directory writable validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory_creatable[/var/lib/plinth_storage_test_not_exists-4] 0:00:00.099224

Test that directory creatable validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory_creatable[/tmp/plint_storage_test_not_exists-] 0:00:00.097741

Test that directory creatable validation returns expected output.

Setup

Call

Teardown

PASSED test_validate_directory_creatable[/var/../tmp/plint_storage_test_not_exists-] 0:00:00.097885

Test that directory creatable validation returns expected output.

Setup

Call

Teardown

plinth/modules/syncthing/tests/test_functional.py 6 0:02:29.746998

PASSED TestSyncthingApp::test_notifications 0:00:14.091673

Test that authentication and usage reporting notifications are not shown.

Setup

Call

Teardown

PASSED TestSyncthingApp::test_add_remove_folder 0:00:24.376533

Test adding and removing a folder.

Setup

Call

Teardown

PASSED TestSyncthingApp::test_backup_restore 0:00:44.601845

Test backup and restore of app data.

Setup

Call

Teardown

PASSED TestSyncthingApp::test_user_group_access 0:00:38.838013

Test that only users in syncthing-access group can access syncthing site.

Setup

Call

Captured stdout call
URL = https://mordor:4430/syncthing/ https://mordor:4430/syncthing/ (unknown device) | Syncthing
URL = https://mordor:4430/plinth?next=https%3a%2f%2fmordor%3a4430%2fsyncthing%2f https://mordor:4430/syncthing/ FreedomBox

Teardown

PASSED TestSyncthingApp::test_enable_disable 0:00:19.689198

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/syncthing/ https://mordor:4430/syncthing/ 404 Not Found
URL = https://mordor:4430/syncthing/ https://mordor:4430/syncthing/ (unknown device) | Syncthing

Teardown

PASSED TestSyncthingApp::test_run_diagnostics 0:00:08.149736

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/tor/tests/test_functional.py 61 0:19:39.316732

PASSED TestTorApp::test_set_tor_relay_configuration 0:04:23.774387

Test setting Tor relay configuration.

Setup

Call

Teardown

PASSED TestTorApp::test_set_tor_bridge_relay_configuration 0:02:25.101855

Test setting Tor bridge relay configuration.

Setup

Call

Teardown

PASSED TestTorApp::test_set_tor_hidden_services_configuration 0:03:19.426903

Test setting Tor hidden services configuration.

Setup

Call

Teardown

PASSED TestTorApp::test_set_download_software_packages_over_tor 0:01:29.408695

Test setting download software packages over Tor.

Setup

Call

Teardown

PASSED TestTorApp::test_backup_restore 0:03:55.451551

Test backup and restore of configuration.

Setup

Call

Teardown

PASSED TestTorApp::test_enable_disable 0:02:44.033233

Test enabling and disabling the app.

Setup

Call

Teardown

SKIPPED TestTorApp::test_run_diagnostics 0:01:22.120107

Test that all app diagnostics are passing.

Skipped: Skipping diagnostics check for tor.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/functional/__init__.py', 643, 'Skipped: Skipping diagnostics check for tor.')

Teardown

plinth/modules/tor/tests/test_tor.py 12 0:00:00.005184

SKIPPED TestTor::test_is_apt_transport_tor_enabled 0:00:00.000576

Test that is_apt_transport_tor_enabled does not raise any unhandled exceptions.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED TestTor::test_get_status 0:00:00.000482

Test that get_status does not raise any unhandled exceptions.

This should work regardless of whether tor is installed, or /etc/tor/torrc exists.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

PASSED TestTorForm::test_bridge_validator 0:00:00.004125

Test upstream bridges' form field validator.

Setup

Call

Teardown

plinth/modules/transmission/tests/test_functional.py 4 0:02:16.015085

PASSED TestTransmissionApp::test_upload_torrent 0:01:03.821564

Test uploading a torrent to Transmission.

Setup

Call

Teardown

PASSED TestTransmissionApp::test_backup_restore 0:00:34.592806

Test backup and restore of app data.

Setup

Call

Teardown

PASSED TestTransmissionApp::test_enable_disable 0:00:27.104235

Test enabling and disabling the app.

Setup

Call

Captured stdout call
URL = https://mordor:4430/transmission/web/ https://mordor:4430/transmission 404 Not Found
URL = https://mordor:4430/transmission/web/ https://mordor:4430/transmission Transmission Web Interface

Teardown

PASSED TestTransmissionApp::test_run_diagnostics 0:00:10.496480

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/ttrss/tests/test_functional.py 11 0:06:02.396095

PASSED test_enable_disable 0:05:50.140860

Test enabling the app.

Setup

Call

Teardown

FAILED test_backup_restore 0:00:12.255235

Test backup and restore of app data.

splinter.exceptions.ElementDoesNotExist: no elements could be found with id "feedDlg_feedUrl"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7c71cfd0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.mark.backups
    def test_backup_restore(session_browser):
        """Test backup and restore of app data."""
        functional.app_enable(session_browser, APP_ID)
>       _subscribe(session_browser)

plinth/modules/ttrss/tests/test_functional.py:39: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/ttrss/tests/test_functional.py:76: in _subscribe
    browser.find_by_id('feedDlg_feedUrl').fill(
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:76: in __getattr__
    return getattr(self.first, name)
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7c71cfd0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with id "feedDlg_feedUrl"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.ttrss.tests.test_functional/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.ttrss.tests.test_functional/test_backup_restore-session_browser.html

Teardown

plinth/modules/upgrades/tests/test_functional.py 2 0:00:51.240454

PASSED test_enable_automatic_upgrades 0:00:15.933999

Test enabling automatic upgrades.

Setup

Call

Teardown

PASSED test_backup_restore 0:00:35.306455

Test backup and restore of configuration.

Setup

Call

Teardown

plinth/modules/users/tests/test_actions.py 11 0:00:00.004223

SKIPPED test_create_user 0:00:00.000423

Test whether creating a new user works.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 238, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_change_user_password 0:00:00.000376

Test changing user password.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 250, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_change_password_as_non_admin_user 0:00:00.000358

Test changing user password as a non-admin user.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 272, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_change_other_users_password_as_non_admin 0:00:00.000352

Test that changing other user's password as a non-admin user fails.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 293, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_set_password_for_non_existent_user 0:00:00.000354

Test setting password for a non-existent user.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 308, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_rename_user 0:00:00.000354

Test whether renaming a user works.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 323, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_delete_user 0:00:00.000525

Test to check whether LDAP users can be deleted

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 354, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_delete_non_existent_user 0:00:00.000355

Deleting a non-existent user should fail.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 372, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_groups 0:00:00.000370

Test to check that LDAP groups can be deleted

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 379, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_delete_admin_group_fails 0:00:00.000397

Test that deleting the admin group fails.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 396, 'Skipped: LDAP is not configured')

Teardown

SKIPPED test_user_group_interactions 0:00:00.000359

Test adding/removing user from a groups.

Skipped: LDAP is not configured

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/users/tests/test_actions.py', 404, 'Skipped: LDAP is not configured')

Teardown

plinth/modules/users/tests/test_components.py 3 0:00:00.006436

PASSED test_create_users_and_groups_component 0:00:00.002298

Test initialization of users and groups component.

Setup

Call

Teardown

PASSED test_get_groups 0:00:00.002050

Test getting all the groups.

Test that: 1. Group names are unique 2. All components have the same global set of groups

Setup

Call

Teardown

PASSED test_check_username_reservation 0:00:00.002089

Test username reservations by multiple components.

Setup

Call

Teardown

plinth/modules/users/tests/test_functional.py 1224 0:01:07.483832

PASSED test_create_user 0:00:08.884135

Test creating a user.

Setup

Call

Teardown

PASSED test_rename_user 0:00:17.750519

Test renaming a user.

Setup

Call

Teardown

PASSED test_admin_users_can_change_own_ssh_keys 0:00:05.955649

Test that admin users can change their own ssh keys.

Setup

Call

Teardown

FAILED test_non_admin_users_can_change_own_ssh_keys 0:00:18.989590

Test that non-admin users can change their own ssh keys.

AssertionError: assert '' == 'somekey456'
  - somekey456

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_non_admin_users_can_change_own_ssh_keys(session_browser):
        """Test that non-admin users can change their own ssh keys."""
        _non_admin_user_exists(session_browser, 'alice')
        functional.login_with_account(session_browser, functional.base_url,
                                      'alice')
        _set_ssh_keys(session_browser, 'somekey456')
>       assert _get_ssh_keys(session_browser) == 'somekey456'
E       AssertionError: assert '' == 'somekey456'
E         - somekey456

plinth/modules/users/tests/test_functional.py:95: AssertionError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_non_admin_users_can_change_own_ssh_keys-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_non_admin_users_can_change_own_ssh_keys-session_browser.html

Teardown

FAILED test_admin_users_can_change_other_users_ssh_keys 0:00:00.344493

Test that admin users can change other user's ssh keys.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7beb7160>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_admin_users_can_change_other_users_ssh_keys(session_browser):
        """Test that admin users can change other user's ssh keys."""
>       _non_admin_user_exists(session_browser, 'alice')

plinth/modules/users/tests/test_functional.py:101: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:195: in _non_admin_user_exists
    functional.create_user(session_browser, name)
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7beb7160>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_other_users_ssh_keys-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_other_users_ssh_keys-session_browser.html

Teardown

PASSED test_users_can_remove_ssh_keys 0:00:10.143973

Test that users can remove ssh keys.

Setup

Call

Teardown

FAILED test_users_can_connect_passwordless_over_ssh 0:00:00.296147

Test that users can connect passwordless over ssh if the keys are set.

KeyError: 'ssh'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
tmp_path_factory = TempPathFactory(_given_basetemp=None, _trace=<pluggy._tracing.TagTracerSub object at 0x7fee82cca3d0>, _basetemp=PosixPath('/tmp/pytest-of-buildbot/pytest-661'))

    def test_users_can_connect_passwordless_over_ssh(session_browser,
                                                     tmp_path_factory):
        """Test that users can connect passwordless over ssh if the keys are
        set."""
>       functional.app_enable(session_browser, 'ssh')

plinth/modules/users/tests/test_functional.py:118: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'ssh', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'ssh'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_users_can_connect_passwordless_over_ssh-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_users_can_connect_passwordless_over_ssh-session_browser.html

Teardown

FAILED test_users_cannot_connect_passwordless_over_ssh 0:00:00.160891

Test that users cannot connect passwordless over ssh if the keys aren't set.

KeyError: 'ssh'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
tmp_path_factory = TempPathFactory(_given_basetemp=None, _trace=<pluggy._tracing.TagTracerSub object at 0x7fee82cca3d0>, _basetemp=PosixPath('/tmp/pytest-of-buildbot/pytest-661'))

    def test_users_cannot_connect_passwordless_over_ssh(session_browser,
                                                        tmp_path_factory):
        """Test that users cannot connect passwordless over ssh if the keys aren't
        set."""
>       functional.app_enable(session_browser, 'ssh')

plinth/modules/users/tests/test_functional.py:128: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'ssh', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'ssh'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_users_cannot_connect_passwordless_over_ssh-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_users_cannot_connect_passwordless_over_ssh-session_browser.html

Teardown

FAILED test_change_language[] 0:00:00.331341

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value=""]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be5e5b0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = ''

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be5e5b0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value=""]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[]-session_browser.html

Teardown

FAILED test_change_language[de] 0:00:00.258295

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="de"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be8fc10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'de'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be8fc10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="de"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[de]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[de]-session_browser.html

Teardown

FAILED test_change_language[nl] 0:00:00.350329

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="nl"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be56af0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'nl'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be56af0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="nl"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[nl]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[nl]-session_browser.html

Teardown

FAILED test_change_language[pt] 0:00:00.244315

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="pt"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7beba310>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'pt'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7beba310>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="pt"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[pt]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[pt]-session_browser.html

Teardown

FAILED test_change_language[tr] 0:00:00.275284

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="tr"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be36610>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'tr'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be36610>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="tr"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[tr]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[tr]-session_browser.html

Teardown

FAILED test_change_language[da] 0:00:00.304401

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="da"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bed5c10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'da'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bed5c10>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="da"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[da]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[da]-session_browser.html

Teardown

FAILED test_change_language[es] 0:00:00.233939

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="es"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be4b3a0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'es'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be4b3a0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="es"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[es]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[es]-session_browser.html

Teardown

FAILED test_change_language[fr] 0:00:00.310124

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="fr"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bdd2400>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'fr'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bdd2400>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="fr"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[fr]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[fr]-session_browser.html

Teardown

FAILED test_change_language[nb] 0:00:00.261315

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="nb"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bddf7f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'nb'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bddf7f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="nb"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[nb]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[nb]-session_browser.html

Teardown

FAILED test_change_language[pl] 0:00:00.225188

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="pl"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bd90310>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'pl'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bd90310>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="pl"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[pl]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[pl]-session_browser.html

Teardown

FAILED test_change_language[sv] 0:00:00.233711

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="sv"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bed6160>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'sv'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bed6160>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="sv"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[sv]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[sv]-session_browser.html

Teardown

FAILED test_change_language[ru] 0:00:00.252769

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="ru"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7becfd60>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'ru'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7becfd60>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="ru"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[ru]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[ru]-session_browser.html

Teardown

FAILED test_change_language[te] 0:00:00.283730

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="te"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bdd9430>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'te'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bdd9430>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="te"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[te]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[te]-session_browser.html

Teardown

FAILED test_change_language[zh-hans] 0:00:00.299730

Test changing the language.

splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="zh-hans"]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bd9f4f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
language_code = 'zh-hans'

    @pytest.mark.parametrize('language_code', _language_codes.values())
    def test_change_language(session_browser, language_code):
        """Test changing the language."""
>       _set_language(session_browser, language_code)

plinth/modules/users/tests/test_functional.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bd9f4f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value="zh-hans"]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[zh-hans]-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_change_language[zh-hans]-session_browser.html

Teardown

FAILED test_admin_users_can_set_others_as_inactive 0:00:00.284591

Test that admin users can set other users as inactive.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bd7a7f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_admin_users_can_set_others_as_inactive(session_browser):
        """Test that admin users can set other users as inactive."""
>       _non_admin_user_exists(session_browser, 'alice')

plinth/modules/users/tests/test_functional.py:145: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:195: in _non_admin_user_exists
    functional.create_user(session_browser, name)
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bd7a7f0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_set_others_as_inactive-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_set_others_as_inactive-session_browser.html

Teardown

FAILED test_admin_users_can_change_own_password 0:00:00.181970

Test that admin users can change their own password.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be55be0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_admin_users_can_change_own_password(session_browser):
        """Test that admin users can change their own password."""
>       _admin_user_exists(session_browser, 'testadmin')

plinth/modules/users/tests/test_functional.py:153: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:189: in _admin_user_exists
    functional.create_user(session_browser, name, groups=['admin'])
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be55be0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_own_password-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_own_password-session_browser.html

Teardown

FAILED test_admin_users_can_change_others_password 0:00:00.174795

Test that admin users can change other user's password.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bf14af0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_admin_users_can_change_others_password(session_browser):
        """Test that admin users can change other user's password."""
>       _non_admin_user_exists(session_browser, 'alice')

plinth/modules/users/tests/test_functional.py:163: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:195: in _non_admin_user_exists
    functional.create_user(session_browser, name)
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bf14af0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_others_password-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_admin_users_can_change_others_password-session_browser.html

Teardown

FAILED test_non_admin_users_can_change_own_password 0:00:00.180845

Test that non-admin users can change their own password.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7bc7e280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_non_admin_users_can_change_own_password(session_browser):
        """Test that non-admin users can change their own password."""
>       _non_admin_user_exists(session_browser, 'alice')

plinth/modules/users/tests/test_functional.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:195: in _non_admin_user_exists
    functional.create_user(session_browser, name)
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bc7e280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_non_admin_users_can_change_own_password-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_non_admin_users_can_change_own_password-session_browser.html

Teardown

ERROR test_delete_user 0:00:00.271762

Test deleting a user.

splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"
splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value=""]"

Setup

Call

self = <splinter.element_list.ElementList object at 0x7fee7be3aee0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_delete_user(session_browser):
        """Test deleting a user."""
>       _non_admin_user_exists(session_browser, 'alice')

plinth/modules/users/tests/test_functional.py:181: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:195: in _non_admin_user_exists
    functional.create_user(session_browser, name)
plinth/tests/functional/__init__.py:557: in create_user
    browser.links.find_by_href('/plinth/sys/users/create/').first.click()
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7be3aee0>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with link by href "/plinth/sys/users/create/"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_delete_user-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.users.tests.test_functional/test_delete_user-session_browser.html

Teardown

self = <splinter.element_list.ElementList object at 0x7fee7becc280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(scope='module', autouse=True)
    def fixture_background(session_browser):
        """Login."""
        functional.login(session_browser)
        yield
>       _set_language(session_browser, _language_codes['None'])

plinth/modules/users/tests/test_functional.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/modules/users/tests/test_functional.py:260: in _set_language
    browser.find_by_xpath('//select[@id="id_language"]//option[@value="' +
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7becc280>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with xpath "//select[@id="id_language"]//option[@value=""]"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

plinth/modules/users/tests/test_views.py 24 0:00:06.751183

PASSED test_users_list_view 0:00:00.607307

Test that users list view has correct view data.

Setup

Call

Teardown

PASSED test_create_user_view[test-new] 0:00:00.456804

Test that user creation with valid usernames succeeds.

Setup

Call

Teardown

PASSED test_create_user_view[test-neW@2_] 0:00:00.426931

Test that user creation with valid usernames succeeds.

Setup

Call

Teardown

PASSED test_create_user_invalid_admin_view[-error0] 0:00:00.151524

Test that user creation with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_create_user_invalid_admin_view[wrong_password-error1] 0:00:00.288902

Test that user creation with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_create_user_form_view 0:00:00.151292

Test that a username field on create form has correct attributes.

Setup

Call

Teardown

PASSED test_create_user_invalid_username_view[-tester] 0:00:00.290879

Test that user creation with invalid username fails.

Setup

Call

Teardown

PASSED test_create_user_invalid_username_view[test\xe9r] 0:00:00.288229

Test that user creation with invalid username fails.

Setup

Call

Teardown

PASSED test_create_user_invalid_username_view[test+test] 0:00:00.288318

Test that user creation with invalid username fails.

Setup

Call

Teardown

PASSED test_create_user_invalid_username_view[t] 0:00:00.289310

Test that user creation with invalid username fails.

Setup

Call

Teardown

PASSED test_create_user_invalid_username_view[test test] 0:00:00.289572

Test that user creation with invalid username fails.

Setup

Call

Teardown

PASSED test_create_user_taken_or_reserved_username_view[testuser-A user with that username already exists.] 0:00:00.291581

Test that user creation with taken or reserved username fails.

Setup

Call

Teardown

PASSED test_create_user_taken_or_reserved_username_view[root-Username is taken or is reserved.] 0:00:00.291620

Test that user creation with taken or reserved username fails.

Setup

Call

Teardown

PASSED test_create_user_taken_or_reserved_username_view[rooT-Username is taken or is reserved.] 0:00:00.294229

Test that user creation with taken or reserved username fails.

Setup

Call

Teardown

PASSED test_create_user_taken_or_reserved_username_view[debian-minetest-Username is taken or is reserved.] 0:00:00.291959

Test that user creation with taken or reserved username fails.

Setup

Call

Teardown

PASSED test_update_user_view 0:00:00.295551

Test that updating username succeeds.

Setup

Call

Teardown

PASSED test_update_user_invalid_admin_view[-error0] 0:00:00.153844

Test that updating username with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_update_user_invalid_admin_view[wrong_password-error1] 0:00:00.292321

Test that updating username with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_update_user_without_permissions_view 0:00:00.148482

Test that updating other user as non-admin user raises exception.

Setup

Call

Teardown

PASSED test_delete_user_view 0:00:00.150254

Test that user deletion succeeds.

Setup

Call

Teardown

PASSED test_user_change_password_view 0:00:00.426517

Test that changing password succeeds.

Setup

Call

Teardown

PASSED test_user_change_password_invalid_admin_view[-error0] 0:00:00.150180

Test that changing password with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_user_change_password_invalid_admin_view[wrong_password-error1] 0:00:00.288114

Test that changing password with an invalid admin password fails.

Setup

Call

Teardown

PASSED test_user_change_password_without_permissions_view 0:00:00.147462

Test that changing other user password as a non-admin user raises exception.

Setup

Call

Teardown

plinth/modules/wireguard/tests/test_forms.py 18 0:00:00.043113

PASSED test_validate_key_valid_patterns[gKQhVGla4UtdqeY1dQ21G5lqrnX5NFcSEAqzM5iSdl0=] 0:00:00.004353

Test that valid wireguard key patterns as accepted.

Setup

Call

Teardown

PASSED test_validate_key_valid_patterns[uHWSYIjPnS9fYFhZ0mf22IkOMyrWXDlfpXs6ve4QGHk=] 0:00:00.003131

Test that valid wireguard key patterns as accepted.

Setup

Call

Teardown

PASSED test_validate_key_invalid_patterns[gKQhVGla4UtdqeY1dQ21G5lqrnX5NFcSEAqzM5iSdl0] 0:00:00.002684

Test that invalid wireguard key patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_key_invalid_patterns[invalid-base64] 0:00:00.001996

Test that invalid wireguard key patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_key_invalid_patterns[] 0:00:00.002427

Test that invalid wireguard key patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_key_invalid_patterns[aW52YWxpZC1sZW5ndGg=] 0:00:00.002097

Test that invalid wireguard key patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_valid_patterns[[1::2]:1234] 0:00:00.002047

Test that valid wireguard endpoint patterns are accepted.

Setup

Call

Teardown

PASSED test_validate_endpoint_valid_patterns[1.2.3.4:1234] 0:00:00.002216

Test that valid wireguard endpoint patterns are accepted.

Setup

Call

Teardown

PASSED test_validate_endpoint_valid_patterns[example.com:1234] 0:00:00.002407

Test that valid wireguard endpoint patterns are accepted.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[] 0:00:00.002331

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4] 0:00:00.002062

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4:] 0:00:00.002142

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4:0] 0:00:00.002212

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4:65536] 0:00:00.002461

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4:1234invalid] 0:00:00.002461

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[1.2.3.4:invalid] 0:00:00.002055

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[[]:1234] 0:00:00.001930

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

PASSED test_validate_endpoint_invalid_patterns[[:1234] 0:00:00.002100

Test that invalid wireguard endpoint patterns are rejected.

Setup

Call

Teardown

plinth/modules/wireguard/tests/test_functional.py 41 0:01:03.001934

SKIPPED TestWireguardApp::test_backup_restore 0:00:32.159748

Skip the test.

Skipped: Does not implement backup/restore.

Setup

Call

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/modules/wireguard/tests/test_functional.py', 41, 'Skipped: Does not implement backup/restore.')

Teardown

PASSED TestWireguardApp::test_add_edit_delete_client 0:00:12.078866

Test adding, editing and deleting a WireGuard client.

Setup

Call

Teardown

PASSED TestWireguardApp::test_add_edit_delete_server 0:00:06.104637

Test adding, editing and deleting a WireGuard server.

Setup

Call

Teardown

PASSED TestWireguardApp::test_enable_disable 0:00:08.013069

Test enabling and disabling the app.

Setup

Call

Teardown

PASSED TestWireguardApp::test_run_diagnostics 0:00:04.645614

Test that all app diagnostics are passing.

Setup

Call

Teardown

plinth/modules/wordpress/tests/test_functional.py 14 0:04:08.221738

FAILED test_enable_disable 0:04:07.541734

Test enabling the app.

KeyError: 'wordpress'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_enable_disable(session_browser):
        """Test enabling the app."""
>       functional.app_disable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:24: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:387: in app_disable
    _change_app_status(browser, app_name, 'disabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'disabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_enable_disable-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_enable_disable-session_browser.html

Teardown

FAILED test_post 0:00:00.178524

Test writing a blog post.

KeyError: 'wordpress'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_post(session_browser):
        """Test writing a blog post."""
>       functional.app_enable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:37: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_post-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_post-session_browser.html

Teardown

FAILED test_public_mode 0:00:00.153138

Test that site is available without login in public mode.

KeyError: 'wordpress'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_public_mode(session_browser):
        """Test that site is available without login in public mode."""
>       functional.app_enable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_public_mode-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_public_mode-session_browser.html

Teardown

FAILED test_private_mode 0:00:00.146367

Test that site is not available without login in public mode.

KeyError: 'wordpress'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    def test_private_mode(session_browser):
        """Test that site is not available without login in public mode."""
>       functional.app_enable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:62: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_private_mode-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_private_mode-session_browser.html

Teardown

ERROR test_backup 0:00:00.201973

Test backing up and restoring.

KeyError: 'wordpress'
KeyError: 'wordpress'

Setup

Call

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.mark.backups
    def test_backup(session_browser):
        """Test backing up and restoring."""
>       functional.app_enable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:79: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_backup-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.wordpress.tests.test_functional/test_backup-session_browser.html

Teardown

session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(scope='module', autouse=True)
    def fixture_background(session_browser):
        """Login and install the app."""
        functional.login(session_browser)
        functional.install(session_browser, 'wordpress')
        yield
>       functional.app_disable(session_browser, 'wordpress')

plinth/modules/wordpress/tests/test_functional.py:19: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:387: in app_disable
    _change_app_status(browser, app_name, 'disabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'wordpress', change_status_to = 'disabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'wordpress'

plinth/tests/functional/__init__.py:372: KeyError

plinth/modules/zoph/tests/test_functional.py 3 0:01:10.743415

ERROR TestZophApp::test_enable_disable 0:01:08.844125

Test enabling and disabling the app.

splinter.exceptions.ElementDoesNotExist: no elements could be found with name "username"

Setup

self = <splinter.element_list.ElementList object at 0x7fee7bd29730>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
>           return self._container[index]
E           IndexError: list index out of range

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:42: IndexError

During handling of the above exception, another exception occurred:

self = <plinth.modules.zoph.tests.test_functional.TestZophApp object at 0x7fee82b4ebe0>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
>       login(session_browser)

plinth/tests/functional/__init__.py:625: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:253: in login
    login_with_account(browser, base_url, config['DEFAULT']['username'],
plinth/tests/functional/__init__.py:277: in login_with_account
    browser.fill('username', username)
../../../../.local/lib/python3.9/site-packages/splinter/driver/webdriver/__init__.py:596: in fill
    field = self.find_by_name(name).first
../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:57: in first
    return self[0]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <splinter.element_list.ElementList object at 0x7fee7bd29730>, index = 0

    def __getitem__(self, index):
        if not isinstance(index, int) and not isinstance(index, slice):
            return self.first[index]
        try:
            return self._container[index]
        except IndexError:
>           raise ElementDoesNotExist(
                u'no elements could be found with {0} "{1}"'.format(
                    self.find_by, self.query
                )
            )
E           splinter.exceptions.ElementDoesNotExist: no elements could be found with name "username"

../../../../.local/lib/python3.9/site-packages/splinter/element_list.py:44: ElementDoesNotExist

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_enable_disable-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_enable_disable-session_browser.html

Teardown

ERROR TestZophApp::test_run_diagnostics 0:00:00.943252

Test that all app diagnostics are passing.

KeyError: 'zoph'

Setup

self = <plinth.modules.zoph.tests.test_functional.TestZophApp object at 0x7fee7be36310>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'zoph', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'zoph'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_run_diagnostics-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_run_diagnostics-session_browser.html

Teardown

ERROR TestZophApp::test_backup_restore 0:00:00.956037

Test that backup and restore operations work on the app.

KeyError: 'zoph'

Setup

self = <plinth.modules.zoph.tests.test_functional.TestZophApp object at 0x7fee7bce7460>
session_browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>

    @pytest.fixture(autouse=True)
    def fixture_background(self, session_browser):
        """Login, install, and enable the app."""
        login(session_browser)
        install(session_browser, self.app_name)
>       app_enable(session_browser, self.app_name)

plinth/tests/functional/__init__.py:627: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
plinth/tests/functional/__init__.py:382: in app_enable
    _change_app_status(browser, app_name, 'enabled')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

browser = <splinter.driver.webdriver.firefox.WebDriver object at 0x7fee7d269ee0>
app_name = 'zoph', change_status_to = 'enabled'

    def _change_app_status(browser, app_name, change_status_to='enabled'):
        """Enable or disable application."""
        button = browser.find_by_css('button[name="app_enable_disable_button"]')
    
        if button:
            should_enable_field = browser.find_by_id('id_should_enable')
            if (should_enable_field.value == 'False' and change_status_to
                    == 'disabled') or (should_enable_field.value == 'True'
                                       and change_status_to == 'enabled'):
                submit(browser, element=button)
        else:
>           checkbox_id = _app_checkbox_id[app_name]
E           KeyError: 'zoph'

plinth/tests/functional/__init__.py:372: KeyError

===========================
pytest-splinter screenshots
===========================
png:  /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_backup_restore-session_browser.png
html: /var/lib/buildbot/workers/bilbo/functional-tests-dev/build/screenshots/plinth.modules.zoph.tests.test_functional.TestZophApp/test_backup_restore-session_browser.html

Teardown

plinth/tests/test_action_utils.py 25 0:00:00.016247

PASSED test_is_systemd_running 0:00:00.002834

Trivial white box test for a trivial implementation.

Setup

Call

Teardown

SKIPPED test_service_checks 0:00:00.000380

Test basic checks on status of an arbitrary service.

Skipped: systemd not available

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/test_action_utils.py', 41, 'Skipped: systemd not available')

Teardown

SKIPPED test_service_enable_and_disable 0:00:00.000379

Test enabling and disabling of an arbitrary service.

Skipped: systemd not available

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/test_action_utils.py', 55, 'Skipped: systemd not available')

Teardown

SKIPPED test_service_actions 0:00:00.000681

Trivial white box test for trivial implementations.

Skipped: systemd not available

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/test_action_utils.py', 75, 'Skipped: systemd not available')

Teardown

SKIPPED test_service_unmask 0:00:00.000460

Test unmasking of an arbitrary masked service.

Skipped: systemd not available

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/test_action_utils.py', 91, 'Skipped: systemd not available')

Teardown

PASSED test_get_hostname 0:00:00.010802

get_hostname returns a string.

In fact, the maximum length for a hostname is 253 characters, but anything longer than 80 is very suspicious, so we fail the test.

To avoid error messages pass as hostnames we seek and fail if we find some unexpected characters.

Setup

Call

Teardown

SKIPPED test_get_addresses 0:00:00.000711

Test that any FreedomBox has some addresses.

Skipped: ip command not available

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/plinth/tests/test_action_utils.py', 133, 'Skipped: ip command not available')

Teardown

plinth/tests/test_actions.py 172 0:00:00.214865

PASSED test_breakout_actions_dir 0:00:00.004983

  1. The actions directory can't be changed at run time.

Can't currently be tested, as the actions directory is hardcoded.

Setup

Call

Teardown

PASSED test_breakout_up 0:00:00.004185

3A. Users can't call actions above the actions directory.

Tests both a relative and a literal path.

Setup

Call

Teardown

PASSED test_breakout_down 0:00:00.004673

3B. Users can't call actions beneath the actions directory.

Setup

Call

Teardown

PASSED test_breakout_actions 0:00:00.004497

3C. Actions can't be used to run other actions.

If multiple actions are specified, bail out.

Setup

Call

Teardown

PASSED test_breakout_option_string 0:00:00.056339

3D. Option strings can't be used to run other actions.

Verify that shell control characters aren't interpreted.

Setup

Call

Teardown

PASSED test_breakout_option_list 0:00:00.067994

3D. Option lists can't be used to run other actions.

Verify that shell control characters aren't interpreted in option lists.

Setup

Call

Teardown

PASSED test_multiple_options_and_output 0:00:00.020684

  1. Multiple options can be provided as a list or as a tuple.

  2. Output is returned from the command.

Setup

Call

Teardown

SKIPPED test_is_package_manager_busy 0:00:00.000599

Test the behavior of is-package-manager-busy in both locked and unlocked states of the dpkg lock file.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_action_path 0:00:00.000485

Test that in development mode, python action scripts get the correct PYTHONPATH

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

PASSED test_log_command[cmd0-$ ls] 0:00:00.006536

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd1-$ ls] 0:00:00.005637

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd2-$ ls a b c] 0:00:00.004893

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd3-$ ls 'a b c'] 0:00:00.004906

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd4-$ ls 'a;'] 0:00:00.004676

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd5-# ls] 0:00:00.004760

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd6-# ls] 0:00:00.004726

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd7-tester$ ls] 0:00:00.004675

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd8-# ls] 0:00:00.004860

Test log messages for various action calls.

Setup

Call

Teardown

PASSED test_log_command[cmd9-# ejabberd add-domain --domainname freedombox.local] 0:00:00.004759

Test log messages for various action calls.

Setup

Call

Teardown

plinth/tests/test_app.py 37 0:00:00.091874

PASSED test_setup_state 0:00:00.011114

Test retrieving the current setup state of the app.

Setup

Call

Teardown

PASSED test_get_set_setup_version 0:00:00.004396

Setting and getting the setup version of the app.

Setup

Call

Teardown

PASSED test_enable_state_enable_disable 0:00:00.004605

Test enabling/disabling enable state component.

Setup

Call

Teardown

PASSED test_app_instantiation 0:00:00.002174

Test that App is instantiated properly.

Setup

Call

Teardown

PASSED test_app_get 0:00:00.001807

Test that an app can be correctly retrieved.

Setup

Call

Teardown

PASSED test_app_list 0:00:00.002069

Test listing all apps.

Setup

Call

Teardown

PASSED test_app_add 0:00:00.002105

Test adding a components to an App.

Setup

Call

Teardown

PASSED test_app_remove 0:00:00.002380

Test removing a component from an App.

Setup

Call

Teardown

PASSED test_get_component 0:00:00.002031

Test retrieving a component from an App.

Setup

Call

Teardown

PASSED test_get_components_of_type 0:00:00.001927

Test retrieving list of components of a given type.

Setup

Call

Teardown

PASSED test_app_setup 0:00:00.003205

Test that running setup on an app run setup on components.

Setup

Call

Teardown

PASSED test_app_enable 0:00:00.001918

Test that enabling an app enables components.

Setup

Call

Teardown

PASSED test_app_disable 0:00:00.001967

Test that disabling an app disables components.

Setup

Call

Teardown

PASSED test_app_is_enabled 0:00:00.002219

Test checking for app enabled.

Setup

Call

Teardown

PASSED test_app_is_enabled_with_no_leader_components 0:00:00.001790

When there are not leader components, app.is_enabled() returns True.

Setup

Call

Teardown

PASSED test_app_set_enabled 0:00:00.002058

Test that setting enabled effects only followers.

Setup

Call

Teardown

PASSED test_app_diagnose 0:00:00.002900

Test running diagnostics on an app.

Setup

Call

Teardown

PASSED test_app_has_diagnostics 0:00:00.002715

Test checking if app has diagnostics implemented.

Setup

Call

Teardown

PASSED test_component_initialization 0:00:00.001790

Test that component is initialized properly.

Setup

Call

Teardown

PASSED test_component_app_property 0:00:00.001994

Test component's app property.

Setup

Call

Teardown

PASSED test_component_setup 0:00:00.002091

Test running setup on component.

Setup

Call

Teardown

PASSED test_component_enable 0:00:00.001860

Test running enable on component.

Setup

Call

Teardown

PASSED test_component_disable 0:00:00.001786

Test running disable on component.

Setup

Call

Teardown

PASSED test_component_diagnose 0:00:00.002008

Test running diagnostics on component.

Setup

Call

Teardown

PASSED test_component_has_diagnostics 0:00:00.001917

Test checking if component has diagnostics implemented.

Setup

Call

Teardown

PASSED test_follower_component_initialization 0:00:00.001841

Test that follower component is initialized properly.

Setup

Call

Teardown

PASSED test_follower_component_set_enabled 0:00:00.002027

Test setting internal enabled state a follower component.

Setup

Call

Teardown

PASSED test_follower_component_enable 0:00:00.001997

Test enabling a follower component.

Setup

Call

Teardown

PASSED test_follower_component_disable 0:00:00.001899

Test disabling a follower component.

Setup

Call

Teardown

PASSED test_leader_component_initialization 0:00:00.001801

Test that leader component is initialized properly.

Setup

Call

Teardown

PASSED test_leader_component_is_enabled 0:00:00.001813

Test getting enabled state is not implemented in leader component.

Setup

Call

Teardown

PASSED test_info_initialization_without_args 0:00:00.001841

Test initializing the Info component without arguments.

Setup

Call

Teardown

PASSED test_info_initialization_with_args 0:00:00.001942

Test initializing the Info component with arguments.

Setup

Call

Teardown

PASSED test_info_clients_validation 0:00:00.001972

Test clients parameter validation during initialization.

Setup

Call

Teardown

PASSED test_enable_state_key 0:00:00.002109

Test getting the storage key for enable state component.

Setup

Call

Teardown

PASSED test_apps_init 0:00:00.003172

Test that initializing all apps works.

Setup

Call

Teardown

PASSED test_apps_init_circular_depends 0:00:00.002634

Test initializing apps with circular dependencies.

Setup

Call

Teardown

plinth/tests/test_cfg.py 7 0:00:00.027631

PASSED test_read_default_config_file 0:00:00.004677

Verify that the default config file can be read correctly.

Setup

Call

Teardown

PASSED test_read_primary_config_file 0:00:00.004253

Verify that the primary config file is used by default.

Setup

Call

Teardown

PASSED test_read_dot_d_config_files 0:00:00.005743

Verify that the configuration is read from .d directories.

Setup

Call

Teardown

PASSED test_read_develop_config_file 0:00:00.003665

Verify that the correct develop config file is used.

Setup

Call

Teardown

PASSED test_read_missing_config_file 0:00:00.002753

Verify that an exception is raised when there's no config file.

Setup

Call

Teardown

PASSED test_read_config_file_with_missing_sections 0:00:00.003261

Verify that missing configuration sections can be detected.

Setup

Call

Teardown

PASSED test_read_config_file_with_missing_options 0:00:00.003280

Verify that missing configuration options can be detected.

Setup

Call

Teardown

plinth/tests/test_clients.py 4 0:00:00.007701

PASSED test_of_type_web 0:00:00.001968

Test filtering clients of type web.

Setup

Call

Teardown

PASSED test_of_type_mobile 0:00:00.002132

Test filtering clients of type mobile.

Setup

Call

Teardown

PASSED test_of_type_desktop 0:00:00.001748

Test filtering clients of type desktop.

Setup

Call

Teardown

PASSED test_of_type_package 0:00:00.001853

Test filtering clients of type package.

Setup

Call

Teardown

plinth/tests/test_context_processors.py 2 0:00:00.016372

PASSED test_common 0:00:00.009271

Verify that the common() function returns the correct values.

Setup

Call

Teardown

PASSED test_common_border_conditions 0:00:00.007101

Verify that the common() function works for border conditions.

Setup

Call

Teardown

plinth/tests/test_custom_shortcuts.py 6 0:00:00.016467

PASSED test_non_existent_custom_shortcuts_file 0:00:00.002668

Test loading a non-existent shortcuts file.

Setup

Call

Teardown

PASSED test_blank_custom_shortcuts_file 0:00:00.002656

Test loading a shortcuts file that is blank.

Setup

Call

Teardown

PASSED test_empty_custom_shortcuts_list 0:00:00.003135

Test loading a shortcuts file that has zero shortcuts.

Setup

Call

Teardown

PASSED test_dotd_shortcuts_files 0:00:00.002847

Test loading a shortcuts file that has more files in .d directory.

Setup

Call

Teardown

PASSED test_custom_nextcloud_shortcut 0:00:00.002618

Test loading a shortcuts file that has nextcloud shortcut.

Setup

Call

Teardown

PASSED test_retrieved_custom_shortcut 0:00:00.002543

Test the value of loaded nextcloud shortcut.

Setup

Call

Teardown

plinth/tests/test_daemon.py 10 0:00:00.029864

PASSED test_initialization 0:00:00.002038

Test that component is initialized properly.

Setup

Call

Teardown

PASSED test_is_enabled 0:00:00.002621

Test that daemon enabled check works.

Setup

Call

Teardown

PASSED test_enable 0:00:00.002406

Test that enabling the daemon works.

Setup

Call

Teardown

PASSED test_disable 0:00:00.002690

Test that disabling the daemon works.

Setup

Call

Teardown

PASSED test_is_running 0:00:00.002391

Test that checking that the daemon is running works.

Setup

Call

Teardown

PASSED test_diagnose 0:00:00.003167

Test running diagnostics.

Setup

Call

Teardown

PASSED test_app_is_running 0:00:00.002270

Test that checking whether app is running works.

Setup

Call

Teardown

PASSED test_diagnose_port_listening 0:00:00.006962

Test running port listening diagnostics test.

Setup

Call

Teardown

PASSED test_diagnose_netcat 0:00:00.003493

Test running diagnostic test using netcat.

Setup

Call

Teardown

PASSED test_related_daemon_initialization 0:00:00.001827

Test that initializing related daemon works.

Setup

Call

Teardown

plinth/tests/test_frontpage.py 7 0:00:00.016147

PASSED test_shortcut_init_with_arguments 0:00:00.001873

Test initializing shortcut component without arguments.

Setup

Call

Teardown

PASSED test_shortcut_init 0:00:00.001954

Test initializing shortcut component.

Setup

Call

Teardown

PASSED test_shortcut_remove 0:00:00.001971

Test removing a shortcut global list of shortcuts.

Setup

Call

Teardown

PASSED test_shortcut_list_sorting 0:00:00.001932

Test listing shortcuts in sorted order.

Setup

Call

Teardown

PASSED test_shortcut_list_web_apps_only 0:00:00.002289

Test listing only web app shortcuts.

Setup

Call

Teardown

PASSED test_shortcut_list_with_username 0:00:00.002649

Test listing for particular users.

Setup

Call

Teardown

PASSED test_add_custom_shortcuts 0:00:00.003480

Test that adding custom shortcuts succeeds.

Setup

Call

Teardown

plinth/tests/test_kvstore.py 3 0:00:00.009448

PASSED test_get_set 0:00:00.003293

Verify that a set value can be retrieved.

Setup

Call

Teardown

PASSED test_get_set_complex_structures 0:00:00.003422

Verify that complex structures can be stored and retrieved.

Setup

Call

Teardown

PASSED test_get_default 0:00:00.002734

Verify that either a set value or its default can be retrieved.

Setup

Call

Teardown

plinth/tests/test_menu.py 6 0:00:00.073649

PASSED test_init 0:00:00.002550

Verify that main_menu and essential items are created.

Setup

Call

Teardown

PASSED test_menu_creation_without_arguments 0:00:00.001948

Verify the Menu state without initialization parameters.

Setup

Call

Teardown

PASSED test_menu_creation_with_arguments 0:00:00.002423

Verify the Menu state with initialization parameters.

Setup

Call

Teardown

PASSED test_sort_items 0:00:00.060445

Verify that menu items are sorted correctly.

Setup

Call

Teardown

PASSED test_active_item 0:00:00.003982

Verify that an active menu item can be correctly retrieved.

Setup

Call

Teardown

PASSED test_active_item_when_inside_subpath 0:00:00.002301

Verify that the current URL could be a sub-path of a menu item.

Setup

Call

Teardown

plinth/tests/test_middleware.py 10 0:00:00.064897

PASSED TestSetupMiddleware::test_module_view 0:00:00.015987

Test that only registered users can access the setup view.

Setup

Call

Teardown

PASSED TestSetupMiddleware::test_install_result_collection 0:00:00.015135

Test that module installation result is collected properly.

Setup

Call

Teardown

PASSED TestSetupMiddleware::test_404_urls 0:00:00.003411

Test how middleware deals with 404 URLs.

Setup

Call

Teardown

PASSED TestSetupMiddleware::test_url_not_an_application 0:00:00.003316

Test that none is returned for URLs that are not applications.

Setup

Call

Teardown

PASSED TestSetupMiddleware::test_module_is_up_to_date 0:00:00.004518

Test that none is returned when module is up-to-date.

Setup

Call

Teardown

PASSED TestAdminMiddleware::test_that_admin_view_is_denied_for_usual_user 0:00:00.004758

Test that normal user is denied for an admin view

Setup

Call

Teardown

PASSED TestAdminMiddleware::test_group_view_is_denied_for_non_group_user 0:00:00.004858

Test that group view is allowed for an admin user.

Setup

Call

Teardown

PASSED TestAdminMiddleware::test_group_view_is_allowed_for_group_user 0:00:00.004875

Test that group view is allowed for an admin user.

Setup

Call

Teardown

PASSED TestAdminMiddleware::test_that_admin_view_is_allowed_for_admin_user 0:00:00.004691

Test that admin user is allowed for an admin view

Setup

Call

Teardown

PASSED TestAdminMiddleware::test_that_public_view_is_allowed_for_normal_user 0:00:00.003348

Test that normal user is allowed for an public view

Setup

Call

Teardown

plinth/tests/test_network.py 9 0:00:00.006234

SKIPPED test_get_connection_list 0:00:00.000646

Check that we can get a list of available connections.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_get_connection 0:00:00.000623

Check that we can get a connection by name.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_edit_ethernet_connection 0:00:00.000648

Check that we can update an ethernet connection.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_edit_pppoe_connection 0:00:00.000822

Check that we can update a PPPoE connection.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_edit_wifi_connection 0:00:00.000637

Check that we can update a wifi connection.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_ethernet_manual_ipv4_address 0:00:00.000626

Check that we can manually set IPv4 address on ethernet.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_ethernet_manual_ipv6_address 0:00:00.000764

Check that we can manually set IPv6 address on ethernet.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_wifi_manual_ipv4_address 0:00:00.000819

Check that we can manually set IPv4 address on wifi.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

SKIPPED test_wifi_manual_ipv6_address 0:00:00.000649

Check that we can manually set IPv6 address on wifi.

Skipped: Needs to be root

Setup

('/var/lib/buildbot/workers/bilbo/functional-tests-dev/build/conftest.py', 93, 'Skipped: Needs to be root')

Teardown

plinth/tests/test_notification.py 54 0:00:00.561220

PASSED test_severity_value[exception-5] 0:00:00.005283

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_severity_value[error-4] 0:00:00.004363

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_severity_value[warning-3] 0:00:00.004238

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_severity_value[info-2] 0:00:00.004103

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_severity_value[debug-1] 0:00:00.004174

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_severity_value[x-invalid-2] 0:00:00.004104

Test that severity_value is mapper properly.

Setup

Call

Teardown

PASSED test_dismiss 0:00:00.006143

Test that setting dismissed value works.

Setup

Call

Teardown

PASSED test_severity_invalid_value 0:00:00.004151

Test valid values for severity.

Setup

Call

Teardown

PASSED test_severity_valid_values[exception] 0:00:00.004050

Test that valid values are accepted for severity.

Setup

Call

Teardown

PASSED test_severity_valid_values[error] 0:00:00.004150

Test that valid values are accepted for severity.

Setup

Call

Teardown

PASSED test_severity_valid_values[warning] 0:00:00.004033

Test that valid values are accepted for severity.

Setup

Call

Teardown

PASSED test_severity_valid_values[info] 0:00:00.004031

Test that valid values are accepted for severity.

Setup

Call

Teardown

PASSED test_severity_valid_values[debug] 0:00:00.005315

Test that valid values are accepted for severity.

Setup

Call

Teardown

PASSED test_valid_message_actions_body_template[values0] 0:00:00.003971

Test valid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_valid_message_actions_body_template[values1] 0:00:00.004064

Test valid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_valid_message_actions_body_template[values2] 0:00:00.004341

Test valid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_valid_message_actions_body_template[values3] 0:00:00.004007

Test valid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_invalid_message_actions_body_template[values0] 0:00:00.004031

Test invalid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_invalid_message_actions_body_template[values1] 0:00:00.004270

Test invalid values for message/actions/body_template.

Setup

Call

Teardown

PASSED test_valid_actions[None] 0:00:00.003992

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions1] 0:00:00.004252

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions2] 0:00:00.004127

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions3] 0:00:00.004031

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions4] 0:00:00.004099

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions5] 0:00:00.004010

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions6] 0:00:00.004124

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions7] 0:00:00.004093

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions8] 0:00:00.004012

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions9] 0:00:00.004146

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions10] 0:00:00.004104

Test valid values for actions.

Setup

Call

Teardown

PASSED test_valid_actions[actions11] 0:00:00.004032

Test valid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions] 0:00:00.004064

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions1] 0:00:00.004159

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions2] 0:00:00.004033

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions3] 0:00:00.004212

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions4] 0:00:00.004196

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions5] 0:00:00.004193

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions6] 0:00:00.004328

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions7] 0:00:00.004026

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions8] 0:00:00.004035

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions9] 0:00:00.004615

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_invalid_actions[actions10] 0:00:00.004167

Test invalid values for actions.

Setup

Call

Teardown

PASSED test_update 0:00:00.007036

Test updating a existing notification.

Setup

Call

Teardown

PASSED test_create 0:00:00.006553

Test creating a new notification works.

Setup

Call

Teardown

PASSED test_delete 0:00:00.005374

Test deleting a new notification works.

Setup

Call

Teardown

PASSED test_get 0:00:00.005897

Test retrieving a notification.

Setup

Call

Teardown

PASSED test_list_filter_key 0:00:00.007577

Test that list filter with key works.

Setup

Call

Teardown

PASSED test_list_filter_app_id 0:00:00.006607

Test that list filter with app_id works.

Setup

Call

Teardown

PASSED test_list_filter_dismissed 0:00:00.008657

Test that list filter with dismissed works.

Setup

Call

Teardown

PASSED test_list_filter_user 0:00:00.081022

Test that list filter with user works.

Setup

Call

Teardown

PASSED test_list_filter_group 0:00:00.012509

Test that list filter with group works.

Setup

Call

Teardown

PASSED test_list_filter_user_and_group 0:00:00.017166

Test that list filter with group works.

Setup

Call

Teardown

PASSED test_display_context 0:00:00.010954

Test display context for a notification.

Setup

Call

Teardown

PASSED test_display_context_body_template 0:00:00.213991

Test display context for a notification with body template.

Setup

Call

Teardown

plinth/tests/test_package.py 10 0:00:05.382272

PASSED TestPackageExpressions::test_package 0:00:00.501802

Test resolving package names.

Setup

Call

Teardown

PASSED TestPackageExpressions::test_package_or_expression 0:00:01.467437

Test resolving package OR expressions.

Setup

Call

Teardown

PASSED test_packages_init 0:00:00.002234

Test initialization of packages component.

Setup

Call

Teardown

PASSED test_packages_get_actual_packages 0:00:00.755111

Test resolving of package expressions to actual packages.

Setup

Call

Teardown

PASSED test_packages_setup 0:00:01.226851

Test setting up packages component.

Setup

Call

Teardown

PASSED test_diagnose 0:00:00.005509

Test checking for latest version of the package.

Setup

Call

Teardown

PASSED test_packages_find_conflicts 0:00:00.002248

Test finding conflicts.

Setup

Call

Teardown

PASSED test_packages_has_unavailable_packages 0:00:00.003953

Test checking for unavailable packages.

Setup

Call

Teardown

PASSED test_packages_installed 0:00:01.413830

Test packages_installed().

Setup

Call

Teardown

PASSED test_remove 0:00:00.003298

Test removing packages.

Setup

Call

Teardown

plinth/tests/test_templatetags.py 1 0:00:00.001906

PASSED test_highlighting 0:00:00.001906

Test detection of active subsubmenu items using request.path

Setup

Call

Teardown

plinth/tests/test_utils.py 7 0:00:00.034062

PASSED test_is_valid_user_name 0:00:00.001822

Test valid user names in Debian.

Setup

Call

Teardown

PASSED TestIsAdminUser::test_is_false_for_anonymous_user 0:00:00.002699

Test anonymous user is reported as non-admin.

Setup

Call

Teardown

PASSED TestIsAdminUser::test_values_for_authenticated_users 0:00:00.003998

Test correct return values for authenticated users.

Setup

Call

Teardown

PASSED TestIsAdminUser::test_caching_of_values 0:00:00.004615

Test that caching of values for authenticate users.

Setup

Call

Teardown

PASSED TestYAMLFileUtil::test_update_empty_yaml_file 0:00:00.012762

Update an empty YAML file with content.

Setup

Call

Teardown

PASSED TestYAMLFileUtil::test_update_non_empty_yaml_file 0:00:00.005882

Update a non-empty YAML file with modifications

Setup

Call

Teardown

PASSED TestYAMLFileUtil::test_context_exception 0:00:00.002283

Test that exception during update does not update file.

Setup

Call

Teardown

plinth/tests/test_views.py 12 0:00:00.022574

PASSED test_is_safe_url_valid_url[/plinth/login/] 0:00:00.001900

Test valid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_valid_url[/] 0:00:00.001859

Test valid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_valid_url[safe] 0:00:00.001934

Test valid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[] 0:00:00.001856

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[None] 0:00:00.001793

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[\\plinth] 0:00:00.001989

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[///plinth] 0:00:00.001806

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[https://example.com/plinth/login/] 0:00:00.001833

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[https:///example.com] 0:00:00.001843

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[https:///plinth/login] 0:00:00.001834

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[ftp://example.com] 0:00:00.001938

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

PASSED test_is_safe_url_invalid_url[https://[aabb::ccdd] 0:00:00.001988

Test invalid URLs for safe URL checks.

Setup

Call

Teardown

plinth/tests/test_web_server.py 3 0:00:01.495222

PASSED test_static_files_init 0:00:00.001842

Test that static files component is being initialized correctly.

Setup

Call

Teardown

PASSED test_static_files_list 0:00:00.001807

Test that static files components can be listed properly.

Setup

Call

Teardown

PASSED test_static_files_mount 0:00:01.491572

Test that mounting on CherryPy works as expected.

Setup

Call

Teardown

Captured stderr teardown
Destroying test database for alias 'default'...