diff --git a/.circleci/template.yml b/.circleci/template.yml index 1b5703220df..23b6f6a21c2 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -1,8 +1,11 @@ version: 2.1 references: - - &OTP25 mongooseim/cimg-erlang:25.3.2.9 - &OTP26 mongooseim/cimg-erlang:26.2.2 + - &OTP27 mongooseim/cimg-erlang:27.0 + - &OTP_PKG_VER 26.2.4 + - &OTP_PKG_VER_PREV 26.2.3 + - &OTP_PKG_VER_PREV_2 26.2.1 - &ENTRYPOINT ["/bin/sh", "-c", "eval ${INSTALL_DEPS_CMD:-echo} && echo __INJECT_FILES__ | eval ${BASE32DEC:-base32 --decode} | bash"] # Caches created via the save_cache step are stored for up to 15 days - &CERT_KEY certs-cache-{{ checksum "certs_cache_key" }}-v3 @@ -143,73 +146,73 @@ containers: entrypoint: *ENTRYPOINT executors: - otp_25: - docker: - - image: *OTP25 - resource_class: medium+ otp_26: docker: - image: *OTP26 resource_class: medium+ - otp_25_redis: + otp_27: docker: - - image: *OTP25 - - *redis_container + - image: *OTP27 + resource_class: medium+ otp_26_redis: docker: - image: *OTP26 - *redis_container - otp_26_redis_minio_rmq: + otp_27_redis: docker: - - image: *OTP26 + - image: *OTP27 + - *redis_container + otp_27_redis_minio_rmq: + docker: + - image: *OTP27 - *redis_container - *minio_container - *rabbit_container - otp_26_mysql_redis: + otp_27_mysql_redis: docker: - - image: *OTP26 + - image: *OTP27 - *redis_container - *mysql_container - *rabbit_container - otp_25_pgsql_redis: - docker: - - image: *OTP25 - - *redis_container - - *pgsql_container otp_26_pgsql_redis: docker: - image: *OTP26 - *redis_container - *pgsql_container - otp_25_ldap_redis: + otp_27_pgsql_redis: docker: - - image: *OTP25 + - image: *OTP27 - *redis_container - - *ldap_container + - *pgsql_container otp_26_ldap_redis: docker: - image: *OTP26 - *redis_container - *ldap_container - otp_26_mssql_redis: + otp_27_ldap_redis: docker: - - image: *OTP26 + - image: *OTP27 + - *redis_container + - *ldap_container + otp_27_mssql_redis: + docker: + - image: *OTP27 - *redis_container - *mssql_container - otp_26_elasticsearch_cassandra: + otp_27_elasticsearch_cassandra: docker: - - image: *OTP26 + - image: *OTP27 - *redis_container - *elasticsearch_container - *cassandra_container - *cassandra_proxy_container - otp_26_arm64: + otp_27_arm64: docker: - - image: *OTP26 + - image: *OTP27 resource_class: arm.medium - otp_26_redis_arm64: + otp_27_redis_arm64: docker: - - image: *OTP26 + - image: *OTP27 - *redis_container resource_class: arm.medium commands: @@ -701,277 +704,277 @@ workflows: name: build_and_deploy_docs context: mongooseim-org requires: - - otp_26_docker + - otp_27_docker filters: &release_tags tags: only: /^\d+\.\d+\.\d+/ # ============= PACKAGES ============= - package: name: rockylinux_8 - executor: otp_26 + executor: otp_27 platform: rockylinux_8 context: mongooseim-org - otp_package: "26.2.4" + otp_package: *OTP_PKG_VER filters: *all_tags - package: name: almalinux_8 - executor: otp_26 + executor: otp_27 platform: almalinux_8 context: mongooseim-org - otp_package: "26.2.4" + otp_package: *OTP_PKG_VER filters: *all_tags - package: name: debian_bullseye - executor: otp_26 + executor: otp_27 platform: debian_bullseye context: mongooseim-org - otp_package: "26.2.1" + otp_package: *OTP_PKG_VER_PREV_2 filters: *all_tags - package: name: debian_buster - executor: otp_26 + executor: otp_27 platform: debian_buster context: mongooseim-org - otp_package: "26.2.3" + otp_package: *OTP_PKG_VER_PREV filters: *all_tags - package: name: ubuntu_jammy - executor: otp_26 + executor: otp_27 platform: ubuntu_jammy context: mongooseim-org - otp_package: "26.2.3" + otp_package: *OTP_PKG_VER_PREV filters: *all_tags - package: name: ubuntu_focal - executor: otp_26 + executor: otp_27 platform: ubuntu_focal context: mongooseim-org - otp_package: "26.2.1" + otp_package: *OTP_PKG_VER_PREV_2 filters: *all_tags - package: name: ubuntu_bionic - executor: otp_26 + executor: otp_27 platform: ubuntu_bionic context: mongooseim-org - otp_package: "26.2.3" + otp_package: *OTP_PKG_VER_PREV filters: *all_tags # ======== BASE DOCKER BUILDS ======== - build_in_docker: - name: otp_26_docker - executor: otp_26 + name: otp_27_docker + executor: otp_27 context: mongooseim-org build_prod: true filters: *all_tags - build_in_docker: - name: otp_25_docker - executor: otp_25 + name: otp_26_docker + executor: otp_26 context: mongooseim-org build_prod: false filters: *all_tags - build_in_docker: - name: otp_26_docker_arm64 - executor: otp_26_arm64 + name: otp_27_docker_arm64 + executor: otp_27_arm64 context: mongooseim-org build_prod: true arch: arm64 filters: *all_tags # ============= DIALYZER ============= - dialyzer: - name: dialyzer_25 - executor: otp_25 + name: dialyzer_26 + executor: otp_26 context: mongooseim-org requires: - - otp_25_docker + - otp_26_docker filters: *all_tags - dialyzer: - name: dialyzer_26 - executor: otp_26 + name: dialyzer_27 + executor: otp_27 context: mongooseim-org requires: - - otp_26_docker + - otp_27_docker filters: *all_tags # ============= XREF ============= - xref: name: xref - executor: otp_26 + executor: otp_27 context: mongooseim-org requires: - - otp_26_docker + - otp_27_docker filters: *all_tags # ============= EDOC ============= - edoc: name: edoc - executor: otp_26 + executor: otp_27 context: mongooseim-org requires: - - otp_26_docker + - otp_27_docker filters: *all_tags # ============= SMALL TESTS ============= - small_tests_in_docker: - name: small_tests_25 - executor: otp_25_redis + name: small_tests_26 + executor: otp_26_redis context: mongooseim-org requires: - - otp_25_docker + - otp_26_docker filters: *all_tags - small_tests_in_docker: - name: small_tests_26 - executor: otp_26_redis + name: small_tests_27 + executor: otp_27_redis context: mongooseim-org requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - small_tests_in_docker: - name: small_tests_26_arm64 - executor: otp_26_redis_arm64 + name: small_tests_27_arm64 + executor: otp_27_redis_arm64 context: mongooseim-org requires: - - otp_26_docker_arm64 + - otp_27_docker_arm64 filters: *all_tags # ============= BIG TESTS ============= - big_tests_in_docker: - name: internal_mnesia_26 - executor: otp_26_redis_minio_rmq + name: internal_mnesia_27 + executor: otp_27_redis_minio_rmq context: mongooseim-org preset: internal_mnesia db: "mnesia minio" tls_dist: true requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: pgsql_cets_26 - executor: otp_26_pgsql_redis + name: pgsql_cets_27 + executor: otp_27_pgsql_redis context: mongooseim-org preset: pgsql_cets db: "mnesia postgres cets" requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: mysql_redis_26 - executor: otp_26_mysql_redis + name: mysql_redis_27 + executor: otp_27_mysql_redis context: mongooseim-org preset: mysql_redis requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: dynamic_domains_mysql_redis_26 + name: dynamic_domains_mysql_redis_27 spec: dynamic_domains.spec - executor: otp_26_mysql_redis + executor: otp_27_mysql_redis context: mongooseim-org preset: mysql_redis requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: pgsql_mnesia_25 - executor: otp_25_pgsql_redis + name: pgsql_mnesia_26 + executor: otp_26_pgsql_redis context: mongooseim-org preset: pgsql_mnesia requires: - - otp_25_docker + - otp_26_docker filters: *all_tags - big_tests_in_docker: - name: pgsql_mnesia_26 - executor: otp_26_pgsql_redis + name: pgsql_mnesia_27 + executor: otp_27_pgsql_redis context: mongooseim-org preset: pgsql_mnesia requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: dynamic_domains_pgsql_mnesia_26 + name: dynamic_domains_pgsql_mnesia_27 spec: dynamic_domains.spec - executor: otp_26_pgsql_redis + executor: otp_27_pgsql_redis context: mongooseim-org preset: pgsql_mnesia requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: dynamic_domains_pgsql_mnesia_25 + name: dynamic_domains_pgsql_mnesia_26 spec: dynamic_domains.spec - executor: otp_25_pgsql_redis + executor: otp_26_pgsql_redis context: mongooseim-org preset: pgsql_mnesia requires: - - otp_25_docker + - otp_26_docker filters: *all_tags - big_tests_in_docker: - name: mssql_mnesia_26 - executor: otp_26_mssql_redis + name: mssql_mnesia_27 + executor: otp_27_mssql_redis context: mongooseim-org preset: odbc_mssql_mnesia db: "mssql redis" requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: dynamic_domains_mssql_mnesia_26 + name: dynamic_domains_mssql_mnesia_27 spec: dynamic_domains.spec - executor: otp_26_mssql_redis + executor: otp_27_mssql_redis context: mongooseim-org preset: odbc_mssql_mnesia db: "mssql redis" requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: ldap_mnesia_25 - executor: otp_25_ldap_redis + name: ldap_mnesia_26 + executor: otp_26_ldap_redis context: mongooseim-org preset: ldap_mnesia db: "ldap redis" requires: - - otp_25_docker + - otp_26_docker filters: *all_tags - big_tests_in_docker: - name: ldap_mnesia_26 - executor: otp_26_ldap_redis + name: ldap_mnesia_27 + executor: otp_27_ldap_redis context: mongooseim-org preset: ldap_mnesia db: "ldap redis" requires: - - otp_26_docker + - otp_27_docker filters: *all_tags - big_tests_in_docker: - name: elasticsearch_and_cassandra_26 + name: elasticsearch_and_cassandra_27 spec: mam.spec - executor: otp_26_elasticsearch_cassandra + executor: otp_27_elasticsearch_cassandra context: mongooseim-org preset: elasticsearch_and_cassandra_mnesia db: "elasticsearch cassandra" requires: - - otp_26_docker + - otp_27_docker filters: *all_tags # ============= DOCKER IMAGE BUILD & UPLOAD ============= - docker_image: name: docker_build_and_ship - executor: otp_26 + executor: otp_27 context: mongooseim-org requires: - - small_tests_25 - - ldap_mnesia_25 - - pgsql_mnesia_25 - - dynamic_domains_pgsql_mnesia_25 - - dialyzer_25 - - small_tests_26 - - internal_mnesia_26 - - pgsql_cets_26 - - pgsql_mnesia_26 - - mysql_redis_26 - - mssql_mnesia_26 - ldap_mnesia_26 - - elasticsearch_and_cassandra_26 + - pgsql_mnesia_26 - dynamic_domains_pgsql_mnesia_26 - - dynamic_domains_mysql_redis_26 - - dynamic_domains_mssql_mnesia_26 - dialyzer_26 - - small_tests_26_arm64 + + - small_tests_27 + - internal_mnesia_27 + - pgsql_cets_27 + - pgsql_mnesia_27 + - mysql_redis_27 + - mssql_mnesia_27 + - ldap_mnesia_27 + - elasticsearch_and_cassandra_27 + - dynamic_domains_pgsql_mnesia_27 + - dynamic_domains_mysql_redis_27 + - dynamic_domains_mssql_mnesia_27 + - dialyzer_27 + - small_tests_27_arm64 - xref - edoc @@ -979,14 +982,14 @@ workflows: filters: *all_tags - docker_smoke_test: name: docker_smoke_test - executor: otp_26 + executor: otp_27 context: mongooseim-org requires: - docker_build_and_ship filters: *all_tags - docker_smoke_test: name: docker_smoke_test_arm64 - executor: otp_26_arm64 + executor: otp_27_arm64 context: mongooseim-org requires: - docker_build_and_ship diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9018f9fdac4..82a1f5507b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: ## the full list of supported (prebuilt) OTP versions for ubuntu-22.04 runners ## can be found here: ## https://builds.hex.pm/builds/otp/ubuntu-22.04/builds.txt - otp: [ '25.3.2.9', '26.2.2' ] + otp: [ '26.2.2', '27.0' ] runs-on: ubuntu-22.04 env: PRESET: 'small_tests' @@ -66,7 +66,7 @@ jobs: matrix: preset: [internal_mnesia, pgsql_mnesia, mysql_redis, odbc_mssql_mnesia, ldap_mnesia, elasticsearch_and_cassandra_mnesia] - otp: [ '26.1.2' ] + otp: [ '27.0' ] include: - test-spec: "default.spec" - preset: elasticsearch_and_cassandra_mnesia @@ -101,7 +101,7 @@ jobs: fail-fast: false matrix: preset: [pgsql_mnesia, mysql_redis, odbc_mssql_mnesia] - otp: [ '26.1.2' ] + otp: [ '27.0' ] test-spec: ["dynamic_domains.spec"] include: - preset: pgsql_mnesia diff --git a/big_tests/rebar.config b/big_tests/rebar.config index 2a14913dfab..e839fccc076 100644 --- a/big_tests/rebar.config +++ b/big_tests/rebar.config @@ -16,11 +16,17 @@ {proper, "1.4.0"}, {gun, "2.1.0"}, {fusco, "0.1.1"}, - {escalus, {git, "git@github.com:esl/escalus.git", {branch, "ws-stream-management"}}}, -% {escalus, "4.2.12"}, + {escalus, {git, "https://github.com/esl/escalus.git", {branch, "ws-stream-management"}}}, + {fast_tls, "1.1.21"}, {cowboy, "2.12.0"}, {csv, "3.0.3", {pkg, csve}}, - {amqp_client, "3.12.14"}, + {amqp_client, "3.13.0-rc.2"}, + {rabbit_common, "3.13.4"}, {esip, "1.0.52"}, {jid, "2.1.0", {pkg, mongoose_jid}} ]}. + +{overrides, [ + %% Disable warnings_as_errors + {override, worker_pool, [{erl_opts, []}]} +]}. diff --git a/big_tests/rebar.lock b/big_tests/rebar.lock index 025395421ac..6e43da0dd06 100644 --- a/big_tests/rebar.lock +++ b/big_tests/rebar.lock @@ -1,5 +1,5 @@ {"1.2.0", -[{<<"amqp_client">>,{pkg,<<"amqp_client">>,<<"3.12.14">>},0}, +[{<<"amqp_client">>,{pkg,<<"amqp_client">>,<<"3.13.0-rc.2">>},0}, {<<"base16">>,{pkg,<<"base16">>,<<"2.0.1">>},0}, {<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.12.2">>},0}, {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.12.0">>},0}, @@ -9,14 +9,14 @@ 1}, {<<"csv">>,{pkg,<<"csve">>,<<"3.0.3">>},0}, {<<"escalus">>, - {git,"git@github.com:esl/escalus.git", + {git,"https://github.com/esl/escalus.git", {ref,"f99d6efe1028f645d8a17c9ab3fb8e4adab69a76"}}, 0}, {<<"esip">>,{pkg,<<"esip">>,<<"1.0.52">>},0}, {<<"exml">>,{pkg,<<"hexml">>,<<"3.4.1">>},0}, {<<"fast_pbkdf2">>,{pkg,<<"fast_pbkdf2">>,<<"1.0.5">>},2}, {<<"fast_scram">>,{pkg,<<"fast_scram">>,<<"0.6.0">>},1}, - {<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.19">>},1}, + {<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.21">>},0}, {<<"fusco">>,{pkg,<<"fusco">>,<<"0.1.1">>},0}, {<<"goldrush">>,{pkg,<<"goldrush">>,<<"0.1.9">>},1}, {<<"gun">>,{pkg,<<"gun">>,<<"2.1.0">>},0}, @@ -27,17 +27,17 @@ {<<"p1_utils">>,{pkg,<<"p1_utils">>,<<"1.0.25">>},1}, {<<"proper">>,{pkg,<<"proper">>,<<"1.4.0">>},0}, {<<"quickrand">>,{pkg,<<"quickrand">>,<<"2.0.7">>},2}, - {<<"rabbit_common">>,{pkg,<<"rabbit_common">>,<<"3.12.14">>},1}, + {<<"rabbit_common">>,{pkg,<<"rabbit_common">>,<<"3.13.4">>},0}, {<<"ranch">>,{pkg,<<"ranch">>,<<"1.8.0">>},1}, - {<<"recon">>,{pkg,<<"recon">>,<<"2.5.3">>},2}, + {<<"recon">>,{pkg,<<"recon">>,<<"2.5.3">>},1}, {<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.29">>},1}, {<<"stun">>,{pkg,<<"stun">>,<<"1.2.12">>},1}, - {<<"thoas">>,{pkg,<<"thoas">>,<<"1.0.0">>},2}, + {<<"thoas">>,{pkg,<<"thoas">>,<<"1.0.0">>},1}, {<<"uuid">>,{pkg,<<"uuid_erl">>,<<"2.0.7">>},1}, {<<"worker_pool">>,{pkg,<<"worker_pool">>,<<"6.2.0">>},1}]}. [ {pkg_hash,[ - {<<"amqp_client">>, <<"2B677BC3F2E2234BA7517042B25D72071A79735042E91F9116BD3C176854B622">>}, + {<<"amqp_client">>, <<"2C9975DA52319D8E613B5DBD3E931374B41AF6F571BD7A3F96CE50AD6C27441B">>}, {<<"base16">>, <<"F0549F732E03BE8124ED0D19FD5EE52146CC8BE24C48CBC3F23AB44B157F11A2">>}, {<<"bbmustache">>, <<"0CABDCE0DB9FE6D3318131174B9F2B351328A4C0AFBEB3E6E99BB0E02E9B621D">>}, {<<"cowboy">>, <<"F276D521A1FF88B2B9B4C54D0E753DA6C66DD7BE6C9FCA3D9418B561828A3731">>}, @@ -48,7 +48,7 @@ {<<"exml">>, <<"9581FE6512D9772C61BBE611CD4A8E5BB90B4D4481275325EC520F7A931A9393">>}, {<<"fast_pbkdf2">>, <<"6045138C4C209FC8222A0B18B2CB1D7BD7407EF4ADAD0F14C5E0F7F4726E3E41">>}, {<<"fast_scram">>, <<"70724F584A118DA147A51EE38DEE56203F217D58AD61E0BB2C2EF834C16B35B8">>}, - {<<"fast_tls">>, <<"F52731A4B35259FA06CF23E2A0732920AD9EFCE7C3D68377F129A474998747BB">>}, + {<<"fast_tls">>, <<"65D7D547A09EEFB37A1C0D04D8601FAC4F3E6E2C1EDE859A7787081670F9648D">>}, {<<"fusco">>, <<"3DD6A90151DFEF30EA1937CC44E9A59177C0094918388D9BCAA2F2DC5E2AE4AA">>}, {<<"goldrush">>, <<"F06E5D5F1277DA5C413E84D5A2924174182FB108DABB39D5EC548B27424CD106">>}, {<<"gun">>, <<"B4E4CBBF3026D21981C447E9E7CA856766046EFF693720BA43114D7F5DE36E87">>}, @@ -59,7 +59,7 @@ {<<"p1_utils">>, <<"2D39B5015A567BBD2CC7033EEB93A7C60D8C84EFE1EF69A3473FAA07FA268187">>}, {<<"proper">>, <<"89A44B8C39D28BB9B4BE8E4D715D534905B325470F2E0EC5E004D12484A79434">>}, {<<"quickrand">>, <<"D2BD76676A446E6A058D678444B7FDA1387B813710D1AF6D6E29BB92186C8820">>}, - {<<"rabbit_common">>, <<"466123EE7346A3CDAC078C0C302BCD36DA4523E8ACD678C1B992F7B4DF1F7914">>}, + {<<"rabbit_common">>, <<"68650FBCB8CE204CE28C116451C030E294BF916ED722B43A369D7586DA2A5605">>}, {<<"ranch">>, <<"8C7A100A139FD57F17327B6413E4167AC559FBC04CA7448E9BE9057311597A1D">>}, {<<"recon">>, <<"739107B9050EA683C30E96DE050BC59248FD27EC147696F79A8797FF9FA17153">>}, {<<"stringprep">>, <<"02F23E8C3A219A3DFE40A22E908BECE3A2F68AF0FF599EA8A7B714ECB21E62EE">>}, @@ -68,7 +68,7 @@ {<<"uuid">>, <<"B2078D2CC814F53AFA52D36C91E08962C7E7373585C623F4C0EA6DFB04B2AF94">>}, {<<"worker_pool">>, <<"506DE38C528A81ED2C6A80A419B83DDE6DA5E295BD320BDF4D35A69AFEB0247A">>}]}, {pkg_hash_ext,[ - {<<"amqp_client">>, <<"5F70B6C3B1A739790080DA4FDDC94A867E99F033C4B1EDC20D6FF8B8FB4BD160">>}, + {<<"amqp_client">>, <<"E86FD4B95291799BDE1571AF81077B5A5DB9653824FBE429F5BADAD831C52642">>}, {<<"base16">>, <<"06EA2D48343282E712160BA89F692B471DB8B36ABE8394F3445FF9032251D772">>}, {<<"bbmustache">>, <<"688B33A4D5CC2D51F575ADF0B3683FC40A38314A2F150906EDCFC77F5B577B3B">>}, {<<"cowboy">>, <<"8A7ABE6D183372CEB21CAA2709BEC928AB2B72E18A3911AA1771639BEF82651E">>}, @@ -79,7 +79,7 @@ {<<"exml">>, <<"D8E7894E2544402B4986EEB2443C15B51B14F686266F091DBF2777D1D99A2FA2">>}, {<<"fast_pbkdf2">>, <<"BC3B5A3CAB47AD114FF8BB815FEDE62A6187ACD14D8B37412F2AF8236A089CEF">>}, {<<"fast_scram">>, <<"771D034341599CFC6A6C5E56CF924B68D2C7478088CAF17419E3147B66914667">>}, - {<<"fast_tls">>, <<"DB34322C8782D4C5139CCB80709D8EC8C38089B44262EDD0C2F660AC495BD389">>}, + {<<"fast_tls">>, <<"131542913937025E48CD80AA81F00359686D5501B75621E72026A87B5229505B">>}, {<<"fusco">>, <<"6343551BD1E824F2A6CA85E1158C5B37C320FD449FBFEC7450A73F192AAF9022">>}, {<<"goldrush">>, <<"99CB4128CFFCB3227581E5D4D803D5413FA643F4EB96523F77D9E6937D994CEB">>}, {<<"gun">>, <<"52FC7FC246BFC3B00E01AEA1C2854C70A366348574AB50C57DFE796D24A0101D">>}, @@ -90,7 +90,7 @@ {<<"p1_utils">>, <<"9219214428F2C6E5D3187FF8EB9A8783695C2427420BE9A259840E07ADA32847">>}, {<<"proper">>, <<"18285842185BD33EFBDA97D134A5CB5A0884384DB36119FEE0E3CFA488568CBB">>}, {<<"quickrand">>, <<"B8ACBF89A224BC217C3070CA8BEBC6EB236DBE7F9767993B274084EA044D35F0">>}, - {<<"rabbit_common">>, <<"70C31A51F7401CC0204DDEF2745D98680C2E0DF67E3B0C9E198916881FDE3293">>}, + {<<"rabbit_common">>, <<"C0E8F2909EAECABC732990D26B75DE092E265D14E8AC9EAFD4813438F1CC2233">>}, {<<"ranch">>, <<"49FBCFD3682FAB1F5D109351B61257676DA1A2FDBE295904176D5E521A2DDFE5">>}, {<<"recon">>, <<"6C6683F46FD4A1DFD98404B9F78DCABC7FCD8826613A89DCB984727A8C3099D7">>}, {<<"stringprep">>, <<"928EBA304C3006EB1512110EBD7B87DB163B00859A09375A1E4466152C6C462A">>}, diff --git a/big_tests/run_common_test.erl b/big_tests/run_common_test.erl index cb590e948a9..83978e25c4d 100644 --- a/big_tests/run_common_test.erl +++ b/big_tests/run_common_test.erl @@ -177,7 +177,6 @@ save_count(Test, Configs) -> run_test(Test, PresetsToRun, CoverOpts) -> {ConfigFiles, Props} = get_ct_config(Test), - prepare_cover(Props, CoverOpts), error_logger:info_msg("Presets to run ~p", [PresetsToRun]), case get_presets(Props) of {ok, Presets} -> @@ -234,7 +233,6 @@ preset_names(Presets) -> [Preset||{Preset, _} <- Presets]. do_run_quick_test(Test, CoverOpts) -> - prepare_cover(Test, CoverOpts), load_test_modules(Test), Result = ct:run_test(Test), case Result of @@ -344,12 +342,6 @@ call(Node, M, F, A) -> Result end. -prepare_cover(Props, true) -> - io:format("Preparing cover~n"), - prepare(Props); -prepare_cover(_, _) -> - ok. - analyze_coverage(Props, true) -> analyze(Props, true); analyze_coverage(Props, ModuleList) when is_list(ModuleList) -> @@ -357,33 +349,6 @@ analyze_coverage(Props, ModuleList) when is_list(ModuleList) -> analyze_coverage(_, _) -> ok. -prepare(Props) -> - Nodes = get_mongoose_nodes(Props), - maybe_compile_cover(Nodes). - -maybe_compile_cover([]) -> - io:format("cover: skip cover compilation~n", []), - ok; -maybe_compile_cover(Nodes) -> - io:format("cover: compiling modules for nodes ~p~n", [Nodes]), - import_code_paths(hd(Nodes)), - - cover:start(Nodes), - Dir = call(hd(Nodes), code, lib_dir, [mongooseim, ebin]), - - %% Time is in microseconds - {Time, Compiled} = timer:tc(fun() -> - Results = cover:compile_beam_directory(Dir), - Ok = [X || X = {ok, _} <- Results], - NotOk = Results -- Ok, - #{ok => length(Ok), failed => NotOk} - end), - github_actions_fold("cover compiled output", fun() -> - io:format("cover: compiled ~p~n", [Compiled]) - end), - report_progress("~nCover compilation took ~ts~n", [microseconds_to_string(Time)]), - ok. - analyze(Props, CoverOpts) -> io:format("Coverage analyzing~n"), Nodes = get_mongoose_nodes(Props), @@ -392,33 +357,34 @@ analyze(Props, CoverOpts) -> analyze(_Props, _CoverOpts, []) -> ok; analyze(_Props, CoverOpts, Nodes) -> - deduplicate_cover_server_console_prints(), + MainNode = hd(Nodes), %% Import small tests cover Files = filelib:wildcard(repo_dir() ++ "/_build/**/cover/*.coverdata"), io:format("Files: ~p", [Files]), + Import = fun(File) -> + ok = rpc:call(MainNode, cover, import, [File]) + end, report_time("Import cover data into run_common_test node", fun() -> - [cover:import(File) || File <- Files] + [Import(File) || File <- Files] end), + %% Gather cover data to the MainNode + {ExportedFiles, _} = report_time("Export cover data from each node", fun() -> + rpc:multicall(tl(Nodes), ejabberd_app, export_cover, ["/tmp"]) + end), + report_time("Export cover data from each node", fun() -> + [Import(File) || File <- ExportedFiles] + end), report_time("Export merged cover data", fun() -> - cover:export("/tmp/mongoose_combined.coverdata") + ok = rpc:call(MainNode, cover, export, ["/tmp/mongoose_combined.coverdata"]) end), case os:getenv("GITHUB_RUN_ID") of false -> - make_html(modules_to_analyze(CoverOpts)); + make_html(MainNode, modules_to_analyze(MainNode, CoverOpts)); _ -> ok - end, - case os:getenv("KEEP_COVER_RUNNING") of - "1" -> - io:format("Skip stopping cover~n"), - ok; - _ -> - report_time("Stopping cover on MongooseIM nodes", fun() -> - cover:stop([node()|Nodes]) - end) end. -make_html(Modules) -> +make_html(MainNode, Modules) -> {ok, Root} = file:get_cwd(), SortScript = Root ++ "/priv/sorttable.js", os:cmd("cp " ++ SortScript ++ " " ++ ?CT_REPORT), @@ -436,12 +402,11 @@ make_html(Modules) -> Fun = fun(Module, {CAcc, NCAcc}) -> FileName = lists:flatten(io_lib:format("~s.COVER.html",[Module])), - %% We assume that import_code_paths/1 was called earlier - case cover:analyse(Module, module) of + case rpc:call(MainNode, cover, analyse, [Module, module]) of {ok, {Module, {C, NC}}} -> file:write(File, row(atom_to_list(Module), C, NC, percent(C,NC),"coverage/"++FileName)), FilePathC = filename:join([CoverageDir, FileName]), - catch cover:analyse_to_file(Module, FilePathC, [html]), + catch rpc:call(MainNode, cover, analyse_to_file, [Module, FilePathC, [html]]), {CAcc + C, NCAcc + NC}; Reason -> error_logger:error_msg("issue=cover_analyse_failed module=~p reason=~p", @@ -503,9 +468,11 @@ module_list(undefined) -> module_list(ModuleList) -> [ list_to_atom(L) || L <- string:tokens(ModuleList, ", ") ]. -modules_to_analyze(true) -> - lists:usort(cover:imported_modules() ++ cover:modules()); -modules_to_analyze(ModuleList) when is_list(ModuleList) -> +modules_to_analyze(MainNode, true) -> + Mods1 = rpc:call(MainNode, cover, imported_modules, []), + Mods2 = rpc:call(MainNode, cover, modules, []), + lists:usort(Mods1 ++ Mods2); +modules_to_analyze(_MainNode, ModuleList) when is_list(ModuleList) -> ModuleList. add({X1, X2, X3, X4}, @@ -602,24 +569,6 @@ report_progress(Format, Args) -> Message = io_lib:format(Format, Args), file:write_file("/tmp/progress", Message, [append]). -github_actions_fold(Description, Fun) -> - case os:getenv("GITHUB_RUN_ID") of - false -> - Fun(); - _ -> - io:format("github_actions_fold:start:~ts~n", [Description]), - Result = Fun(), - io:format("github_actions_fold:end:~ts~n", [Description]), - Result - end. - -%% Import code paths from a running node. -%% It allows cover:analyse/2 to find source file by calling -%% Module:module_info(compiled). -import_code_paths(FromNode) when is_atom(FromNode) -> - Paths = call(FromNode, code, get_path, []), - code:add_paths(Paths). - %% Gets result of file operation and prints filename, if we have any issues. handle_file_error(FileName, {error, Reason}) -> error_logger:error_msg("issue=file_operation_error filename=~p reason=~p", @@ -630,16 +579,6 @@ handle_file_error(_FileName, Other) -> %% ------------------------------------------------------------------ -%% cover_server process is using io:format too much. -%% This code removes duplicate io:formats. -%% -%% Example of a message we want to write only once: -%% "Analysis includes data from imported files" from cover.erl in Erlang/R19 -deduplicate_cover_server_console_prints() -> - %% Set a new group leader for cover_server - CoverPid = whereis(cover_server), - dedup_proxy_group_leader:start_proxy_group_leader_for(CoverPid). - ct_run_dirs() -> filelib:wildcard("ct_report/ct_run*"). diff --git a/big_tests/src/dedup_proxy_group_leader.erl b/big_tests/src/dedup_proxy_group_leader.erl deleted file mode 100644 index 1967c2bd805..00000000000 --- a/big_tests/src/dedup_proxy_group_leader.erl +++ /dev/null @@ -1,73 +0,0 @@ -%% This code removes duplicate io:formats. -%% Each io:format would be written only once with this group leader. --module(dedup_proxy_group_leader). --export([start_proxy_group_leader_for/1]). - -start_proxy_group_leader_for(ForPid) -> - OldGroupLeader = get_process_group_leader(ForPid), - ProxyGroupLeader = start_proxy_group_leader(OldGroupLeader), - erlang:group_leader(ProxyGroupLeader, ForPid), - ok. - -%% Returns group_leader of a process --spec get_process_group_leader(pid()) -> pid(). -get_process_group_leader(Pid) -> - {group_leader, GroupLeader} = erlang:process_info(Pid, group_leader), - GroupLeader. - -%% Starts a new process, that would filter out io:format duplicates. -%% It would forward all other messages to OldGroupLeader. --spec start_proxy_group_leader(pid()) -> pid(). -start_proxy_group_leader(OldGroupLeader) -> - State = #{old_group_leader => OldGroupLeader, prev_requests => []}, - spawn_link(fun() -> proxy_group_leader_loop(State) end). - -proxy_group_leader_loop(State) -> - receive - Msg -> - State2 = handle_proxy_group_leader_message(Msg, State), - proxy_group_leader_loop(State2) - end. - -handle_proxy_group_leader_message(Msg, State = #{old_group_leader := OldGroupLeader}) -> - {State2, Action} = filter_io_request(Msg, State), - case Action of - drop -> - reply_ok(Msg); - pass -> - %% OldGroupLeader would handle Msg and reply to the client directly - OldGroupLeader ! Msg - end, - State2. - -filter_io_request(Msg, State = #{prev_requests := PrevRequests}) -> - case request_type(Msg) of - put_chars -> - Request = unwrap_io_request(Msg), - case lists:member(Request, PrevRequests) of - true -> - %% Filter out io:format duplicate call - {State, drop}; - false -> - %% Allow to execute this request just once and remember it - State2 = State#{prev_requests => [Request|PrevRequests]}, - {State2, pass} - end; - _ -> - %% unknown or non-relevant message - {State, pass} - end. - -%% Erlang IO-protocol docs -%% http://erlang.org/doc/apps/stdlib/io_protocol.html -request_type({io_request, _From, _ReplyAs, Request}) when is_tuple(Request) -> - element(1, Request); -request_type(_) -> - unknown. - -unwrap_io_request({io_request, _From, _ReplyAs, Request}) -> - Request. - -%% Simulate reply to the client. -reply_ok({io_request, From, ReplyAs, _Request}) -> - From ! {io_reply, ReplyAs, ok}. diff --git a/rebar.config b/rebar.config index 3170412c143..7c1953a8706 100644 --- a/rebar.config +++ b/rebar.config @@ -71,7 +71,7 @@ %%% Stateless libraries {opuntia, "1.1.0"}, - {fast_tls, "1.1.16"}, + {fast_tls, "1.1.21"}, {fast_scram, "0.5.0"}, {idna, "6.1.1"}, {uuid, "2.0.5", {pkg, uuid_erl}}, @@ -86,8 +86,8 @@ %%% HTTP tools {graphql, {git, "https://github.com/esl/graphql-erlang.git", {branch, "master"}}}, {ranch, "2.1.0"}, - {cowboy, "2.9.0"}, - {hackney, "1.18.1"}, + {cowboy, "2.12.0"}, + {hackney, "1.20.1"}, {gun, "1.3.3"}, {fusco, "0.1.1"}, {lasse, "1.2.0"}, @@ -100,7 +100,9 @@ {epgsql, "4.7.1"}, {eodbc, "0.2.0"}, {tirerl, "1.2.0"}, - {amqp_client, "3.12.6"}, + {amqp_client, "3.13.0-rc.2"}, + {rabbit_common, "3.13.4"}, + {eredis, "1.7.0"}, {erlcloud, "3.6.5"}, @@ -193,7 +195,8 @@ {plugins, [ - {pc, "1.14.0"}, + rebar3_elixir, + {pc, "1.15.0"}, {provider_asn1, "0.3.0"}, {rebar3_codecov, "0.6.0"}, {rebar3_lint, "2.0.1"} @@ -211,13 +214,17 @@ {clean, {pc, clean}} ] }] } ]}, %% Disable unsupported plugins for hamcrest-erlang {override, hamcrest, [{plugins, []}]}, + %% Pulls geas_rebar3 + {override, graphql, [{plugins, [rebar3_hex]}]}, {del, eper, [{erl_opts, [warnings_as_errors]}]}, %% Erlang JWT Library is in elixir and wants elvis for tests %% Remove elvis plugin to reduce deps {override, jwerl, [{plugins, [rebar3_elixir, rebar3_hex]}]}, %% GraphQL pulls geas_rebar3, which is a dev dependency %% geas takes some time to compile, but we do not need it - {override, graphql, [{plugins, [rebar3_hex]}]} + {override, graphql, [{plugins, [rebar3_hex]}]}, + %% Disable warnings_as_errors + {override, worker_pool, [{erl_opts, []}]} ]}. {dialyzer, [ diff --git a/rebar.lock b/rebar.lock index caa2534ea13..0536c227383 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,18 +1,18 @@ {"1.2.0", -[{<<"amqp_client">>,{pkg,<<"amqp_client">>,<<"3.12.6">>},0}, +[{<<"amqp_client">>,{pkg,<<"amqp_client">>,<<"3.13.0-rc.2">>},0}, {<<"backoff">>,{pkg,<<"backoff">>,<<"1.1.3">>},1}, {<<"base16">>,{pkg,<<"base16">>,<<"2.0.1">>},0}, {<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.12.2">>},0}, {<<"bear">>,{pkg,<<"bear">>,<<"1.0.0">>},1}, {<<"cache_tab">>,{pkg,<<"cache_tab">>,<<"1.0.30">>},0}, - {<<"certifi">>,{pkg,<<"certifi">>,<<"2.9.0">>},1}, + {<<"certifi">>,{pkg,<<"certifi">>,<<"2.12.0">>},1}, {<<"cets">>, {git,"https://github.com/esl/cets.git", - {ref,"059078dac14bf5074bb6287852f19a54a4dda619"}}, + {ref,"779f1366130603e1a933c324334bdaa70a03529e"}}, 0}, - {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.9.0">>},0}, + {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.12.0">>},0}, {<<"cowboy_swagger">>,{pkg,<<"cowboy_swagger">>,<<"2.5.1">>},0}, - {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.11.0">>},1}, + {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.13.0">>},1}, {<<"cpool">>,{pkg,<<"cpool">>,<<"0.1.0">>},0}, {<<"cqerl">>, {git,"https://github.com/esl/cqerl.git", @@ -47,7 +47,7 @@ 0}, {<<"fast_pbkdf2">>,{pkg,<<"fast_pbkdf2">>,<<"1.0.3">>},1}, {<<"fast_scram">>,{pkg,<<"fast_scram">>,<<"0.5.0">>},0}, - {<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.16">>},0}, + {<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.21">>},0}, {<<"flatlog">>,{pkg,<<"flatlog">>,<<"0.1.2">>},0}, {<<"fusco">>,{pkg,<<"fusco">>,<<"0.1.1">>},0}, {<<"gen_fsm_compat">>,{pkg,<<"gen_fsm_compat">>,<<"0.3.0">>},0}, @@ -57,7 +57,7 @@ {ref,"7b1762f863571e12b5c458417d505656d342fb46"}}, 0}, {<<"gun">>,{pkg,<<"gun">>,<<"1.3.3">>},0}, - {<<"hackney">>,{pkg,<<"hackney">>,<<"1.18.1">>},0}, + {<<"hackney">>,{pkg,<<"hackney">>,<<"1.20.1">>},0}, {<<"idna">>,{pkg,<<"idna">>,<<"6.1.1">>},0}, {<<"jid">>,{pkg,<<"mongoose_jid">>,<<"2.1.0">>},0}, {<<"jiffy">>,{pkg,<<"jiffy">>,<<"1.1.1">>},0}, @@ -68,7 +68,7 @@ {<<"lhttpc">>,{pkg,<<"lhttpc">>,<<"1.6.2">>},1}, {<<"luerl">>, {git,"https://github.com/rvirding/luerl.git", - {ref,"5e61c1838d08430af67fb870995b05a41d64aeee"}}, + {ref,"553e375c24ee7d7fd6de79069580606689925087"}}, 2}, {<<"lz4">>, {git,"https://github.com/szktty/erlang-lz4.git", @@ -76,7 +76,7 @@ 1}, {<<"meck">>,{pkg,<<"meck">>,<<"0.9.2">>},0}, {<<"metrics">>,{pkg,<<"metrics">>,<<"1.0.1">>},1}, - {<<"mimerl">>,{pkg,<<"mimerl">>,<<"1.2.0">>},1}, + {<<"mimerl">>,{pkg,<<"mimerl">>,<<"1.3.0">>},1}, {<<"mysql">>,{pkg,<<"mysql">>,<<"1.8.0">>},0}, {<<"nklib">>, {git,"https://github.com/michalwski/nklib.git", @@ -104,8 +104,8 @@ {<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.4.0">>},1}, {<<"pooler">>,{pkg,<<"pooler">>,<<"1.5.3">>},1}, {<<"proper">>,{pkg,<<"proper">>,<<"1.4.0">>},0}, - {<<"quickrand">>,{pkg,<<"quickrand">>,<<"2.0.5">>},1}, - {<<"rabbit_common">>,{pkg,<<"rabbit_common">>,<<"3.12.6">>},1}, + {<<"quickrand">>,{pkg,<<"quickrand">>,<<"2.0.7">>},1}, + {<<"rabbit_common">>,{pkg,<<"rabbit_common">>,<<"3.13.4">>},0}, {<<"ranch">>,{pkg,<<"ranch">>,<<"2.1.0">>},0}, {<<"re2">>,{pkg,<<"re2">>,<<"1.9.7">>},1}, {<<"recon">>,{pkg,<<"recon">>,<<"2.5.3">>},0}, @@ -118,11 +118,11 @@ {git,"https://github.com/skunkwerks/snappy-erlang-nif.git", {ref,"e8907ee8e37cfa07d933a070669a88798082c3d7"}}, 1}, - {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1}, + {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.7">>},1}, {<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.29">>},1}, {<<"syslogger">>,{pkg,<<"syslogger">>,<<"0.3.0">>},0}, {<<"telemetry">>,{pkg,<<"telemetry">>,<<"1.2.0">>},0}, - {<<"thoas">>,{pkg,<<"thoas">>,<<"1.0.0">>},2}, + {<<"thoas">>,{pkg,<<"thoas">>,<<"1.0.0">>},1}, {<<"tirerl">>,{pkg,<<"tirerl">>,<<"1.2.0">>},0}, {<<"tomerl">>,{pkg,<<"tomerl">>,<<"0.5.0">>},0}, {<<"trails">>,{pkg,<<"trails">>,<<"2.3.0">>},0}, @@ -131,16 +131,16 @@ {<<"worker_pool">>,{pkg,<<"worker_pool">>,<<"6.0.1">>},0}]}. [ {pkg_hash,[ - {<<"amqp_client">>, <<"B0050183BB4CFBD5B3F9A3276689DFA135A196AEDC3584110F231B2CE04B0426">>}, + {<<"amqp_client">>, <<"2C9975DA52319D8E613B5DBD3E931374B41AF6F571BD7A3F96CE50AD6C27441B">>}, {<<"backoff">>, <<"DE762C05ED6DFAE862D83DC9E58AE936792B01302B3595F5CFFE86F2D8E6C1DD">>}, {<<"base16">>, <<"F0549F732E03BE8124ED0D19FD5EE52146CC8BE24C48CBC3F23AB44B157F11A2">>}, {<<"bbmustache">>, <<"0CABDCE0DB9FE6D3318131174B9F2B351328A4C0AFBEB3E6E99BB0E02E9B621D">>}, {<<"bear">>, <<"430419C1126B477686CDE843E88BA0F2C7DC5CDF0881C677500074F704339A99">>}, {<<"cache_tab">>, <<"6D35EECFB65FBE5FC85988503A27338D32DE01243F3FC8EA3EE7161AF08725A4">>}, - {<<"certifi">>, <<"6F2A475689DD47F19FB74334859D460A2DC4E3252A3324BD2111B8F0429E7E21">>}, - {<<"cowboy">>, <<"865DD8B6607E14CF03282E10E934023A1BD8BE6F6BACF921A7E2A96D800CD452">>}, + {<<"certifi">>, <<"2D1CCA2EC95F59643862AF91F001478C9863C2AC9CB6E2F89780BFD8DE987329">>}, + {<<"cowboy">>, <<"F276D521A1FF88B2B9B4C54D0E753DA6C66DD7BE6C9FCA3D9418B561828A3731">>}, {<<"cowboy_swagger">>, <<"2F6AD30702DA44F3727CA96251E71F36222FAD2CAA509562D624B5368C948F6C">>}, - {<<"cowlib">>, <<"0B9FF9C346629256C42EBE1EEB769A83C6CB771A6EE5960BD110AB0B9B872063">>}, + {<<"cowlib">>, <<"DB8F7505D8332D98EF50A3EF34B34C1AFDDEC7506E4EE4DD4A3A266285D282CA">>}, {<<"cpool">>, <<"76222AA1DAC0F8089707167BD69D221EDA63DB65B8BD67DBF6E133075392EEDC">>}, {<<"credentials_obfuscation">>, <<"34E18B126B3AEFD6E8143776FBE1CECEEA6792307C99AC5EE8687911F048CFD7">>}, {<<"eini">>, <<"FCC3CBD49BBDD9A1D9735C7365DAFFCD84481CCE81E6CB80537883AA44AC4895">>}, @@ -153,13 +153,13 @@ {<<"exml">>, <<"9581FE6512D9772C61BBE611CD4A8E5BB90B4D4481275325EC520F7A931A9393">>}, {<<"fast_pbkdf2">>, <<"4F09D6C6C20DBEE1970E0A6AE91432E1B7731F88426C671D083BAC31FFA1FDAD">>}, {<<"fast_scram">>, <<"BD0B946911B07D36EC22AD950FF22F77F27B94E4E24452AF966597C6D8CB5E7F">>}, - {<<"fast_tls">>, <<"85FA7F3112EA4FF5CCB4F3ABADC130A8C855AD74EB00869487399CB0C322D208">>}, + {<<"fast_tls">>, <<"65D7D547A09EEFB37A1C0D04D8601FAC4F3E6E2C1EDE859A7787081670F9648D">>}, {<<"flatlog">>, <<"8C4B81A4931A1396254DBD975B841F4A6350D6F128FF94FFE86799A4451E32B1">>}, {<<"fusco">>, <<"3DD6A90151DFEF30EA1937CC44E9A59177C0094918388D9BCAA2F2DC5E2AE4AA">>}, {<<"gen_fsm_compat">>, <<"5903549F67D595F58A7101154CBE0FDD46955FBFBE40813F1E53C23A970FF5F4">>}, {<<"goldrush">>, <<"F06E5D5F1277DA5C413E84D5A2924174182FB108DABB39D5EC548B27424CD106">>}, {<<"gun">>, <<"CF8B51BEB36C22B9C8DF1921E3F2BC4D2B1F68B49AD4FBC64E91875AA14E16B4">>}, - {<<"hackney">>, <<"F48BF88F521F2A229FC7BAE88CF4F85ADC9CD9BCF23B5DC8EB6A1788C662C4F6">>}, + {<<"hackney">>, <<"8D97AEC62DDDDD757D128BFD1DF6C5861093419F8F7A4223823537BAD5D064E2">>}, {<<"idna">>, <<"8A63070E9F7D0C62EB9D9FCB360A7DE382448200FBBD1B106CC96D3D8099DF8D">>}, {<<"jid">>, <<"7798E7443124BF93A58E56794D6F28CDF126A1AA7B318663E762287C9CFE9397">>}, {<<"jiffy">>, <<"ACA10F47AA91697BF24AB9582C74E00E8E95474C7EF9F76D4F1A338D0F5DE21B">>}, @@ -170,7 +170,7 @@ {<<"lhttpc">>, <<"044F16F0018C7AA7E945E9E9406C7F6035E0B8BC08BF77B00C78CE260E1071E3">>}, {<<"meck">>, <<"85CCBAB053F1DB86C7CA240E9FC718170EE5BDA03810A6292B5306BF31BAE5F5">>}, {<<"metrics">>, <<"25F094DEA2CDA98213CECC3AEFF09E940299D950904393B2A29D191C346A8486">>}, - {<<"mimerl">>, <<"67E2D3F571088D5CFD3E550C383094B47159F3EEE8FFA08E64106CDF5E981BE3">>}, + {<<"mimerl">>, <<"D0CD9FC04B9061F82490F6581E0128379830E78535E017F7780F37FEA7545726">>}, {<<"mysql">>, <<"0E4BBCF701B7D8EA5C3750F220F26323C0FC18B844960988BE196B33A8A9F3C1">>}, {<<"observer_cli">>, <<"3C1BFB6D91BF68F6A3D15F46AE20DA0F7740D363EE5BC041191CE8722A6C4FAE">>}, {<<"opuntia">>, <<"96DBDF5A1A1D9CEEE6649F08E27B7A4AC8FFFFCFA88404242327130122355766">>}, @@ -178,13 +178,13 @@ {<<"parse_trans">>, <<"BB87AC362A03CA674EBB7D9D498F45C03256ADED7214C9101F7035EF44B798C7">>}, {<<"pooler">>, <<"898CD1FA301FC42D4A8ED598CE139B71CA85B54C16AB161152B5CC5FBDCFA1A8">>}, {<<"proper">>, <<"89A44B8C39D28BB9B4BE8E4D715D534905B325470F2E0EC5E004D12484A79434">>}, - {<<"quickrand">>, <<"06FCAD85CB47D5C85C51D6BC9C84A082501BA098A89D64AD0A2F69599E034C04">>}, - {<<"rabbit_common">>, <<"FEBD37E11483F94B614CD636C1EDBCE1099FF64866598F75D0A624D3A60437C6">>}, + {<<"quickrand">>, <<"D2BD76676A446E6A058D678444B7FDA1387B813710D1AF6D6E29BB92186C8820">>}, + {<<"rabbit_common">>, <<"68650FBCB8CE204CE28C116451C030E294BF916ED722B43A369D7586DA2A5605">>}, {<<"ranch">>, <<"2261F9ED9574DCFCC444106B9F6DA155E6E540B2F82BA3D42B339B93673B72A3">>}, {<<"re2">>, <<"8114654E72EF62F605A8A393F219702F253CB7A02F671503918B76D0614DB046">>}, {<<"recon">>, <<"739107B9050EA683C30E96DE050BC59248FD27EC147696F79A8797FF9FA17153">>}, {<<"segmented_cache">>, <<"C13BFC982A9AF98F13198CF1D535A9353927AE3F8A6CEE85BEB6164077313722">>}, - {<<"ssl_verify_fun">>, <<"CF344F5692C82D2CD7554F5EC8FD961548D4FD09E7D22F5B62482E5AEAEBD4B0">>}, + {<<"ssl_verify_fun">>, <<"354C321CF377240C7B8716899E182CE4890C5938111A1296ADD3EC74CF1715DF">>}, {<<"stringprep">>, <<"02F23E8C3A219A3DFE40A22E908BECE3A2F68AF0FF599EA8A7B714ECB21E62EE">>}, {<<"syslogger">>, <<"B0187E00330AA637AAD6E5A4BACC03492FCE172ABDFADB5F968A5A5AC10C660B">>}, {<<"telemetry">>, <<"A8CE551485A9A3DAC8D523542DE130EAFD12E40BBF76CF0ECD2528F24E812A44">>}, @@ -196,16 +196,16 @@ {<<"uuid">>, <<"60FAEEB7EDFD40847ED13CB0DD1044BAABE4E79A00C0CA9C4D13A073914B1016">>}, {<<"worker_pool">>, <<"CA262C2DFB3B4AF661B206C82065D86F83922B7227508AA6E0BC34D3E5AE5135">>}]}, {pkg_hash_ext,[ - {<<"amqp_client">>, <<"B856F6404E7AF98C90DA870C8CE50D1380F13F2CEE02F16564B5CC5142BAE308">>}, + {<<"amqp_client">>, <<"E86FD4B95291799BDE1571AF81077B5A5DB9653824FBE429F5BADAD831C52642">>}, {<<"backoff">>, <<"30CEAD738D20E4C8D36CD37857DD5E23AEBA57CB868BF64766D47D371422BDFF">>}, {<<"base16">>, <<"06EA2D48343282E712160BA89F692B471DB8B36ABE8394F3445FF9032251D772">>}, {<<"bbmustache">>, <<"688B33A4D5CC2D51F575ADF0B3683FC40A38314A2F150906EDCFC77F5B577B3B">>}, {<<"bear">>, <<"157B67901ADF84FF0DA6EAE035CA1292A0AC18AA55148154D8C582B2C68959DB">>}, {<<"cache_tab">>, <<"6D8A5E00D8F84C42627706A6DBEDB02E34D58495F3ED61935C8475CA0531CDA0">>}, - {<<"certifi">>, <<"266DA46BDB06D6C6D35FDE799BCB28D36D985D424AD7C08B5BB48F5B5CDD4641">>}, - {<<"cowboy">>, <<"2C729F934B4E1AA149AFF882F57C6372C15399A20D54F65C8D67BEF583021BDE">>}, + {<<"certifi">>, <<"EE68D85DF22E554040CDB4BE100F33873AC6051387BAF6A8F6CE82272340FF1C">>}, + {<<"cowboy">>, <<"8A7ABE6D183372CEB21CAA2709BEC928AB2B72E18A3911AA1771639BEF82651E">>}, {<<"cowboy_swagger">>, <<"C33334A96114BCB47A9697762420D8DE9DC4106FACA42EE44BB0F37EB98CF490">>}, - {<<"cowlib">>, <<"2B3E9DA0B21C4565751A6D4901C20D1B4CC25CBB7FD50D91D2AB6DD287BC86A9">>}, + {<<"cowlib">>, <<"E1E1284DC3FC030A64B1AD0D8382AE7E99DA46C3246B815318A4B848873800A4">>}, {<<"cpool">>, <<"430E18DF4A9D584EB1ED0D196A87CC02E878AF5B4888BFDC9B65F86A96480E30">>}, {<<"credentials_obfuscation">>, <<"738ACE0ED5545D2710D3F7383906FC6F6B582D019036E5269C4DBD85DBCED566">>}, {<<"eini">>, <<"DA64AE8DB7C2F502E6F20CDF44CD3D9BE364412B87FF49FEBF282540F673DFCB">>}, @@ -218,13 +218,13 @@ {<<"exml">>, <<"D8E7894E2544402B4986EEB2443C15B51B14F686266F091DBF2777D1D99A2FA2">>}, {<<"fast_pbkdf2">>, <<"2900431E2E6402F23A92754448BBD949DA366BC9C984FDC791DDCFCC41042434">>}, {<<"fast_scram">>, <<"D45B746B8D17C0F73A94CBDB526E115A4AEDFECB4D42CA935BCB1195D783B4E1">>}, - {<<"fast_tls">>, <<"AA08CCA89B4044E74F1F12E399817D8BEAEAE3EE006C98A893C0BFB1D81FBA51">>}, + {<<"fast_tls">>, <<"131542913937025E48CD80AA81F00359686D5501B75621E72026A87B5229505B">>}, {<<"flatlog">>, <<"FDD2A311A67F63F9D0BC194FAD6BEAF9CCCDE8FFFEE2919DF1C4D86098E49984">>}, {<<"fusco">>, <<"6343551BD1E824F2A6CA85E1158C5B37C320FD449FBFEC7450A73F192AAF9022">>}, {<<"gen_fsm_compat">>, <<"7153D11BAD328933D4B24E663D8CEC52874E14176C7FB392FA1FF768B17460D9">>}, {<<"goldrush">>, <<"99CB4128CFFCB3227581E5D4D803D5413FA643F4EB96523F77D9E6937D994CEB">>}, {<<"gun">>, <<"3106CE167F9C9723F849E4FB54EA4A4D814E3996AE243A1C828B256E749041E0">>}, - {<<"hackney">>, <<"A4ECDAFF44297E9B5894AE499E9A070EA1888C84AFDD1FD9B7B2BC384950128E">>}, + {<<"hackney">>, <<"FE9094E5F1A2A2C0A7D10918FEE36BFEC0EC2A979994CFF8CFE8058CD9AF38E3">>}, {<<"idna">>, <<"92376EB7894412ED19AC475E4A86F7B413C1B9FBB5BD16DCCD57934157944CEA">>}, {<<"jid">>, <<"C2F5B32C9CE8B7B9F321E4DCFE12380CD6CB93CE2208312570D65A06CBA24837">>}, {<<"jiffy">>, <<"62E1F0581C3C19C33A725C781DFA88410D8BFF1BBAFC3885A2552286B4785C4C">>}, @@ -235,7 +235,7 @@ {<<"lhttpc">>, <<"76B5FA6149D1E10D4B1FBC4EBD51D371DB19C1AB9F0A9ECF5B526440DF064E97">>}, {<<"meck">>, <<"81344F561357DC40A8344AFA53767C32669153355B626EA9FCBC8DA6B3045826">>}, {<<"metrics">>, <<"69B09ADDDC4F74A40716AE54D140F93BEB0FB8978D8636EADED0C31B6F099F16">>}, - {<<"mimerl">>, <<"F278585650AA581986264638EBF698F8BB19DF297F66AD91B18910DFC6E19323">>}, + {<<"mimerl">>, <<"A1E15A50D1887217DE95F0B9B0793E32853F7C258A5CD227650889B38839FE9D">>}, {<<"mysql">>, <<"D473C479C19E5CDE20237458EEAD6673C3C00E0EF84AFD30615AEBBB67FEE7B3">>}, {<<"observer_cli">>, <<"50DE6D95D814F447458BD5D72666A74624EDDB0EF98BDCEE61A0153AAE0865FF">>}, {<<"opuntia">>, <<"8F70DAA6BD35AE58D96061CDB0FC2AF79DB5C73B0F7564B8BEC2B2DEB703EB8F">>}, @@ -243,13 +243,13 @@ {<<"parse_trans">>, <<"F99E368830BEA44552224E37E04943A54874F08B8590485DE8D13832B63A2DC3">>}, {<<"pooler">>, <<"058D85C5081289B90E97E4DDDBC3BB5A3B4A19A728AB3BC88C689EFCC36A07C7">>}, {<<"proper">>, <<"18285842185BD33EFBDA97D134A5CB5A0884384DB36119FEE0E3CFA488568CBB">>}, - {<<"quickrand">>, <<"252CF0493570EBF1A58985CB71990982CDDCD4396B6427F1E10CF58924C1C052">>}, - {<<"rabbit_common">>, <<"D85282C8C9BE456B42AA4B265EDE68D176CA8A28DFCF1D521BE19267167C0DC3">>}, + {<<"quickrand">>, <<"B8ACBF89A224BC217C3070CA8BEBC6EB236DBE7F9767993B274084EA044D35F0">>}, + {<<"rabbit_common">>, <<"C0E8F2909EAECABC732990D26B75DE092E265D14E8AC9EAFD4813438F1CC2233">>}, {<<"ranch">>, <<"244EE3FA2A6175270D8E1FC59024FD9DBC76294A321057DE8F803B1479E76916">>}, {<<"re2">>, <<"FF0703CA095B5BEBF57DD12571AF24B3BA404180E9B5E43128790B5D31EBE803">>}, {<<"recon">>, <<"6C6683F46FD4A1DFD98404B9F78DCABC7FCD8826613A89DCB984727A8C3099D7">>}, {<<"segmented_cache">>, <<"8CAC611C65C0663A146BAC6D8A9720F88B5E4FBAE90BEA76BC72A815A6884457">>}, - {<<"ssl_verify_fun">>, <<"BDB0D2471F453C88FF3908E7686F86F9BE327D065CC1EC16FA4540197EA04680">>}, + {<<"ssl_verify_fun">>, <<"FE4C190E8F37401D30167C8C405EDA19469F34577987C76DDE613E838BBC67F8">>}, {<<"stringprep">>, <<"928EBA304C3006EB1512110EBD7B87DB163B00859A09375A1E4466152C6C462A">>}, {<<"syslogger">>, <<"3FE5D3EF59A0AF0E9A9B159DC4E888C9E8470D2DD201C6DFF004507F3ED578AD">>}, {<<"telemetry">>, <<"1427E73667B9A2002CF1F26694C422D5C905DF889023903C4518921D53E3E883">>}, diff --git a/rebar3 b/rebar3 index 0cccbb6f92c..1b1f8334127 100755 Binary files a/rebar3 and b/rebar3 differ diff --git a/src/async_pools/mongoose_aggregator_worker.erl b/src/async_pools/mongoose_aggregator_worker.erl index a6fa07437f0..2ff4b1449c1 100644 --- a/src/async_pools/mongoose_aggregator_worker.erl +++ b/src/async_pools/mongoose_aggregator_worker.erl @@ -41,7 +41,7 @@ handle_info/2, terminate/2, code_change/3, - format_status/2]). + format_status/1]). -type request() :: no_request_pending | {request_id(), mongoose_async_pools:task()}. -record(state, { @@ -51,7 +51,7 @@ request_callback :: mongoose_async_pools:request_callback(), aggregate_callback :: mongoose_async_pools:aggregate_callback(), verify_callback :: undefined | mongoose_async_pools:verify_callback(), - flush_elems = #{} :: map() | censored, % see format_status/2 for censored + flush_elems = #{} :: map() | censored, % see format_status/1 for censored flush_queue = queue:new() :: queue:queue(), flush_extra = #{} :: map(), total_retries = 3 :: non_neg_integer(), @@ -158,9 +158,9 @@ terminate(Reason, State) -> code_change(_OldVsn, State, _Extra) -> {ok, State}. -% Don't leak the tasks to logs, can contain private information -format_status(_Opt, [_PDict, State | _]) -> - [{data, [{"State", State#state{flush_elems = censored}}]}]. +-spec format_status(gen_server:format_status()) -> gen_server:format_status(). +format_status(Status = #{state := State}) -> + Status#{state => State#state{flush_elems = censored}}. % If we don't have any request pending, it means that it is the first task submitted, % so aggregation is not needed. diff --git a/src/async_pools/mongoose_batch_worker.erl b/src/async_pools/mongoose_batch_worker.erl index 31180bc87b7..ed7747a04c3 100644 --- a/src/async_pools/mongoose_batch_worker.erl +++ b/src/async_pools/mongoose_batch_worker.erl @@ -24,7 +24,7 @@ handle_info/2, terminate/2, code_change/3, - format_status/2]). + format_status/1]). -record(state, { host_type :: mongooseim:host_type(), @@ -34,7 +34,7 @@ flush_interval_tref :: undefined | reference(), flush_callback = fun(_, _) -> ok end :: mongoose_async_pools:flush_callback(), prep_callback :: undefined | mongoose_async_pools:prep_callback(), - flush_queue = [] :: list() | censored, % see format_status/2 for censored + flush_queue = [] :: list() | censored, % see format_status/1 for censored flush_queue_length = 0 :: non_neg_integer(), flush_extra = #{} :: map() }). @@ -112,8 +112,9 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. % Don't leak the tasks to logs, can contain private information -format_status(_Opt, [_PDict, State | _]) -> - [{data, [{"State", State#state{flush_queue = censored}}]}]. +-spec format_status(gen_server:format_status()) -> gen_server:format_status(). +format_status(Status = #{state := State}) -> + Status#{state => State#state{flush_queue = censored}}. %% Batched tasks callbacks handle_task(Task, State) -> diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl index 78d84bb1d58..bcac1ad0d0c 100644 --- a/src/ejabberd_app.erl +++ b/src/ejabberd_app.erl @@ -28,9 +28,9 @@ -behaviour(application). --export([start/2, prep_stop/1, stop/1]). +-export([start/2, prep_stop/1, stop/1, export_cover/1]). --ignore_xref([prep_stop/1]). +-ignore_xref([prep_stop/1, export_cover/1]). -include("mongoose.hrl"). @@ -41,6 +41,7 @@ start(normal, _Args) -> try + maybe_start_cover(), do_start() catch Class:Reason:StackTrace -> %% Log a stacktrace because while proc_lib:crash_report/4 would report a crash reason, @@ -187,3 +188,23 @@ delete_pid_file() -> PidFilename -> file:delete(PidFilename) end. + +maybe_start_cover() -> + case {os:getenv("MONGOOSE_COVER_ON_START"), whereis(cover_server)} of + {"true", undefined} -> + error_logger:warning_msg("Starting cover. It will slowdown the system.", []), + ok = cover:local_only(), + %% We need to change group leader because application:stop/1 would stop cover otherwise. + %% (Application master stops every process based on group_leader). + %% The killing logic is in application_master:kill_children/1 + erlang:group_leader(whereis(user), whereis(cover_server)), + Dir = filename:join(code:lib_dir(mongooseim), ebin), + cover:compile_beam_directory(Dir); + _ -> + ok + end. + +export_cover(IntoDir) -> + File = filename:join(IntoDir, "mongoose_" ++ atom_to_list(node()) ++ ".coverdata"), + cover:export(File), + File. diff --git a/src/eldap_filter_yecc.yrl b/src/eldap_filter_yecc.yrl index 56bdec159e6..0c8163038b7 100644 --- a/src/eldap_filter_yecc.yrl +++ b/src/eldap_filter_yecc.yrl @@ -54,7 +54,7 @@ Erlang code. 'and'(Value) -> eldap:'and'(eldap_utils:maybe_b2list(Value)). 'or'(Value) -> eldap:'or'(eldap_utils:maybe_b2list(Value)). -'not'(Value) -> eldap:'not'(eldap_utils:maybe_b2list(Value)). +'not'(Value) -> eldap:'not'(Value). equal(Desc, Value) -> eldap:equalityMatch(Desc, eldap_utils:maybe_b2list(Value)). approx(Desc, Value) -> eldap:approxMatch(Desc, eldap_utils:maybe_b2list(Value)). greater(Desc, Value) -> eldap:greaterOrEqual(Desc, eldap_utils:maybe_b2list(Value)). @@ -68,4 +68,4 @@ final(Value) -> {final, eldap_utils:maybe_b2list(Value)}. xattr(Value) -> {type, eldap_utils:maybe_b2list(Value)}. matchingrule(Value) -> {matchingRule, eldap_utils:maybe_b2list(Value)}. value_of(Token) -> iolist_to_binary(element(3, Token)). -flatten(List) -> lists:flatten(List). \ No newline at end of file +flatten(List) -> lists:flatten(List). diff --git a/src/eldap_utils.erl b/src/eldap_utils.erl index 6a8719f5f23..9a8b2b96ba1 100644 --- a/src/eldap_utils.erl +++ b/src/eldap_utils.erl @@ -191,7 +191,7 @@ match_filter_name({<<"%u">>, [Value | _]}, NewUIDs) when Value /= <<"">> -> end; match_filter_name({Name, [Value | _]}, _NewUIDs) when Value /= <<"">> -> case binary:match(Value, <<"*">>) of - nomatch -> [eldap:equalityMatch(Name, Value)]; + nomatch -> [eldap:equalityMatch(maybe_b2list(Name), maybe_b2list(Value))]; _ -> [eldap:substrings(maybe_b2list(Name), generate_substring_list(Value))] end; diff --git a/src/mongoose_ldap_worker.erl b/src/mongoose_ldap_worker.erl index 1de9cacba62..e64c3c19ba3 100644 --- a/src/mongoose_ldap_worker.erl +++ b/src/mongoose_ldap_worker.erl @@ -72,18 +72,23 @@ call_eldap(Request, State) -> {Result, State} end. +connect_opts(State = #{port := Port, + root_dn := RootDN, + password := Password}) -> + AnonAuth = RootDN =:= <<>> andalso Password =:= <<>>, + SSLConfig = case State of + #{tls := TLSOptions} -> [{sslopts, just_tls:make_ssl_opts(TLSOptions)}]; + #{} -> [] + end, + [{port, Port}, {anon_auth, AnonAuth}] ++ SSLConfig. + connect(State = #{handle := none, servers := Servers, port := Port, root_dn := RootDN, password := Password, connect_interval := ConnectInterval}) -> - AnonAuth = RootDN =:= <<>> andalso Password =:= <<>>, - SSLConfig = case State of - #{tls := TLSOptions} -> [{sslopts, just_tls:make_ssl_opts(TLSOptions)}]; - #{} -> [] - end, - case eldap:open(Servers, [{port, Port}, {anon_auth, AnonAuth}] ++ SSLConfig) of + case eldap:open(Servers, connect_opts(State)) of {ok, Handle} -> case eldap:simple_bind(Handle, RootDN, Password) of ok -> diff --git a/src/muc/mod_muc_room.erl b/src/muc/mod_muc_room.erl index f4b9534046b..c52fe876937 100644 --- a/src/muc/mod_muc_room.erl +++ b/src/muc/mod_muc_room.erl @@ -899,7 +899,6 @@ can_send_broadcasts(Role, StateData) -> or ((StateData#state.config)#config.moderated == false). broadcast_room_packet(From, FromNick, Role, Packet, StateData) -> - Activity = get_user_activity(From, StateData), TS = erlang:system_time(microsecond), Affiliation = get_affiliation(From, StateData), EventData = #{from_nick => FromNick, from_jid => From, diff --git a/src/pubsub/mod_pubsub_db_rdbms.erl b/src/pubsub/mod_pubsub_db_rdbms.erl index 83a02a0c68b..54e3f649e5f 100644 --- a/src/pubsub/mod_pubsub_db_rdbms.erl +++ b/src/pubsub/mod_pubsub_db_rdbms.erl @@ -139,7 +139,7 @@ init(_HostType, _Opts) -> "AND luser = ? AND lserver = ? AND lresource = ? AND sub_id = ?">>), mongoose_rdbms:prepare(pubsub_delete_all_subscriptions, pubsub_subscriptions, [nidx, luser, lserver, lresource], - <<"DELETE FROM pubsub_subscriptions"" WHERE nidx = ? " + <<"DELETE FROM pubsub_subscriptions WHERE nidx = ? " "AND luser = ? AND lserver = ? AND lresource = ?">>), mongoose_rdbms:prepare(pubsub_delete_all_subscriptions_id, pubsub_subscriptions, [nidx], <<"DELETE FROM pubsub_subscriptions WHERE nidx = ?">>), diff --git a/tools/start-nodes.sh b/tools/start-nodes.sh index 68f0a85c0f7..a6456cd79e2 100755 --- a/tools/start-nodes.sh +++ b/tools/start-nodes.sh @@ -13,6 +13,10 @@ source tools/common-vars.sh # This script adds a marker into logs, so we would know which lines are new START_NODES_DATE=$(date) +if [ "$COVER_ENABLED" = true ]; then + export MONGOOSE_COVER_ON_START=true +fi + async_helper() { local ret_val=0 output="" output="$("$@")" || ret_val="$?" diff --git a/tools/summarise-ct-results b/tools/summarise-ct-results index 4b0ac2ec338..debf7844349 100755 --- a/tools/summarise-ct-results +++ b/tools/summarise-ct-results @@ -79,7 +79,8 @@ summaries(Directories, Filename) -> add_up_suite_results(SuiteSummaries) -> lists:foldl(fun(Filename, {OkAcc, FAcc, USAcc, ASAcc}) -> - {ok, [{summary, {Ok, F, US, AS}}]} = file:consult(Filename), + {ok, [{summary, Summary}]} = file:consult(Filename), + [Ok, F, US, AS | _] = tuple_to_list(Summary), {OkAcc + Ok, FAcc + F, USAcc + US, ASAcc + AS} end, {0, 0, 0, 0}, SuiteSummaries). diff --git a/tools/test.sh b/tools/test.sh index da64b5a5437..76bd7d4af5d 100755 --- a/tools/test.sh +++ b/tools/test.sh @@ -14,7 +14,7 @@ DEFAULT_PRESET=internal_mnesia PRESET="${PRESET-$DEFAULT_PRESET}" SMALL_TESTS="${SMALL_TESTS:-true}" EUNIT_TESTS="${EUNIT_TESTS:-false}" -COVER_ENABLED="${COVER_ENABLED:-true}" +export COVER_ENABLED="${COVER_ENABLED:-true}" REBAR_CT_EXTRA_ARGS="${REBAR_CT_EXTRA_ARGS:-}" while getopts ":p:s:e:c:h:" opt; do