Skip to content

[rb] Upgrade to Ruby 3.2 #15714

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

Merged
merged 3 commits into from
May 12, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .bazelrc
Original file line number Diff line number Diff line change
@@ -24,10 +24,10 @@ build --flag_alias=headless=//common:headless

# Set the default java toolchain

build --java_language_version=17
build --java_runtime_version=remotejdk_17
build --tool_java_language_version=17
build --tool_java_runtime_version=remotejdk_17
build --java_language_version=21
build --java_runtime_version=remotejdk_21
build --tool_java_language_version=21
build --tool_java_runtime_version=remotejdk_21

# We target java 11 by default

4 changes: 2 additions & 2 deletions .github/workflows/ci-rbe.yml
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ jobs:
with:
name: Check format script run
caching: false
ruby-version: jruby-9.4.12.0
ruby-version: jruby-10.0.0.0
run: ./scripts/github-actions/check-format.sh

test:
@@ -31,5 +31,5 @@ jobs:
with:
name: All RBE tests
caching: false
ruby-version: jruby-9.4.12.0
ruby-version: jruby-10.0.0.0
run: ./scripts/github-actions/ci-build.sh ${{ github.event.inputs.disable_test_cache }}
4 changes: 2 additions & 2 deletions .github/workflows/ci-renovate-rbe.yml
Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ jobs:
with:
name: Check format script run
caching: false
ruby-version: jruby-9.4.12.0
ruby-version: jruby-10.0.0.0
run: ./scripts/github-actions/check-format.sh

test:
@@ -58,7 +58,7 @@ jobs:
with:
name: All RBE tests
caching: false
ruby-version: jruby-9.4.12.0
ruby-version: jruby-10.0.0.0
run: ./scripts/github-actions/ci-build.sh

ci-gh:
12 changes: 6 additions & 6 deletions .github/workflows/ci-ruby.yml
Original file line number Diff line number Diff line change
@@ -30,17 +30,17 @@ jobs:
fail-fast: false
matrix:
include:
- ruby-version: 3.1.6
- ruby-version: 3.2.8
os: ubuntu
- ruby-version: 3.1.6
- ruby-version: 3.2.8
os: windows
- ruby-version: 3.1.6
- ruby-version: 3.2.8
os: macos
- ruby-version: 3.3.5
- ruby-version: 3.4.3
os: ubuntu
- ruby-version: jruby-9.4.12.0
- ruby-version: jruby-10.0.0.0
os: ubuntu
- ruby-version: truffleruby-24.1.1
- ruby-version: truffleruby-24.2.1
os: ubuntu
with:
name: Unit Tests (${{ matrix.ruby-version }}, ${{ matrix.os }})
2 changes: 1 addition & 1 deletion .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
@@ -82,7 +82,7 @@ jobs:
- name: Install Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.1'
ruby-version: '3.2'
working-directory: 'rb'
- name: Setup curl for Ubuntu
run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev
77 changes: 37 additions & 40 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ bazel_dep(name = "rules_oci", version = "1.8.0")
bazel_dep(name = "rules_pkg", version = "1.0.1")
bazel_dep(name = "rules_python", version = "1.1.0")
bazel_dep(name = "rules_proto", version = "7.0.2")
bazel_dep(name = "rules_ruby", version = "0.18.0")
bazel_dep(name = "rules_ruby", version = "0.19.0")

# Until `rules_jvm_external` 6.8 ships
git_override(
@@ -266,86 +266,83 @@ ruby.bundle_fetch(
gem_checksums = {
"activesupport-7.2.2.1": "842bcbf8a92977f80fb4750661a237cf5dd4fdd442066b3c35e88afb488647f5",
"addressable-2.8.7": "462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232",
"ast-2.4.2": "1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12",
"ast-2.4.3": "954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383",
"base64-0.2.0": "0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507",
"benchmark-0.4.0": "0f12f8c495545e3710c3e4f0480f63f06b4c842cc94cec7f33a956f5180e874a",
"bigdecimal-3.1.9": "2ffc742031521ad69c2dfc815a98e426a230a3d22aeac1995826a75dabfad8cc",
"bigdecimal-3.1.9-java": "dd9b8f7c870664cd9538a1325ce385ba57a6627969177258c4f0e661a7be4456",
"concurrent-ruby-1.3.5": "813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6",
"connection_pool-2.5.0": "233b92f8d38e038c1349ccea65dd3772727d669d6d2e71f9897c8bf5cd53ebfc",
"connection_pool-2.5.3": "cfd74a82b9b094d1ce30c4f1a346da23ee19dc8a062a16a85f58eab1ced4305b",
"crack-1.0.0": "c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49",
"csv-3.3.2": "6ff0c135e65e485d1864dde6c1703b60d34cc9e19bed8452834a0b28a519bd4e",
"csv-3.3.4": "e96ecd5a8c3494aa5b596282249daba5c6033203c199248e6146e36d2a78d8cd",
"curb-1.0.9": "07e5b74a4836103ce186827528f76a22d3991a9b7c45f5c10ee18ee7b03feb0d",
"date-3.4.1": "bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f",
"date-3.4.1-java": "74740d914c65a922a15657c25ff0e203c16f1d0f7aa910a9ebed712afe9819c4",
"debug-1.10.0": "11e28ca74875979e612444104f3972bd5ffb9e79179907d7ad46dba44bd2e7a4",
"diff-lcs-1.6.0": "a1e7f7b272962f8fc769358ad00001b87cdcf32ba349d6c70c6b544613d2da2e",
"diff-lcs-1.6.1": "12a5a83f3e37a8e2f4427268e305914d5f1879f22b4e73bb1a09f76a3dd86cd4",
"drb-2.2.1": "e9d472bf785f558b96b25358bae115646da0dbfd45107ad858b0bc0d935cb340",
"ffi-1.17.1": "26f6b0dbd1101e6ffc09d3ca640b2a21840cc52731ad8a7ded9fb89e5fb0fc39",
"ffi-1.17.1-arm64-darwin": "a8e04f79d375742c54ee7f9fff4b4022b87200a4ec0eb082128d3b6559e67b4d",
"ffi-1.17.1-java": "2546e11f9592e2b9b6de49eb96d2a378da47b0bb8469d5cbc9881a55c0d55da7",
"ffi-1.17.1-x64-mingw-ucrt": "da79a832aee7ccd3635b4ec5e8a1927aed786e7ea03f2e33e2c06ea4fcece4a0",
"ffi-1.17.1-x86_64-darwin": "0036199c290462dd7f03bc22933644c1685b7834a21788062bd5df48c72aa7a6",
"ffi-1.17.1-x86_64-linux-gnu": "8c0ade2a5d19f3672bccfe3b58e016ae5f159e3e2e741c856db87fcf07c903d0",
"ffi-1.17.2": "297235842e5947cc3036ebe64077584bff583cd7a4e94e9a02fdec399ef46da6",
"ffi-1.17.2-java": "94c8516d7c97b21915497b994e41f69e7e8e21d5fc085c498b68e52044e191ec",
"ffi-1.17.2-x64-mingw-ucrt": "15d2da54ee578657a333a6059ed16eaba1cbd794ceecd15944825b65c8381ac0",
"ffi-1.17.2-x86_64-darwin": "981f2d4e32ea03712beb26e55e972797c2c5a7b0257955d8667ba58f2da6440e",
"ffi-1.17.2-x86_64-linux-gnu": "05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea",
"fileutils-1.7.3": "57271e854b694a87755d76f836f5c57b2c9538ebbaf4b2154bb66addf15eb5da",
"git-1.19.1": "b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70",
"hashdiff-1.1.2": "2c30eeded6ed3dce8401d2b5b99e6963fe5f14ed85e60dd9e33c545a44b71a77",
"i18n-1.14.7": "ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f",
"io-console-0.8.0": "cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2",
"io-console-0.8.0-java": "3cc6fd5c66e587145c1fdf8dc40c2e3d851e90722a5d0cc3f38da352f06fe1bd",
"irb-1.15.1": "d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890",
"irb-1.15.2": "222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba",
"jar-dependencies-0.5.5": "2972b9fcba4b014e6446a84b5c09674a3e8648b95b71768e729f0e8e40568059",
"json-2.10.1": "ddc88ad91a1baf3f0038c174f253af3b086d30dc74db17ca4259bbde982f94dc",
"json-2.10.1-java": "de07233fb74113af2186eb9342f8207c9be0faf289a1e2623c9b0acb8b0b0ee1",
"json-2.11.3": "9a10f658a2de67c0eb837eb795dd48132ce797c403e52b5ebef87dcdc7f9ccc1",
"json-2.11.3-java": "cfe8db24e49073c5bcd93699d106a1c1c9e5bc301fcc0de05965e72fad999a34",
"language_server-protocol-3.17.0.4": "c484626478664fd13482d8180947c50a8590484b1258b99b7aedb3b69df89669",
"lint_roller-1.1.0": "2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87",
"listen-3.9.0": "db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67",
"logger-1.6.6": "dd618d24e637715472732e7eed02e33cfbdf56deaad225edd0f1f89d38024017",
"minitest-5.25.4": "9cf2cae25ac4dfc90c988ebc3b917f53c054978b673273da1bd20bcb0778f947",
"parallel-1.26.3": "d86babb7a2b814be9f4b81587bf0b6ce2da7d45969fab24d8ae4bf2bb4d4c7ef",
"parser-3.3.7.1": "7dbe61618025519024ac72402a6677ead02099587a5538e84371b76659e6aca1",
"logger-1.7.0": "196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203",
"minitest-5.25.5": "391b6c6cb43a4802bfb7c93af1ebe2ac66a210293f4a3fb7db36f2fc7dc2c756",
"parallel-1.27.0": "4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130",
"parser-3.3.8.0": "2476364142b307fa5a1b1ece44f260728be23858a9c71078e956131a75453c45",
"pp-0.6.2": "947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff",
"prettyprint-0.2.0": "2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193",
"psych-5.2.3": "84a54bb952d14604fea22d99938348814678782f58b12648fcdfa4d2fce859ee",
"psych-5.2.3-java": "3e5425b9e8a2f41cc2707d5ef14fdc1ae908abbafb12fe45727bd63900056585",
"public_suffix-6.0.1": "61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f",
"prism-1.4.0": "dc0e3e00e93160213dc2a65519d9002a4a1e7b962db57d444cf1a71565bb703e",
"psych-5.2.4": "f2d9810f7f383a6b0fbc705202851e1a55b236bcb8e168ab5dfa5741842ec7c5",
"psych-5.2.4-java": "a3ae584e85e11fd069f17a563ef18f204d3df0fde0c093d35ae494fd64164664",
"public_suffix-6.0.2": "bfa7cd5108066f8c9602e0d6d4114999a5df5839a63149d3e8b0f9c1d3558394",
"racc-1.8.1": "4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f",
"racc-1.8.1-java": "54f2e6d1e1b91c154013277d986f52a90e5ececbe91465d29172e49342732b98",
"rack-2.2.11": "424c49affa19081e9255d65d861f2d7bc7d8388edc0cb608b5e6caf1dd49bb8a",
"rack-2.2.13": "ccee101719696a5da12ee9da6fb3b1d20cb329939e089e0e458be6e93667f0fb",
"rainbow-3.1.1": "039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a",
"rake-13.2.1": "46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d",
"rb-fsevent-0.11.2": "43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe",
"rb-inotify-0.11.1": "a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e",
"rbs-3.8.1": "2b6ce37952e267e1d3ad330aabfadbdceac234193a60cc18f25a8f75fa949c1d",
"rbs-3.9.2": "873b5d01a11f3dc15a7cc3bd66d9d50c3d05fad4fbb73b47704eb96f0ba6faf2",
"rchardet-1.9.0": "26889486cdd83b378652baf7603f71d93e431bb11bc237b4cd8c65151af4a590",
"rdoc-6.12.0": "7d6f706e070bffa5d18a448f24076cbfb34923a99c1eab842aa18e6ca69f56e0",
"rdoc-6.13.1": "62a0dac99493c94e8eb7a3fb44e55aefcb4cecb119f7991f25bddc5ed8d472f7",
"regexp_parser-2.10.0": "cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61",
"reline-0.6.0": "57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2",
"reline-0.6.1": "1afcc9d7cb1029cdbe780d72f2f09251ce46d3780050f3ec39c3ccc6b60675fb",
"rexml-3.4.1": "c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca",
"rspec-3.13.0": "d490914ac1d5a5a64a0e1400c1d54ddd2a501324d703b8cfe83f458337bab993",
"rspec-core-3.13.3": "25136507f4f9cf2e8977a2851e64e438b4331646054e345998714108745cdfe4",
"rspec-expectations-3.13.3": "0e6b5af59b900147698ea0ff80456c4f2e69cac4394fbd392fbd1ca561f66c58",
"rspec-mocks-3.13.2": "2327335def0e1665325a9b617e3af9ae20272741d80ac550336309a7c59abdef",
"rspec-support-3.13.2": "cea3a2463fd9b84b9dcc9685efd80ea701aa8f7b3decb3b3ce795ed67737dbec",
"rubocop-1.72.2": "0259a32d89fee60882bf4c4d8847e696357719c9db4971839da742bf053ae96b",
"rubocop-ast-1.38.0": "4fdf6792fe443a9a18acb12dbc8225d0d64cd1654e41fedb30e79c18edbb26ae",
"rubocop-capybara-2.21.0": "5d264efdd8b6c7081a3d4889decf1451a1cfaaec204d81534e236bc825b280ab",
"rubocop-factory_bot-2.26.1": "8de13cd4edcee5ca800f255188167ecef8dbfc3d1fae9f15734e9d2e755392aa",
"rubocop-performance-1.24.0": "e5bd39ff3e368395b9af886927cc37f5892f43db4bd6c8526594352d5b4440b5",
"rubocop-rake-0.6.0": "56b6f22189af4b33d4f4e490a555c09f1281b02f4d48c3a61f6e8fe5f401d8db",
"rubocop-rspec-2.31.0": "2bae19388d78e1ceace44cd95fd34f3209f4ef20cac1b168d0a1325cbba3d672",
"rubocop-rspec_rails-2.29.1": "4ae95abbe9ca5a9b6d8be14e50d230fb5b6ba033b05d4c0981b5b76fc44988e4",
"rspec-expectations-3.13.4": "4e43459765dfee900b25aa1361e106ab0799895ede65fc57872069feb559ecd8",
"rspec-mocks-3.13.3": "be08abadfe28e932d03b8e70215cd5972bd7693e0f1a45c7479b11e9a773c3c2",
"rspec-support-3.13.3": "2a61e393f6e18b7228726e0c6869c5d5a1419d37206116c4d917d145276b3f43",
"rubocop-1.75.4": "e0656af44d0811bb40f6d0bd4ed6c8d80c0f05f3444f0e8f0839833dd46d18c6",
"rubocop-ast-1.44.1": "e3cc04203b2ef04f6d6cf5f85fe6d643f442b18cc3b23e3ada0ce5b6521b8e92",
"rubocop-performance-1.25.0": "6f7d03568a770054117a78d0a8e191cefeffb703b382871ca7743831b1a52ec1",
"rubocop-rake-0.7.1": "3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d",
"rubocop-rspec-3.6.0": "c0e4205871776727e54dee9cc91af5fd74578001551ba40e1fe1a1ab4b404479",
"ruby-progressbar-1.13.0": "80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33",
"rubyzip-2.4.1": "8577c88edc1fde8935eb91064c5cb1aef9ad5494b940cf19c775ee833e075615",
"securerandom-0.4.1": "cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1",
"steep-1.5.3": "7c6302a4d5932d0a46176ebc79766e52b853c223a85525aa2f8911e345123b85",
"stringio-3.1.4": "7dd68f6f1a88610817c21f6d926dbf36e1fc585d3869fcd4a56c1f3210591d70",
"strscan-3.1.2": "5529ff36c95fe752b8489f2e6c7f4f230fd9904e0b24fdc6e0833436c63ee2e3",
"strscan-3.1.2-java": "4e9379df974b1af28d1bc1bc845ebb7e2bb21a7f9948ac99e1a8c5479881ecec",
"stringio-3.1.7": "5b78b7cb242a315fb4fca61a8255d62ec438f58da2b90be66048546ade4507fa",
"strscan-3.1.4": "8e130a503aa6c79352c6ac02a9819507c8b8720c174ce8335e3eb2c8cc2ae042",
"strscan-3.1.4-java": "5551e01d215ba8ac7dadb6dab46b9fb4c33303ba63eaf3e1b0496c078b8d3fb8",
"terminal-table-3.0.2": "f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91",
"tzinfo-2.0.6": "8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b",
"unicode-display_width-2.6.0": "12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a",
"webmock-3.25.0": "573c23fc4887008c830f22da588db339ca38b6d59856fd57f5a068959474198e",
"webmock-3.25.1": "ab9d5d9353bcbe6322c83e1c60a7103988efc7b67cd72ffb9012629c3d396323",
"webrick-1.9.1": "b42d3c94f166f3fb73d87e9b359def9b5836c426fc8beacf38f2184a21b2a989",
"websocket-1.2.11": "b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737",
"yard-0.9.37": "a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992",
11 changes: 10 additions & 1 deletion java/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
load("@contrib_rules_jvm//java:defs.bzl", "spotbugs_config")
load("@contrib_rules_jvm//java:defs.bzl", "spotbugs_binary", "spotbugs_config")
load(":defs.bzl", "artifact")

exports_files(
@@ -34,11 +34,20 @@ java_library(
],
)

spotbugs_binary(
name = "spotbugs-cli",
runtime_deps = [
artifact("com.github.spotbugs:spotbugs"),
artifact("org.slf4j:slf4j-jdk14"),
],
)

spotbugs_config(
name = "spotbugs-config",
effort = "default",
exclude_filter = "spotbugs-excludes.xml",
fail_on_warning = True,
spotbugs_binary = ":spotbugs-cli",
visibility = [
"//visibility:public",
],
11 changes: 10 additions & 1 deletion java/spotbugs-excludes.xml
Original file line number Diff line number Diff line change
@@ -4,6 +4,10 @@
xmlns="https://github.com/spotbugs/filter/3.0.0"
xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd">

<Match>
<Bug code="CT"/>
</Match>

<Match>
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC,EI_EXPOSE_REP,EI_EXPOSE_REP2,EI_EXPOSE_BUF2"/>
</Match>
@@ -139,7 +143,7 @@
<Class name="org.openqa.selenium.json.JsonInputIterator"/>
<Bug pattern="IT_NO_SUCH_ELEMENT"/>
</Match>

<Match>
<Class name="org.openqa.selenium.net.NetworkUtils"/>
<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
@@ -240,4 +244,9 @@
<Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE,IS2_INCONSISTENT_SYNC"/>
</Match>

<Match>
<Class name="org.openqa.selenium.remote.http.jdk.JdkHttpClient"/>
<Bug pattern="BC_VACUOUS_INSTANCEOF"/>
</Match>

</FindBugsFilter>
32 changes: 28 additions & 4 deletions java/src/org/openqa/selenium/chromium/ChromiumDriver.java
Original file line number Diff line number Diff line change
@@ -321,6 +321,10 @@ public void launchApp(String id) {
@Override
public Map<String, Object> executeCdpCommand(String commandName, Map<String, Object> parameters) {
Require.nonNull("Command Name", commandName);
if (this.cdp == null) {
return java.util.Collections.emptyMap();
}

return cdp.executeCdpCommand(commandName, parameters);
}

@@ -358,36 +362,56 @@ public Optional<BiDi> maybeGetBiDi() {

@Override
public List<Map<String, String>> getCastSinks() {
if (this.casting == null) {
return java.util.Collections.emptyList();
}

return casting.getCastSinks();
}

@Override
public String getCastIssueMessage() {
if (this.casting == null) {
return "";
}

return casting.getCastIssueMessage();
}

@Override
public void selectCastSink(String deviceName) {
Require.nonNull("Device Name", deviceName);
casting.selectCastSink(deviceName);

if (this.casting != null) {
casting.selectCastSink(deviceName);
}
}

@Override
public void startDesktopMirroring(String deviceName) {
Require.nonNull("Device Name", deviceName);
casting.startDesktopMirroring(deviceName);

if (this.casting != null) {
casting.startDesktopMirroring(deviceName);
}
}

@Override
public void startTabMirroring(String deviceName) {
Require.nonNull("Device Name", deviceName);
casting.startTabMirroring(deviceName);

if (this.casting != null) {
casting.startTabMirroring(deviceName);
}
}

@Override
public void stopCasting(String deviceName) {
Require.nonNull("Device Name", deviceName);
casting.stopCasting(deviceName);

if (this.casting != null) {
casting.stopCasting(deviceName);
}
}

@Override
5 changes: 3 additions & 2 deletions java/src/org/openqa/selenium/firefox/ProfilesIni.java
Original file line number Diff line number Diff line change
@@ -136,10 +136,11 @@ protected File locateAppDataDirectory(Platform os) {
appData =
new File(
MessageFormat.format(
"{0}/Library/Application Support/Firefox", System.getenv("HOME")));
"{0}/Library/Application Support/Firefox", System.getProperty("user.home")));

} else {
appData = new File(MessageFormat.format("{0}/.mozilla/firefox", System.getenv("HOME")));
appData =
new File(MessageFormat.format("{0}/.mozilla/firefox", System.getProperty("user.home")));
}

if (!appData.exists()) {
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@
public class OpenTelemetryTracer implements org.openqa.selenium.remote.tracing.Tracer {

private static final Logger LOG = Logger.getLogger(OpenTelemetryTracer.class.getName());
private static boolean HTTP_LOGS;
private static volatile boolean HTTP_LOGS;

// We obtain the underlying tracer instance from the singleton instance
// that OpenTelemetry maintains. If we blindly grabbed the tracing provider
2 changes: 1 addition & 1 deletion rb/.rubocop.yml
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ plugins:
- rubocop-rspec

AllCops:
TargetRubyVersion: 3.1
TargetRubyVersion: 3.2
NewCops: enable
Exclude:
- !ruby/regexp /lib\/selenium\/devtools\/v\d+/
2 changes: 1 addition & 1 deletion rb/.ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.1.6
3.2.8
2 changes: 1 addition & 1 deletion rb/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# selenium-webdriver

This gem provides Ruby bindings for Selenium and supports MRI >= 3.1.
This gem provides Ruby bindings for Selenium and supports MRI >= 3.2.

## Install

9 changes: 4 additions & 5 deletions rb/lib/selenium/webdriver.rb
Original file line number Diff line number Diff line change
@@ -21,7 +21,6 @@
require 'fileutils'
require 'date'
require 'json'
require 'set'
require 'uri'
require 'net/http'

@@ -85,8 +84,8 @@ def self.root
# @see Selenium::WebDriver::Support::AbstractEventListener
#

def self.for(*args)
WebDriver::Driver.for(*args)
def self.for(*)
WebDriver::Driver.for(*)
end

#
@@ -95,9 +94,9 @@ def self.for(*args)
# @return [Logger]
#

def self.logger(**opts)
def self.logger(**)
level = $DEBUG || ENV.key?('DEBUG') ? :debug : :info
@logger ||= WebDriver::Logger.new('Selenium', default_level: level, **opts)
@logger ||= WebDriver::Logger.new('Selenium', default_level: level, **)
end
end # WebDriver
end # Selenium
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/atoms.rb
Original file line number Diff line number Diff line change
@@ -31,8 +31,8 @@ def read_atom(function)
File.read(File.expand_path("../atoms/#{function}.js", __FILE__))
end

def execute_atom(function_name, *arguments)
execute_script(atom_script(function_name), *arguments)
def execute_atom(function_name, *)
execute_script(atom_script(function_name), *)
end
end # Atoms
end # WebDriver
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/bidi/log/console_log_entry.rb
Original file line number Diff line number Diff line change
@@ -23,8 +23,8 @@ class BiDi
class ConsoleLogEntry < GenericLogEntry
attr_accessor :method, :realm, :args

def initialize(method:, realm:, args:, **opts)
super(**opts)
def initialize(method:, realm:, args:, **)
super(**)
@method = method
@realm = realm
@args = args
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/chrome/driver.rb
Original file line number Diff line number Diff line change
@@ -30,9 +30,9 @@ module Chrome
class Driver < Chromium::Driver
include LocalDriver

def initialize(options: nil, service: nil, url: nil, **opts)
def initialize(options: nil, service: nil, url: nil, **)
caps, url = initialize_local_driver(options, service, url)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
end

def browser
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/chromium/options.rb
Original file line number Diff line number Diff line change
@@ -67,8 +67,8 @@ class Options < WebDriver::Options
# @option opts [Array<String>] window_types A list of window types to appear in the list of window handles
#

def initialize(profile: nil, **opts)
super(**opts)
def initialize(profile: nil, **)
super(**)

@profile = profile

16 changes: 8 additions & 8 deletions rb/lib/selenium/webdriver/common/driver.rb
Original file line number Diff line number Diff line change
@@ -68,9 +68,9 @@ def for(browser, opts = {})
# @api private
#

def initialize(bridge: nil, listener: nil, **opts)
def initialize(bridge: nil, listener: nil, **)
@devtools = nil
bridge ||= create_bridge(**opts)
bridge ||= create_bridge(**)
@bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
add_extensions(@bridge.browser)
end
@@ -131,8 +131,8 @@ def manage
# @see ActionBuilder
#

def action(**opts)
bridge.action(**opts)
def action(**)
bridge.action(**)
end

#
@@ -225,8 +225,8 @@ def window_handle
# The value returned from the script.
#

def execute_script(script, *args)
bridge.execute_script(script, *args)
def execute_script(script, *)
bridge.execute_script(script, *)
end

# Execute an asynchronous piece of JavaScript in the context of the
@@ -244,8 +244,8 @@ def execute_script(script, *args)
# @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
#

def execute_async_script(script, *args)
bridge.execute_async_script(script, *args)
def execute_async_script(script, *)
bridge.execute_async_script(script, *)
end

#
8 changes: 4 additions & 4 deletions rb/lib/selenium/webdriver/common/interactions/key_actions.rb
Original file line number Diff line number Diff line change
@@ -44,8 +44,8 @@ module KeyActions
# @return [ActionBuilder] A self reference
#

def key_down(*args, device: nil)
key_action(*args, action: :create_key_down, device: device)
def key_down(*, device: nil)
key_action(*, action: :create_key_down, device: device)
end

#
@@ -71,8 +71,8 @@ def key_down(*args, device: nil)
# @return [ActionBuilder] A self reference
#

def key_up(*args, device: nil)
key_action(*args, action: :create_key_up, device: device)
def key_up(*, device: nil)
key_action(*, action: :create_key_up, device: device)
end

#
20 changes: 10 additions & 10 deletions rb/lib/selenium/webdriver/common/interactions/pointer_actions.rb
Original file line number Diff line number Diff line change
@@ -46,8 +46,8 @@ def default_move_duration
# @return [ActionBuilder] A self reference.
#

def pointer_down(button = :left, device: nil, **opts)
button_action(button, :create_pointer_down, device: device, **opts)
def pointer_down(button = :left, device: nil, **)
button_action(button, :create_pointer_down, device: device, **)
end

#
@@ -63,8 +63,8 @@ def pointer_down(button = :left, device: nil, **opts)
# @return [ActionBuilder] A self reference.
#

def pointer_up(button = :left, device: nil, **opts)
button_action(button, :create_pointer_up, device: device, **opts)
def pointer_up(button = :left, device: nil, **)
button_action(button, :create_pointer_up, device: device, **)
end

#
@@ -122,13 +122,13 @@ def move_to(element, right_by = nil, down_by = nil, **opts)
# @raise [MoveTargetOutOfBoundsError] if the provided offset is outside the document's boundaries.
#

def move_by(right_by, down_by, device: nil, duration: default_move_duration, **opts)
def move_by(right_by, down_by, device: nil, duration: default_move_duration, **)
pointer = pointer_input(device)
pointer.create_pointer_move(duration: duration,
x: Integer(right_by),
y: Integer(down_by),
origin: Interactions::PointerMove::POINTER,
**opts)
**)
tick(pointer)
self
end
@@ -150,13 +150,13 @@ def move_by(right_by, down_by, device: nil, duration: default_move_duration, **o
# @raise [MoveTargetOutOfBoundsError] if the provided x or y value is outside the document's boundaries.
#

def move_to_location(x, y, device: nil, duration: default_move_duration, **opts)
def move_to_location(x, y, device: nil, duration: default_move_duration, **)
pointer = pointer_input(device)
pointer.create_pointer_move(duration: duration,
x: Integer(x),
y: Integer(y),
origin: Interactions::PointerMove::VIEWPORT,
**opts)
**)
tick(pointer)
self
end
@@ -336,9 +336,9 @@ def drag_and_drop_by(source, right_by, down_by, device: nil)

private

def button_action(button, action, device: nil, **opts)
def button_action(button, action, device: nil, **)
pointer = pointer_input(device)
pointer.send(action, button, **opts)
pointer.send(action, button, **)
tick(pointer)
self
end
12 changes: 6 additions & 6 deletions rb/lib/selenium/webdriver/common/interactions/pointer_input.rb
Original file line number Diff line number Diff line change
@@ -49,16 +49,16 @@ def assert_kind(pointer)
KIND[pointer]
end

def create_pointer_move(duration: 0, x: 0, y: 0, origin: nil, **opts)
add_action(PointerMove.new(self, duration, x, y, origin: origin, **opts))
def create_pointer_move(duration: 0, x: 0, y: 0, origin: nil, **)
add_action(PointerMove.new(self, duration, x, y, origin: origin, **))
end

def create_pointer_down(button, **opts)
add_action(PointerPress.new(self, :down, button, **opts))
def create_pointer_down(button, **)
add_action(PointerPress.new(self, :down, button, **))
end

def create_pointer_up(button, **opts)
add_action(PointerPress.new(self, :up, button, **opts))
def create_pointer_up(button, **)
add_action(PointerPress.new(self, :up, button, **))
end

def create_pointer_cancel
20 changes: 10 additions & 10 deletions rb/lib/selenium/webdriver/common/options.rb
Original file line number Diff line number Diff line change
@@ -29,26 +29,26 @@ class Options
class << self
attr_reader :driver_path

def chrome(**opts)
Chrome::Options.new(**opts)
def chrome(**)
Chrome::Options.new(**)
end

def firefox(**opts)
Firefox::Options.new(**opts)
def firefox(**)
Firefox::Options.new(**)
end

def ie(**opts)
IE::Options.new(**opts)
def ie(**)
IE::Options.new(**)
end
alias internet_explorer ie

def edge(**opts)
Edge::Options.new(**opts)
def edge(**)
Edge::Options.new(**)
end
alias microsoftedge edge

def safari(**opts)
Safari::Options.new(**opts)
def safari(**)
Safari::Options.new(**)
end

def set_capabilities
20 changes: 10 additions & 10 deletions rb/lib/selenium/webdriver/common/service.rb
Original file line number Diff line number Diff line change
@@ -28,27 +28,27 @@ class Service
class << self
attr_reader :driver_path

def chrome(**opts)
Chrome::Service.new(**opts)
def chrome(**)
Chrome::Service.new(**)
end

def firefox(**opts)
Firefox::Service.new(**opts)
def firefox(**)
Firefox::Service.new(**)
end

def ie(**opts)
IE::Service.new(**opts)
def ie(**)
IE::Service.new(**)
end
alias internet_explorer ie

def edge(**opts)
Edge::Service.new(**opts)
def edge(**)
Edge::Service.new(**)
end
alias microsoftedge edge
alias msedge edge

def safari(**opts)
Safari::Service.new(**opts)
def safari(**)
Safari::Service.new(**)
end

def driver_path=(path)
Original file line number Diff line number Diff line change
@@ -26,12 +26,12 @@ module Selenium
module WebDriver
class Credential
class << self
def resident(**opts)
Credential.new(resident_credential: true, **opts)
def resident(**)
Credential.new(resident_credential: true, **)
end

def non_resident(**opts)
Credential.new(resident_credential: false, **opts)
def non_resident(**)
Credential.new(resident_credential: false, **)
end

def encode(byte_array)
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/edge/driver.rb
Original file line number Diff line number Diff line change
@@ -30,9 +30,9 @@ module Edge
class Driver < Chromium::Driver
include LocalDriver

def initialize(options: nil, service: nil, url: nil, **opts)
def initialize(options: nil, service: nil, url: nil, **)
caps, url = initialize_local_driver(options, service, url)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
end

def browser
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/firefox/driver.rb
Original file line number Diff line number Diff line change
@@ -36,9 +36,9 @@ class Driver < WebDriver::Driver

include LocalDriver

def initialize(options: nil, service: nil, url: nil, **opts)
def initialize(options: nil, service: nil, url: nil, **)
caps, url = initialize_local_driver(options, service, url)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
end

def browser
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/ie/driver.rb
Original file line number Diff line number Diff line change
@@ -31,9 +31,9 @@ class Driver < WebDriver::Driver

include LocalDriver

def initialize(options: nil, service: nil, url: nil, **opts)
def initialize(options: nil, service: nil, url: nil, **)
caps, url = initialize_local_driver(options, service, url)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
end

def browser
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/remote/driver.rb
Original file line number Diff line number Diff line change
@@ -30,12 +30,12 @@ class Driver < WebDriver::Driver
include DriverExtensions::HasSessionId
include DriverExtensions::HasFileDownloads

def initialize(capabilities: nil, options: nil, service: nil, url: nil, **opts)
def initialize(capabilities: nil, options: nil, service: nil, url: nil, **)
raise ArgumentError, "Can not set :service object on #{self.class}" if service

url ||= "http://#{Platform.localhost}:4444/wd/hub"
caps = process_options(options, capabilities)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
@bridge.file_detector = ->((filename, *)) { File.exist?(filename) && filename.to_s }
command_list = @bridge.command_list
@bridge.extend(WebDriver::Remote::Features)
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/safari/driver.rb
Original file line number Diff line number Diff line change
@@ -31,9 +31,9 @@ class Driver < WebDriver::Driver

include LocalDriver

def initialize(options: nil, service: nil, url: nil, **opts)
def initialize(options: nil, service: nil, url: nil, **)
caps, url = initialize_local_driver(options, service, url)
super(caps: caps, url: url, **opts)
super(caps: caps, url: url, **)
end

def browser
4 changes: 2 additions & 2 deletions rb/lib/selenium/webdriver/support/block_event_listener.rb
Original file line number Diff line number Diff line change
@@ -25,8 +25,8 @@ def initialize(callback)
@callback = callback
end

def method_missing(meth, *args) # rubocop:disable Style/MissingRespondToMissing
@callback.call meth, *args
def method_missing(meth, *) # rubocop:disable Style/MissingRespondToMissing
@callback.call(meth, *)
end
end # BlockEventListener
end # Support
6 changes: 3 additions & 3 deletions rb/lib/selenium/webdriver/support/event_firing_bridge.rb
Original file line number Diff line number Diff line change
@@ -112,10 +112,10 @@ def driver
@driver ||= Driver.new(bridge: self)
end

def dispatch(name, *args)
@listener.__send__(:"before_#{name}", *args)
def dispatch(name, *)
@listener.__send__(:"before_#{name}", *)
returned = yield
@listener.__send__(:"after_#{name}", *args)
@listener.__send__(:"after_#{name}", *)

returned
end
2 changes: 1 addition & 1 deletion rb/selenium-devtools.gemspec
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
}

s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
s.required_ruby_version = Gem::Requirement.new('>= 3.1')
s.required_ruby_version = Gem::Requirement.new('>= 3.2')

s.files = [
'LICENSE',
2 changes: 1 addition & 1 deletion rb/selenium-webdriver.gemspec
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
}

s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
s.required_ruby_version = Gem::Requirement.new('>= 3.1')
s.required_ruby_version = Gem::Requirement.new('>= 3.2')

s.files = [
'CHANGES',
Original file line number Diff line number Diff line change
@@ -164,14 +164,14 @@ def root
@root ||= Pathname.new('../../../../../../../').realpath(__FILE__)
end

def create_driver!(listener: nil, **opts, &block)
def create_driver!(listener: nil, **, &block)
check_for_previous_error

method = :"#{driver}_driver"
instance = if private_methods.include?(method)
send(method, listener: listener, options: build_options(**opts))
send(method, listener: listener, options: build_options(**))
else
WebDriver::Driver.for(driver, listener: listener, options: build_options(**opts))
WebDriver::Driver.for(driver, listener: listener, options: build_options(**))
end
@create_driver_error_count -= 1 unless @create_driver_error_count.zero?
if block
@@ -191,12 +191,12 @@ def create_driver!(listener: nil, **opts, &block)

private

def build_options(**opts)
def build_options(**)
options_method = :"#{browser}_options"
if private_methods.include?(options_method)
send(options_method, **opts)
send(options_method, **)
else
WebDriver::Options.send(browser, **opts)
WebDriver::Options.send(browser, **)
end
end

@@ -225,45 +225,45 @@ def check_for_previous_error
raise DriverInstantiationError, msg, @create_driver_error.backtrace
end

def remote_driver(**opts)
def remote_driver(**)
url = ENV.fetch('WD_REMOTE_URL', remote_server.webdriver_url)

WebDriver::Driver.for(:remote, url: url, **opts)
WebDriver::Driver.for(:remote, url: url, **)
end

def chrome_driver(service: nil, **opts)
def chrome_driver(service: nil, **)
service ||= WebDriver::Service.chrome
service.args << '--disable-build-check' if ENV['DISABLE_BUILD_CHECK']
service.args << '--verbose' if WebDriver.logger.debug?
service.executable_path = ENV['CHROMEDRIVER_BINARY'] if ENV.key?('CHROMEDRIVER_BINARY')
WebDriver::Driver.for(:chrome, service: service, **opts)
WebDriver::Driver.for(:chrome, service: service, **)
end

def edge_driver(service: nil, **opts)
def edge_driver(service: nil, **)
service ||= WebDriver::Service.edge
service.args << '--disable-build-check' if ENV['DISABLE_BUILD_CHECK']
service.args << '--verbose' if WebDriver.logger.debug?
service.executable_path = ENV['MSEDGEDRIVER_BINARY'] if ENV.key?('MSEDGEDRIVER_BINARY')
WebDriver::Driver.for(:edge, service: service, **opts)
WebDriver::Driver.for(:edge, service: service, **)
end

def firefox_driver(service: nil, **opts)
def firefox_driver(service: nil, **)
service ||= WebDriver::Service.firefox
service.args.push('--log', 'trace') if WebDriver.logger.debug?
service.executable_path = ENV['GECKODRIVER_BINARY'] if ENV.key?('GECKODRIVER_BINARY')
WebDriver::Driver.for(:firefox, service: service, **opts)
WebDriver::Driver.for(:firefox, service: service, **)
end

def safari_driver(**opts)
def safari_driver(**)
service_opts = WebDriver.logger.debug? ? {args: '--diagnose'} : {}
service = WebDriver::Service.safari(**service_opts)
WebDriver::Driver.for(:safari, service: service, **opts)
WebDriver::Driver.for(:safari, service: service, **)
end

def safari_preview_driver(**opts)
def safari_preview_driver(**)
service_opts = WebDriver.logger.debug? ? {args: '--diagnose'} : {}
service = WebDriver::Service.safari(**service_opts)
WebDriver::Driver.for(:safari, service: service, **opts)
WebDriver::Driver.for(:safari, service: service, **)
end

def chrome_options(args: [], **opts)
@@ -299,9 +299,9 @@ def ie_options(**opts)
WebDriver::Options.ie(**opts)
end

def safari_preview_options(**opts)
def safari_preview_options(**)
WebDriver::Safari.technology_preview!
WebDriver::Options.safari(**opts)
WebDriver::Options.safari(**)
end

def random_port
2 changes: 1 addition & 1 deletion rb/spec/unit/selenium/webdriver/chrome/options_spec.rb
Original file line number Diff line number Diff line change
@@ -247,7 +247,7 @@ module Chrome

expect {
options.as_json
}.to raise_error(Error::WebDriverError, 'These options are not w3c compliant: {:foo=>"bar"}')
}.to raise_error(Error::WebDriverError, /These options are not w3c compliant: \{:?foo[:=][ >]"bar"\}/)
end

it 'returns added options' do
2 changes: 1 addition & 1 deletion rb/spec/unit/selenium/webdriver/edge/options_spec.rb
Original file line number Diff line number Diff line change
@@ -209,7 +209,7 @@ module Edge

expect {
options.as_json
}.to raise_error(Error::WebDriverError, 'These options are not w3c compliant: {:foo=>"bar"}')
}.to raise_error(Error::WebDriverError, /These options are not w3c compliant: \{:?foo[:=][ >]"bar"\}/)
end

it 'returns added options' do
31 changes: 21 additions & 10 deletions rb/spec/unit/selenium/webdriver/guard_spec.rb
Original file line number Diff line number Diff line change
@@ -77,16 +77,22 @@ module Support
guards = described_class.new(example)
guards.add_condition(:foo, false)

expect(guards.disposition).to eq [:pending,
'Test guarded; Guarded by {:foo=>false, :reason=>"No reason given"};']
expect(guards.disposition.size).to eq(2)
expect(guards.disposition[0]).to eq :pending
message = /Test guarded;/
guarded_by = /Guarded by {:?foo[:=][ >]false, :?reason[:=][ >]"No reason given"};/
expect(guards.disposition[1]).to match(/#{message} #{guarded_by}/)
end

it 'is skipped without provided reason', exclusive: {foo: true} do |example|
guards = described_class.new(example)
guards.add_condition(:foo, false)

message = 'Test does not apply to this configuration; Guarded by {:foo=>true, :reason=>"No reason given"};'
expect(guards.disposition).to eq [:skip, message]
expect(guards.disposition.size).to eq(2)
expect(guards.disposition[0]).to eq :skip
message = /Test does not apply to this configuration;/
guarded_by = /Guarded by {:?foo[:=][ >]true, :?reason[:=][ >]"No reason given"};/
expect(guards.disposition[1]).to match(/#{message} #{guarded_by}/)
end
end

@@ -158,7 +164,7 @@ module Support
it 'defaults to no reason given' do
guard = described_class.new({}, :only)

expect(guard.message).to eq('Test guarded; Guarded by {:reason=>"No reason given"};')
expect(guard.message).to match(/Test guarded; Guarded by {:?reason[:=][ >]"No reason given"};/)
end

it 'accepts integer' do |example|
@@ -171,7 +177,7 @@ module Support
it 'accepts String' do
guard = described_class.new({reason: 'because'}, :only)

expect(guard.message).to eq('Test guarded; Guarded by {:reason=>"because"};')
expect(guard.message).to match(/Test guarded; Guarded by {:?reason[:=][ >]"because"};/)
end

it 'accepts Symbol of known message' do
@@ -191,20 +197,25 @@ module Support
it 'has special message for exclude' do
guard = described_class.new({reason: 'because'}, :exclude)

expect(guard.message).to eq('Test skipped because it breaks test run; Guarded by {:reason=>"because"};')
message = /Test skipped because it breaks test run;/
guarded_by = /Guarded by {:?reason[:=][ >]"because"};/
expect(guard.message).to match(/#{message} #{guarded_by}/)
end

it 'has special message for flaky' do
guard = described_class.new({reason: 'because'}, :flaky)

msg = 'Test skipped because it is unreliable in this configuration; Guarded by {:reason=>"because"};'
expect(guard.message).to eq(msg)
message = /Test skipped because it is unreliable in this configuration;/
guarded_by = /Guarded by {:?reason[:=][ >]"because"};/
expect(guard.message).to match(/#{message} #{guarded_by}/)
end

it 'has special message for exclusive' do
guard = described_class.new({reason: 'because'}, :exclusive)

expect(guard.message).to eq('Test does not apply to this configuration; Guarded by {:reason=>"because"};')
message = /Test does not apply to this configuration;/
guarded_by = /Guarded by {:?reason[:=][ >]"because"};/
expect(guard.message).to match(/#{message} #{guarded_by}/)
end
end
end