Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

test: Use diffrent ports for tests #1093

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

NexVeridian
Copy link

@NexVeridian NexVeridian commented Dec 19, 2024

This pr changes the tests in tests/controller/middlewares.rs to use a different port for each test

Allowing all the tests run from the root of the repo to run in parallel

This might effect the tests in examples/demoand e2e but I think it doesn't?

Running cargo nextest run, at the root of the repo, without --test-threads 1 is also fixed by this pr

Benchmarks

Before

/loco/ > hyperfine --warmup 3 "cargo test" "cargo nextest run --test-threads 1"
Benchmark 1: cargo test
  Time (mean ± σ):     69.622 s ±  0.101 s    [User: 40.937 s, System: 21.684 s]
  Range (min … max):   69.527 s … 69.862 s    10 runs

Benchmark 2: cargo nextest run --test-threads 1
  Time (mean ± σ):     84.315 s ±  0.089 s    [User: 11.837 s, System: 1.974 s]
  Range (min … max):   84.188 s … 84.475 s    10 runs

After

/loco/ > hyperfine --warmup 3 "cargo test" "cargo nextest run"
Benchmark 1: cargo test
  Time (mean ± σ):     23.510 s ±  0.049 s    [User: 41.448 s, System: 23.575 s]
  Range (min … max):   23.444 s … 23.601 s    10 runs

Benchmark 2: cargo nextest run
  Time (mean ± σ):      8.911 s ±  0.076 s    [User: 6.219 s, System: 8.597 s]
  Range (min … max):    8.763 s …  8.956 s    10 runs

nextest logs

/loco/ > cargo nextest run
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.15s
------------
 Nextest run ID 47859125-a78a-4b9a-a861-66035436a27a with nextest profile: default
    Starting 202 tests across 2 binaries
        PASS [   0.054s] loco-rs bgworker::sqlt::tests::can_clear_jobs_older_than_with_status
        PASS [   0.058s] loco-rs bgworker::sqlt::tests::can_clear_jobs_older_than
        PASS [   0.048s] loco-rs bgworker::sqlt::tests::can_get_jobs_with_age
        PASS [   0.066s] loco-rs bgworker::skq::tests::test_default_custom_queues
        PASS [   0.066s] loco-rs bgworker::sqlt::tests::can_clear_by_status
        PASS [   0.059s] loco-rs bgworker::sqlt::tests::can_get_jobs
        PASS [   0.067s] loco-rs bgworker::sqlt::tests::can_complete_job_without_interval
        PASS [   0.068s] loco-rs bgworker::sqlt::tests::can_cancel_job_by_name
        PASS [   0.069s] loco-rs bgworker::sqlt::tests::can_clear
        PASS [   0.020s] loco-rs bgworker::tests::cat_import_jobs_form_file
        PASS [   0.076s] loco-rs bgworker::sqlt::tests::can_enqueue
        PASS [   0.035s] loco-rs bgworker::sqlt::tests::can_initialize_database
        PASS [   0.016s] loco-rs controller::app_routes::tests::can_load_empty_app_routes
        PASS [   0.042s] loco-rs bgworker::tests::can_dump_jobs
        PASS [   0.039s] loco-rs controller::app_routes::tests::can_load_app_route_from_default
        PASS [   0.042s] loco-rs controller::app_routes::tests::can_load_routes
        PASS [   0.036s] loco-rs controller::app_routes::tests::can_load_routes_with_root_prefix
        PASS [   0.213s] loco-rs cache::drivers::inmem::tests::can_get_key_value
        PASS [   0.213s] loco-rs cache::drivers::inmem::tests::can_clear
        PASS [   0.215s] loco-rs cache::drivers::inmem::tests::is_contains_key
        PASS [   0.216s] loco-rs cache::drivers::inmem::tests::can_remove_key
        PASS [   0.217s] loco-rs cache::tests::can_get_or_insert
        PASS [   0.027s] loco-rs controller::format::tests::builder_cookies_response
        PASS [   0.221s] loco-rs controller::app_routes::tests::can_request_method::case_1
        PASS [   0.220s] loco-rs controller::app_routes::tests::can_request_method::case_2
        PASS [   0.011s] loco-rs controller::format::tests::builder_etag_response
        PASS [   0.220s] loco-rs controller::app_routes::tests::can_request_method::case_3
        PASS [   0.027s] loco-rs controller::format::tests::builder_empty_response
        PASS [   0.219s] loco-rs controller::app_routes::tests::can_request_method::case_4
        PASS [   0.219s] loco-rs controller::app_routes::tests::can_request_method::case_5
        PASS [   0.026s] loco-rs controller::format::tests::builder_html_response
        PASS [   0.010s] loco-rs controller::format::tests::builder_set_headers_response
        PASS [   0.010s] loco-rs controller::format::tests::builder_set_status_code_response
        PASS [   0.025s] loco-rs controller::format::tests::builder_json_response
        PASS [   0.025s] loco-rs controller::format::tests::builder_redirect_response
        PASS [   0.029s] loco-rs controller::format::tests::builder_text_response
        PASS [   0.026s] loco-rs controller::format::tests::builder_view_response
        PASS [   0.030s] loco-rs controller::format::tests::builder_template_response
        PASS [   0.026s] loco-rs controller::format::tests::empty_response_format
        PASS [   0.027s] loco-rs controller::format::tests::empty_json_response_format
        PASS [   0.025s] loco-rs controller::format::tests::html_response_format
        PASS [   0.029s] loco-rs controller::format::tests::template_response
        PASS [   0.026s] loco-rs controller::middleware::auth::tests::can_extract_token::case_1
        PASS [   0.029s] loco-rs controller::format::tests::redirect_response
        PASS [   0.027s] loco-rs controller::format::tests::text_response_format
        PASS [   0.031s] loco-rs controller::format::tests::json_response_format
        PASS [   0.027s] loco-rs controller::format::tests::view_response
        PASS [   0.017s] loco-rs controller::middleware::catch_panic::tests::should_be_disabled
        PASS [   0.032s] loco-rs controller::middleware::auth::tests::can_extract_token::case_3
        PASS [   0.033s] loco-rs controller::middleware::auth::tests::can_extract_token::case_2
        PASS [   0.033s] loco-rs controller::middleware::auth::tests::can_extract_token::case_4
        PASS [   0.221s] loco-rs controller::app_routes::tests::can_request_method::case_7
        PASS [   0.222s] loco-rs controller::app_routes::tests::can_request_method::case_6
        PASS [   0.219s] loco-rs controller::app_routes::tests::can_request_method::case_9
        PASS [   0.220s] loco-rs controller::app_routes::tests::can_request_method::case_8
        PASS [   0.011s] loco-rs controller::middleware::cors::tests::should_be_disabled
        PASS [   0.027s] loco-rs controller::middleware::remote_ip::tests::test_parsing
        PASS [   0.030s] loco-rs controller::middleware::request_id::tests::create_or_fetch_request_id
        PASS [   0.027s] loco-rs controller::middleware::secure_headers::tests::can_override_headers
        PASS [   0.013s] loco-rs controller::views::engines::tests::can_render_view
        PASS [   0.027s] loco-rs controller::middleware::secure_headers::tests::can_set_headers
        PASS [   0.024s] loco-rs controller::middleware::secure_headers::tests::default_is_github_preset
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_human_size::case_1
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_human_size::case_2
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_human_size::case_3
        PASS [   0.009s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_percentage::case_1
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_percentage::case_2
        PASS [   0.009s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_to_percentage::case_3
        PASS [   0.011s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_01
        PASS [   0.011s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_02
        PASS [   0.011s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_03
        PASS [   0.011s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_04
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_05
        PASS [   0.009s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_06
        PASS [   0.009s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_07
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_08
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_09
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_10
        PASS [   0.010s] loco-rs controller::views::tera_builtins::filters::number::tests::test_number_with_delimiter::case_11
        PASS [   0.010s] loco-rs depcheck::tests::test_exact_version_match_for_minimum_requirement
        PASS [   0.009s] loco-rs depcheck::tests::test_invalid_version_format_in_cargo_lock
        PASS [   0.219s] loco-rs controller::middleware::catch_panic::tests::panic_enabled
        PASS [   0.009s] loco-rs depcheck::tests::test_no_crates_in_min_versions_map
        PASS [   0.010s] loco-rs depcheck::tests::test_multiple_crates_mixed_results
        PASS [   0.010s] loco-rs depcheck::tests::test_no_package_section_in_cargo_lock
        PASS [   0.009s] loco-rs environment::tests::test_display
        PASS [   0.011s] loco-rs environment::tests::test_into
        PASS [   0.013s] loco-rs environment::tests::test_from_folder
        PASS [   0.234s] loco-rs controller::middleware::cors::tests::cors_enabled::case_1
        PASS [   0.011s] loco-rs environment::tests::test_resolve_env
        PASS [   0.011s] loco-rs hash::tests::can_random_string
        PASS [   0.229s] loco-rs controller::middleware::cors::tests::cors_enabled::case_2
        PASS [   0.010s] loco-rs model::query::dsl::date_range::tests::condition_date_both
        PASS [   0.010s] loco-rs model::query::dsl::date_range::tests::condition_date_range_from
        PASS [   0.011s] loco-rs model::query::dsl::date_range::tests::condition_date_range_to
        PASS [   0.011s] loco-rs model::query::dsl::tests::condition_between
        PASS [   0.028s] loco-rs mailer::template::tests::can_render_template
        PASS [   0.230s] loco-rs controller::middleware::cors::tests::cors_enabled::case_5
        PASS [   0.231s] loco-rs controller::middleware::cors::tests::cors_enabled::case_4
        PASS [   0.011s] loco-rs model::query::dsl::tests::condition_contains
        PASS [   0.233s] loco-rs controller::middleware::cors::tests::cors_enabled::case_3
        PASS [   0.013s] loco-rs model::query::dsl::tests::condition_eq
        PASS [   0.038s] loco-rs mailer::email_sender::tests::can_send_email
        PASS [   0.017s] loco-rs model::query::dsl::tests::condition_ends_with
        PASS [   0.014s] loco-rs model::query::dsl::tests::condition_gt
        PASS [   0.017s] loco-rs model::query::dsl::tests::condition_is_not_null
        PASS [   0.020s] loco-rs model::query::dsl::tests::condition_gte
        PASS [   0.020s] loco-rs model::query::dsl::tests::condition_is_in
        PASS [   0.019s] loco-rs model::query::dsl::tests::condition_is_not_in
        PASS [   0.013s] loco-rs model::query::dsl::tests::condition_is_null
        PASS [   0.012s] loco-rs model::query::dsl::tests::condition_like
        PASS [   0.016s] loco-rs model::query::dsl::tests::condition_lt
        PASS [   0.016s] loco-rs model::query::dsl::tests::condition_lte
        PASS [   0.014s] loco-rs model::query::dsl::tests::condition_not_like
        PASS [   0.016s] loco-rs model::query::dsl::tests::condition_starts_with
        PASS [   0.016s] loco-rs scheduler::tests::can_load_from_config_local_config
        PASS [   0.021s] loco-rs model::query::dsl::tests::condition_not_between
        PASS [   0.021s] loco-rs model::query::dsl::tests::condition_ne
        PASS [   0.013s] loco-rs scheduler::tests::can_load_jobs_by_spec_tag_multiple_jobs
        PASS [   0.015s] loco-rs scheduler::tests::can_load_jobs_by_spec_tag_single_jobs
        PASS [   0.016s] loco-rs scheduler::tests::can_load_jobs_by_spec_with_job_name
        PASS [   0.016s] loco-rs storage::strategies::backup::tests::can_download
        PASS [   0.013s] loco-rs storage::strategies::backup::tests::copy_should_fail_when_at_least_one_failure_policy
        PASS [   0.231s] loco-rs controller::middleware::cors::tests::cors_options
        PASS [   0.011s] loco-rs storage::strategies::backup::tests::copy_should_fail_when_count_fail_policy
        PASS [   0.043s] loco-rs scheduler::tests::can_display_scheduler
        PASS [   0.032s] loco-rs scheduler::tests::can_prepare_command::case_1
        PASS [   0.014s] loco-rs storage::strategies::backup::tests::copy_should_pass_when_allow_backup_failure_policy
        PASS [   0.033s] loco-rs scheduler::tests::can_prepare_command::case_2
        PASS [   0.015s] loco-rs storage::strategies::backup::tests::copy_should_pass_when_at_least_one_failure_policy
        PASS [   0.015s] loco-rs storage::strategies::backup::tests::copy_should_pass_when_backup_all_policy
        PASS [   0.014s] loco-rs storage::strategies::backup::tests::delete_should_pass_when_backup_all_policy
        PASS [   0.015s] loco-rs storage::strategies::backup::tests::copy_should_pass_when_count_fail_policy
        PASS [   0.011s] loco-rs storage::strategies::backup::tests::rename_should_fail_when_at_least_one_failure_policy
        PASS [   0.015s] loco-rs storage::strategies::backup::tests::rename_should_fail_when_count_fail_policy
        PASS [   0.015s] loco-rs storage::strategies::backup::tests::rename_should_pass_when_allow_backup_failure_policy
        PASS [   0.012s] loco-rs storage::strategies::backup::tests::rename_should_pass_when_at_least_one_failure_policy
        PASS [   0.013s] loco-rs storage::strategies::backup::tests::rename_should_pass_when_backup_all_policy
        PASS [   0.013s] loco-rs storage::strategies::backup::tests::upload_should_pass_when_backup_all_policy
        PASS [   0.013s] loco-rs storage::strategies::backup::tests::rename_should_pass_when_count_fail_policy
        PASS [   0.012s] loco-rs storage::strategies::mirror::tests::can_download_when_primary_failed
        PASS [   0.013s] loco-rs storage::strategies::mirror::tests::can_download_when_primary_is_ok
        PASS [   0.012s] loco-rs storage::strategies::mirror::tests::copy_should_pass_when_primary_is_ok
        PASS [   0.014s] loco-rs storage::strategies::mirror::tests::copy_should_pass_fail_when_primary
        PASS [   0.012s] loco-rs storage::strategies::mirror::tests::rename_should_fail_when_primary_failed
        PASS [   0.012s] loco-rs storage::strategies::mirror::tests::rename_should_pass_when_allow_mirror_failure
        PASS [   0.013s] loco-rs storage::strategies::mirror::tests::rename_should_pass_when_primary_is_ok
        PASS [   0.015s] loco-rs storage::strategies::mirror::tests::should_pass_when_allow_mirror_failure
        PASS [   0.010s] loco-rs storage::strategies::mirror::tests::upload_should_pass_with_mirror_all_policy
        PASS [   0.011s] loco-rs storage::strategies::single::tests::can_copy_file_path
        PASS [   0.011s] loco-rs storage::strategies::single::tests::can_delete
        PASS [   0.011s] loco-rs storage::strategies::single::tests::can_rename_file_path
        PASS [   0.013s] loco-rs storage::strategies::single::tests::can_download
        PASS [   0.011s] loco-rs storage::strategies::single::tests::can_upload
        PASS [   0.017s] loco-rs testing::selector::tests::test_assert_attribute_eq
        PASS [   0.025s] loco-rs testing::selector::tests::test_assert_attribute_exists
        PASS [   0.023s] loco-rs testing::selector::tests::test_assert_count
        PASS [   0.023s] loco-rs testing::selector::tests::test_assert_css_eq
        PASS [   0.026s] loco-rs testing::selector::tests::test_assert_css_eq_list
        PASS [   0.027s] loco-rs testing::selector::tests::test_assert_css_exists
        PASS [   0.017s] loco-rs testing::selector::tests::test_assert_css_not_exists
        PASS [   0.028s] loco-rs testing::selector::tests::test_assert_css_eq_list_table
        PASS [   0.011s] loco-rs testing::selector::tests::test_assert_link
        PASS [   0.015s] loco-rs validation::tests::can_validate_email::case_1
        PASS [   0.017s] loco-rs testing::selector::tests::test_select
        PASS [   0.012s] loco-rs validation::tests::can_validate_email::case_2
        PASS [   0.037s] loco-rs validation::tests::can_validate_into_db_error::case_2
        PASS [   0.038s] loco-rs validation::tests::can_validate_into_db_error::case_1
        PASS [   0.216s] loco-rs scheduler::tests::can_load_from_env_config
        PASS [   1.082s] loco-rs bgworker::sqlt::tests::can_dequeue
        PASS [   1.081s] loco-rs bgworker::sqlt::tests::can_fail_job
        PASS [   1.090s] loco-rs bgworker::sqlt::tests::can_complete_job_with_interval
        PASS [   0.500s] loco-rs hash::tests::can_hah_password
        PASS [   3.067s] loco-rs auth::jwt::tests::can_generate_token::case_2
        PASS [   3.068s] loco-rs auth::jwt::tests::can_generate_token::case_1
        PASS [   3.068s] loco-rs auth::jwt::tests::can_generate_token::case_3
        PASS [   2.265s] loco-rs::mod controller::middlewares::cors::case_2
        PASS [   2.269s] loco-rs::mod controller::middlewares::cors::case_1
        PASS [   2.232s] loco-rs::mod controller::middlewares::etag::case_2
        PASS [   2.232s] loco-rs::mod controller::middlewares::etag::case_1
        PASS [   2.261s] loco-rs::mod controller::middlewares::cors::case_5
        PASS [   2.262s] loco-rs::mod controller::middlewares::cors::case_3
        PASS [   2.263s] loco-rs::mod controller::middlewares::cors::case_4
        PASS [   2.231s] loco-rs::mod controller::middlewares::fallback::case_1
        PASS [   2.231s] loco-rs::mod controller::middlewares::fallback::case_2
        PASS [   2.229s] loco-rs::mod controller::middlewares::fallback::case_4
        PASS [   2.231s] loco-rs::mod controller::middlewares::fallback::case_3
        PASS [   2.228s] loco-rs::mod controller::middlewares::limit_payload::case_1
        PASS [   2.254s] loco-rs::mod controller::middlewares::limit_payload::case_2
        PASS [   2.254s] loco-rs::mod controller::middlewares::panic::case_2
        PASS [   2.257s] loco-rs::mod controller::middlewares::remote_ip::case_2
        PASS [   2.257s] loco-rs::mod controller::middlewares::powered_by_header::case_2
        PASS [   2.258s] loco-rs::mod controller::middlewares::powered_by_header::case_1
        PASS [   2.259s] loco-rs::mod controller::middlewares::remote_ip::case_1
        PASS [   2.273s] loco-rs::mod controller::middlewares::panic::case_1
        PASS [   2.272s] loco-rs::mod controller::middlewares::secure_headers::case_2
        PASS [   2.271s] loco-rs::mod controller::middlewares::secure_headers::case_3
        PASS [   2.273s] loco-rs::mod controller::middlewares::secure_headers::case_1
        PASS [   2.232s] loco-rs::mod controller::middlewares::static_assets
        PASS [   2.235s] loco-rs::mod controller::middlewares::timeout::case_1
        PASS [   5.021s] loco-rs scheduler::tests::can_run
        PASS [   5.236s] loco-rs::mod controller::middlewares::timeout::case_2
------------
     Summary [   8.557s] 202 tests run: 202 passed, 0 skipped

@NexVeridian NexVeridian force-pushed the use-diffrent-ports-for-tests branch from 2a0247b to 3701aab Compare December 19, 2024 01:05
@NexVeridian NexVeridian changed the title test: Use diffrent ports for tests, drop serial_test test: Use diffrent ports for tests Dec 19, 2024
@NexVeridian NexVeridian force-pushed the use-diffrent-ports-for-tests branch from 3701aab to db412d2 Compare December 19, 2024 01:25
@jondot
Copy link
Contributor

jondot commented Dec 19, 2024

@NexVeridian do you see improvement in the CI test timings?

@NexVeridian
Copy link
Author

NexVeridian commented Dec 19, 2024

Yes, CI has less threads though, so it's not as noticeable

It should only be in .github/workflows/loco-rs-ci.yml

Before

running 25 tests
test controller::middlewares::cors::case_4 ... ok
test controller::middlewares::cors::case_2 ... ok
test controller::middlewares::cors::case_3 ... ok
test controller::middlewares::cors::case_1 ... ok
test controller::middlewares::cors::case_5 ... ok
test controller::middlewares::etag::case_1 ... ok
test controller::middlewares::etag::case_2 ... ok
test controller::middlewares::fallback::case_1 ... ok
test controller::middlewares::fallback::case_2 ... ok
test controller::middlewares::fallback::case_3 ... ok
test controller::middlewares::fallback::case_4 ... ok
test controller::middlewares::limit_payload::case_1 ... ok
test controller::middlewares::limit_payload::case_2 ... ok
test controller::middlewares::panic::case_1 ... ok
test controller::middlewares::panic::case_2 ... ok
test controller::middlewares::powered_by_header::case_1 ... ok
test controller::middlewares::powered_by_header::case_2 ... ok
test controller::middlewares::remote_ip::case_1 ... ok
test controller::middlewares::remote_ip::case_2 ... ok
test controller::middlewares::secure_headers::case_1 ... ok
test controller::middlewares::secure_headers::case_2 ... ok
test controller::middlewares::secure_headers::case_3 ... ok
test controller::middlewares::static_assets ... ok
test controller::middlewares::timeout::case_1 ... ok
test controller::middlewares::timeout::case_2 ... ok

test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 53.87s

After

running 25 tests
test controller::middlewares::cors::case_4 ... ok
test controller::middlewares::cors::case_3 ... ok
test controller::middlewares::cors::case_1 ... ok
test controller::middlewares::cors::case_2 ... ok
test controller::middlewares::etag::case_2 ... ok
test controller::middlewares::cors::case_5 ... ok
test controller::middlewares::etag::case_1 ... ok
test controller::middlewares::fallback::case_1 ... ok
test controller::middlewares::fallback::case_4 ... ok
test controller::middlewares::fallback::case_3 ... ok
test controller::middlewares::limit_payload::case_1 ... ok
test controller::middlewares::fallback::case_2 ... ok
test controller::middlewares::limit_payload::case_2 ... ok
test controller::middlewares::panic::case_1 ... ok
test controller::middlewares::panic::case_2 ... ok
test controller::middlewares::powered_by_header::case_1 ... ok
test controller::middlewares::powered_by_header::case_2 ... ok
test controller::middlewares::remote_ip::case_2 ... ok
test controller::middlewares::remote_ip::case_1 ... ok
test controller::middlewares::secure_headers::case_1 ... ok
test controller::middlewares::secure_headers::case_2 ... ok
test controller::middlewares::secure_headers::case_3 ... ok
test controller::middlewares::timeout::case_1 ... ok
test controller::middlewares::static_assets ... ok
test controller::middlewares::timeout::case_2 ... ok

test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 17.50s

After, Locally

test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.29s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants