<testsuite name="rspec1" tests="609" skipped="0" failures="77" errors="0" time="1747.036958" timestamp="2025-01-31T13:29:23+00:00" hostname="fv-az1719-503">
<properties>
<property name="seed" value="10207"/>
</properties>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items returns correct length from body" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.005856"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items #last gets the last item in page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000870"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items provides [] accessor method" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001499"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items is iterable" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000831"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items is Enumerable" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001131"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items #first gets the first item in page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000855"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items #each yields each item" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001136"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items #each returns an enumerator" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000857"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items with coercion returns coerced objects" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000875"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response has next page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001574"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response supports pagination" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000895"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response is not the last page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000986"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page returns another HttpPaginatedResponse" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001262"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page is the last page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001169"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page retrieves the next page of results" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001136"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page does not have a next page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001179"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page returns nil when trying to access the last page when it is the last page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001174"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page and then first page returns a HttpPaginatedResponse" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001311"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with paged http response accessing next page and then first page retrieves the first page of results" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001349"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with non paged http response does not have next page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.006719"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with non paged http response does not support pagination" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000795"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with non paged http response is the last page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000902"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with non paged http response returns nil when accessing next page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000837"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 with non paged http response returns nil when accessing first page" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000856"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 paged transformations with option async_blocking_operations: true #next returns a SafeDeferrable that catches exceptions in callbacks and logs them" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.011852"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 paged transformations with option async_blocking_operations: true #next allows a success callback block to be added" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.002010"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 paged transformations with option async_blocking_operations: true #first calls the errback callback when first page headers are missing" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.002209"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 paged transformations with each block calls the block for each result on second page after retrieving the results" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000977"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 paged transformations with each block calls the block for each result after retrieving the results" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000847"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata failed response #status_code reflects status code" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000862"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata failed response #error_code to be populated" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000827"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata failed response #headers to be present" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.001010"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata failed response #success? is false" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000818"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata failed response #error_message to be populated" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000734"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata successful response #status_code reflects status code" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000797"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata successful response #error_code to be empty" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000799"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata successful response #success? is true" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000826"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata successful response #headers to be a hash" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000793"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 response metadata successful response #error_message to be empty" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000884"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items Array conversion and nil handling #HP3 with nil response is an array" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000846"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items Array conversion and nil handling #HP3 with empty response is an array" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000709"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items Array conversion and nil handling #HP3 with Json Object is an array" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.http_paginated_result_spec" name="Ably::Models::HttpPaginatedResponse: #HP1 -&gt; #HP8 #items Array conversion and nil handling #HP3 with Json Array is an array" file="./spec/unit/models/http_paginated_result_spec.rb" time="0.000840"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#shallow_clone with inherited attributes from ProtocolMessage creates a duplicate of the message without any ProtocolMessage dependency" file="./spec/unit/models/presence_message_spec.rb" time="0.001740"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#shallow_clone with new attributes passed in to the method creates a duplicate of the message without any ProtocolMessage dependency" file="./spec/unit/models/presence_message_spec.rb" time="0.001484"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#shallow_clone with new attributes passed in to the method with an invalid ProtocolMessage (missing an ID) allows an ID to be passed in to the shallow clone that takes precedence" file="./spec/unit/models/presence_message_spec.rb" time="0.000885"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#shallow_clone with new attributes passed in to the method with mixing of cases resolves case issues and can use camelCase or snake_case" file="./spec/unit/models/presence_message_spec.rb" time="0.001468"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#shallow_clone with embedded attributes for all fields creates a duplicate of the message without any ProtocolMessage dependency" file="./spec/unit/models/presence_message_spec.rb" time="0.000993"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage with action enter provides action as an Enum" file="./spec/unit/models/presence_message_spec.rb" time="0.000672"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage with action absent provides action as an Enum" file="./spec/unit/models/presence_message_spec.rb" time="0.000651"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage from REST request with embedded fields with protocol message #id prefers embedded ID" file="./spec/unit/models/presence_message_spec.rb" time="0.000595"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage from REST request with embedded fields with protocol message #timestamp prefers embedded timestamp" file="./spec/unit/models/presence_message_spec.rb" time="0.000745"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage from REST request with embedded fields without protocol message #id uses embedded ID" file="./spec/unit/models/presence_message_spec.rb" time="0.000682"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage from REST request with embedded fields without protocol message #timestamp uses embedded timestamp" file="./spec/unit/models/presence_message_spec.rb" time="0.000688"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage Java naming converts the attribute to ruby symbol naming convention" file="./spec/unit/models/presence_message_spec.rb" time="0.000660"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage part of ProtocolMessage should not modify the data payload" file="./spec/unit/models/presence_message_spec.rb" time="0.003019"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage part of ProtocolMessage should generate a message ID from the index, serial and connection id" file="./spec/unit/models/presence_message_spec.rb" time="0.001028"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#to_json with invalid data raises an exception" file="./spec/unit/models/presence_message_spec.rb" time="0.001648"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#to_json with valid data converts the attribute back to Java mixedCase notation using string keys" file="./spec/unit/models/presence_message_spec.rb" time="0.000827"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#to_json with binary data encodes as Base64 so that it can be converted to UTF-8 automatically by JSON#dump" file="./spec/unit/models/presence_message_spec.rb" time="0.000804"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#to_json with binary data adds Base64 encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000748"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as SHIFT_JIS string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.001522"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as SHIFT_JIS string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000750"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as ASCII_8BIT string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000717"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as ASCII_8BIT string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000741"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as UTF_8 string remains as UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000724"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as UTF_8 string is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000680"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as Integer raises an argument error" file="./spec/unit/models/presence_message_spec.rb" time="0.000760"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :encoding as Nil is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000686"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as SHIFT_JIS string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000693"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as SHIFT_JIS string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000713"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as Integer raises an argument error" file="./spec/unit/models/presence_message_spec.rb" time="0.000623"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as UTF_8 string remains as UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000682"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as UTF_8 string is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000724"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as Nil is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000705"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as ASCII_8BIT string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000629"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :client_id as ASCII_8BIT string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000725"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as Nil is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000656"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as Integer raises an argument error" file="./spec/unit/models/presence_message_spec.rb" time="0.000688"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as SHIFT_JIS string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000687"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as SHIFT_JIS string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000692"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as ASCII_8BIT string is compatible with original encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000603"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as ASCII_8BIT string gets converted to UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000731"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as UTF_8 string remains as UTF-8" file="./spec/unit/models/presence_message_spec.rb" time="0.000681"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage initialized with :connection_id as UTF_8 string is permitted" file="./spec/unit/models/presence_message_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON without ProtocolMessage initializes with the JSON" file="./spec/unit/models/presence_message_spec.rb" time="0.000609"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON without ProtocolMessage raises an exception when accessing ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000613"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON without ProtocolMessage has no ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000596"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON without ProtocolMessage returns a PresenceMessage object" file="./spec/unit/models/presence_message_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON with ProtocolMessage provides access to ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON with ProtocolMessage initializes with the JSON" file="./spec/unit/models/presence_message_spec.rb" time="0.000723"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON with ProtocolMessage has a ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000620"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with JSON with ProtocolMessage returns a PresenceMessage object" file="./spec/unit/models/presence_message_spec.rb" time="0.000688"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage with ProtocolMessage has a ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000630"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage with ProtocolMessage initializes with the JSON" file="./spec/unit/models/presence_message_spec.rb" time="0.000680"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage with ProtocolMessage returns a PresenceMessage object" file="./spec/unit/models/presence_message_spec.rb" time="0.002227"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage with ProtocolMessage provides access to ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000829"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage without ProtocolMessage initializes with the JSON" file="./spec/unit/models/presence_message_spec.rb" time="0.000754"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage without ProtocolMessage returns a PresenceMessage object" file="./spec/unit/models/presence_message_spec.rb" time="0.000763"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage without ProtocolMessage raises an exception when accessing ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000799"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage PresenceMessage conversion method with another PresenceMessage without ProtocolMessage has no ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000624"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#timestamp retrieves attribute :timestamp as a Time object from ProtocolMessage" file="./spec/unit/models/presence_message_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with a Cipher encoding returns a presence message object with the residual incompatible transforms left in the encoding property" file="./spec/unit/models/presence_message_spec.rb" time="0.002034"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with a custom encoding returns a presence message object with the residual incompatible transforms left in the encoding property" file="./spec/unit/models/presence_message_spec.rb" time="0.000886"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with an encoding returns a presence message object" file="./spec/unit/models/presence_message_spec.rb" time="0.000978"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with no encoding returns a presence message object" file="./spec/unit/models/presence_message_spec.rb" time="0.000872"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with no encoding with a block does not call the block" file="./spec/unit/models/presence_message_spec.rb" time="0.000809"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with invalid Cipher encoding with a block calls the block with the exception" file="./spec/unit/models/presence_message_spec.rb" time="0.001031"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded (#TP4) with invalid Cipher encoding without a block raises an exception" file="./spec/unit/models/presence_message_spec.rb" time="0.001038"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#connection_id attribute when this model has a connectionId attribute with a protocol message with a different connectionId uses the model value" file="./spec/unit/models/presence_message_spec.rb" time="0.000705"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#connection_id attribute when this model has a connectionId attribute but no protocol message uses the model value" file="./spec/unit/models/presence_message_spec.rb" time="0.000667"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#connection_id attribute when this model has no connectionId attribute and no protocol message uses the model value" file="./spec/unit/models/presence_message_spec.rb" time="0.000653"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#connection_id attribute when this model has no connectionId attribute with a protocol message with a connectionId uses the model value" file="./spec/unit/models/presence_message_spec.rb" time="0.000757"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model #to_json returns a JSON string with Ably payload naming" file="./spec/unit/models/presence_message_spec.rb" time="0.002196"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #id retrieves attribute :id" file="./spec/unit/models/presence_message_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #client_id retrieves attribute :client_id" file="./spec/unit/models/presence_message_spec.rb" time="0.000639"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #encoding retrieves attribute :encoding" file="./spec/unit/models/presence_message_spec.rb" time="0.000730"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #[] provides accessor method to #attributes" file="./spec/unit/models/presence_message_spec.rb" time="0.000727"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #attributes provides access to #attributes" file="./spec/unit/models/presence_message_spec.rb" time="0.000776"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model attributes #data retrieves attribute :data" file="./spec/unit/models/presence_message_spec.rb" time="0.000706"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model #== is false when class type differs" file="./spec/unit/models/presence_message_spec.rb" time="0.000652"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model #== is false when attributes are not the same" file="./spec/unit/models/presence_message_spec.rb" time="0.000829"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model #== is true when attributes are the same" file="./spec/unit/models/presence_message_spec.rb" time="0.000838"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model #to_msgpack returns a msgpack object with Ably payload naming" file="./spec/unit/models/presence_message_spec.rb" time="0.000797"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model is immutable dups options" file="./spec/unit/models/presence_message_spec.rb" time="0.000755"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage behaves like a model is immutable prevents changes" file="./spec/unit/models/presence_message_spec.rb" time="0.000796"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#size String (#TO3l8a) should return 20 bytes" file="./spec/unit/models/presence_message_spec.rb" time="0.000697"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#size Object (#TO3l8b) should return 32 bytes" file="./spec/unit/models/presence_message_spec.rb" time="0.000690"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#size extras (#TO3l8d) should return 51 bytes" file="./spec/unit/models/presence_message_spec.rb" time="0.002279"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#size Array (#TO3l8b) should return 18 bytes" file="./spec/unit/models/presence_message_spec.rb" time="0.000818"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#size nil (#TO3l8e) should return 1 bytes" file="./spec/unit/models/presence_message_spec.rb" time="0.000761"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage without action raises an exception when accessed" file="./spec/unit/models/presence_message_spec.rb" time="0.000752"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#from_encoded_array (#TP4) with no encoding returns an Array of presence message objects" file="./spec/unit/models/presence_message_spec.rb" time="0.001229"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#member_key attribute is string in format connection_id:client_id" file="./spec/unit/models/presence_message_spec.rb" time="0.000670"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#member_key attribute with a single connection and different client_ids is unique" file="./spec/unit/models/presence_message_spec.rb" time="0.000777"></testcase>
<testcase classname="spec.unit.models.presence_message_spec" name="Ably::Models::PresenceMessage#member_key attribute with the same client id across multiple connections is unique" file="./spec/unit/models/presence_message_spec.rb" time="0.000763"></testcase>
<testcase classname="spec.unit.realtime.realtime_spec" name="Ably::Realtime constructor returns an Ably::Realtime::Client" file="./spec/unit/realtime/realtime_spec.rb" time="4.014445"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be48e50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be48748 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be483b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be481a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be48108 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be48040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4fe80 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be4fe08 @client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be48748 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be48748 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be483b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be481a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be48108 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be48040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4fe80 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be4fdb8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be48e50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be48748 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be483b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be481a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be48108 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be48040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4fe80 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be4fe08 @client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be48748 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be48748 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be483b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be48cc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be481a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be48108 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be48040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4fe80 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be4fdb8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be48e50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./lib/ably/realtime.rb:57:in `new&apos;
./lib/ably/realtime.rb:57:in `new&apos;
./spec/unit/realtime/realtime_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#on (#RTE3) with event specified catches exceptions in the provided block, logs the error and continues" file="./spec/unit/modules/event_emitter_spec.rb" time="0.001361"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#on (#RTE3) with event specified calls the block every time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000632"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#on (#RTE3) with no event specified calls the block every time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000499"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#on (#RTE3) with no event specified catches exceptions in the provided block, logs the error and continues" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000770"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with event specified does not remove other blocks after it is called" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000590"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with event specified calls the block the first time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000663"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with event specified catches exceptions in the provided block, logs the error and continues" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000830"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with no event specified catches exceptions in the provided block, logs the error and continues" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000816"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with no event specified calls the block the first time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000658"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#once (#RTE4) with no event specified does not remove other blocks after it is called" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000631"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with unsafe_once subscribers does not deregister them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000666"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with event specified in on handler without any event names deletes all matching callbacks" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000597"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with event specified in on handler without any event names deletes all callbacks if not block given" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000765"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with event specified in on handler with event names as arguments continues if the block does not exist" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with event specified in on handler with event names as arguments deletes all matching callbacks when a block is not provided" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000649"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with event specified in on handler with event names as arguments deletes matching callbacks when a block is provided" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000708"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off when on callback is configured for all events with event names as arguments does not remove the all events callback when the block does not match" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000701"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off when on callback is configured for all events with event names as arguments does not remove the all events callback when a block is not provided" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off when on callback is configured for all events with event names as arguments does not remove the all events callback when a block is provided" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000650"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off when on callback is configured for all events without any event names deletes all matching callbacks" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000671"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off when on callback is configured for all events without any event names deletes all callbacks if not block given" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000703"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#off with unsafe_on subscribers does not deregister them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000698"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_off with on subscribers does not deregister them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000620"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_off with unsafe_once subscribers deregister them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000680"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_off with once subscribers does not deregister them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000693"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_off with unsafe_on subscribers deregisters them" file="./spec/unit/modules/event_emitter_spec.rb" time="0.002825"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_on calls the block every time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000559"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_on does not catch exceptions in provided blocks" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000786"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out should emit an event for any number of subscribers" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000811"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out sends only messages to matching event names" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000800"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out #on subscribe to multiple events with the same block" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000773"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out event callback changes within the callback block when new event callbacks are added is unaffected and processes the prior event callbacks once (#RTE6b)" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000749"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out event callback changes within the callback block when new event callbacks are added adds them for the next emitted event (#RTE6b)" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000855"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out event callback changes within the callback block when callbacks are removed is unaffected and processes the prior event callbacks once (#RTE6b)" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000730"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out event callback changes within the callback block when callbacks are removed removes them for the next emitted event (#RTE6b)" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000795"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out without coercion only matches event names on type matches" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000678"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#emit event fan out with coercion calls the provided proc to coerce the event name" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000660"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_once calls the block the first time an event is emitted only" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000548"></testcase>
<testcase classname="spec.unit.modules.event_emitter_spec" name="Ably::Modules::EventEmitter#unsafe_once does not catch exceptions in provided blocks" file="./spec/unit/modules/event_emitter_spec.rb" time="0.000685"></testcase>
<testcase classname="spec.unit.realtime.websocket_transport_spec" name="Ably::Realtime::Connection::WebsocketTransport behaves like an incoming protocol message bus behaves like a protocol message bus __protocol_msgbus__ PubSub fail with unacceptable STATE event names" file="./spec/unit/realtime/websocket_transport_spec.rb" time="0.001101"></testcase>
<testcase classname="spec.unit.realtime.websocket_transport_spec" name="Ably::Realtime::Connection::WebsocketTransport behaves like an incoming protocol message bus behaves like a protocol message bus __protocol_msgbus__ PubSub supports valid ProtocolMessage messages" file="./spec/unit/realtime/websocket_transport_spec.rb" time="0.002197"></testcase>
<testcase classname="spec.unit.realtime.websocket_transport_spec" name="Ably::Realtime::Connection::WebsocketTransport behaves like an outgoing protocol message bus behaves like a protocol message bus __protocol_msgbus__ PubSub fail with unacceptable STATE event names" file="./spec/unit/realtime/websocket_transport_spec.rb" time="0.000942"></testcase>
<testcase classname="spec.unit.realtime.websocket_transport_spec" name="Ably::Realtime::Connection::WebsocketTransport behaves like an outgoing protocol message bus behaves like a protocol message bus __protocol_msgbus__ PubSub supports valid ProtocolMessage messages" file="./spec/unit/realtime/websocket_transport_spec.rb" time="0.001060"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#connections should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000512"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#presence_subscribers should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000586"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#publishers should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000559"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#presence_members should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000502"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#presence_connections should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000563"></testcase>
<testcase classname="spec.unit.models.channel_metrics_spec" name="Ably::Models::ChannelMetrics#subscribers should return integer" file="./spec/unit/models/channel_metrics_spec.rb" time="0.000583"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC with invalid cipher data raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000911"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC 256 bit key without any configured encryption raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000649"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC 256 bit key with invalid channel_option cipher params raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000843"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with cipher payload strips the encoding" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001452"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with cipher payload decodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001055"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with another payload leaves the message data intact" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000556"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with another payload leaves the encoding intact" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000684"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with binary payload returns ASCII_8BIT encoded binary data" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000986"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with binary payload decodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000944"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with binary payload strips the encoding" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001026"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with cipher payload before other payloads strips the encoding" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001053"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with channel set up for AES-128-CBC valid cipher data message with cipher payload before other payloads decodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.003066"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with AES-256-CBC message with cipher payload strips the encoding" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001078"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#decode with AES-256-CBC message with cipher payload decodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001186"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC channel_option cipher params have missing key raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000748"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC channel_option cipher params have invalid key length raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000739"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC channel_option cipher params have invalid algorithm raise an exception" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000715"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with json payload encodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000975"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with json payload adds the encoding with utf-8" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000819"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with existing cipher encoding before leaves message intact as it is already encrypted" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000648"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with existing cipher encoding before leaves encoding intact" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000619"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with string payload encodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.001076"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with string payload adds the encoding with utf-8" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000844"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true with encryption set to to false leaves encoding intact" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000612"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true with encryption set to to false leaves message intact as encryption is not enable" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000687"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with binary payload adds the encoding without utf-8 prefixed" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000820"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with binary payload encodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000986"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with channel set up for AES-128-CBC with encrypted set to true message with binary payload returns ASCII_8BIT encoded binary data" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000837"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with AES-256-CBC message with cipher payload strips the encoding" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000819"></testcase>
<testcase classname="spec.unit.models.message_encoders.cipher_spec" name="Ably::Models::MessageEncoders::Cipher#encode with AES-256-CBC message with cipher payload decodes cipher" file="./spec/unit/models/message_encoders/cipher_spec.rb" time="0.000980"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#state and #state= setter accepts nil" file="./spec/unit/models/device_push_details_spec.rb" time="0.000605"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#state and #state= rejects non string or nil values" file="./spec/unit/models/device_push_details_spec.rb" time="0.000544"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#state and #state= setter accepts a string value and getter returns the new value" file="./spec/unit/models/device_push_details_spec.rb" time="0.000676"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#error_reason and #error_reason= setter accepts nil values" file="./spec/unit/models/device_push_details_spec.rb" time="0.000660"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#error_reason and #error_reason= setter accepts a Hash value and getter returns a ErrorInfo object" file="./spec/unit/models/device_push_details_spec.rb" time="0.000687"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#error_reason and #error_reason= setter accepts a ErrorInfo object and getter returns a ErrorInfo object" file="./spec/unit/models/device_push_details_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#error_reason and #error_reason= rejects non Hash, ErrorInfo or nil values" file="./spec/unit/models/device_push_details_spec.rb" time="0.000562"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#recipient and #recipient= setter accepts nil but always returns an empty hash" file="./spec/unit/models/device_push_details_spec.rb" time="0.000645"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#recipient and #recipient= setter accepts a Hash value and getter returns the new value" file="./spec/unit/models/device_push_details_spec.rb" time="0.000652"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails#recipient and #recipient= rejects non Hash or nil values" file="./spec/unit/models/device_push_details_spec.rb" time="0.000534"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails camelCase constructor attributes are rubyfied and exposed as underscore case" file="./spec/unit/models/device_push_details_spec.rb" time="0.000529"></testcase>
<testcase classname="spec.unit.models.device_push_details_spec" name="Ably::Models::DevicePushDetails camelCase constructor attributes are generated when the object is serialised to JSON" file="./spec/unit/models/device_push_details_spec.rb" time="0.000756"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel is constructed with a channel" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000855"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel exposes the channel as attribute #channel" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000685"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel is available in the #push attribute of the channel" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000636"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel raises an exception if constructed with an invalid type" file="./spec/unit/realtime/push_channel_spec.rb" time="0.001569"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel methods not implemented as push notifications #get_subscriptions raises an unsupported exception" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000839"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel methods not implemented as push notifications #unsubscribe_client_id raises an unsupported exception" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000775"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel methods not implemented as push notifications #subscribe_device raises an unsupported exception" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000780"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel methods not implemented as push notifications #unsubscribe_device raises an unsupported exception" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000734"></testcase>
<testcase classname="spec.unit.realtime.push_channel_spec" name="Ably::Realtime::Channel::PushChannel methods not implemented as push notifications #subscribe_client_id raises an unsupported exception" file="./spec/unit/realtime/push_channel_spec.rb" time="0.000621"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with base64 payload strips the encoding" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000561"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with base64 payload decodes base64" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000627"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with another payload leaves the message data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000566"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with another payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000531"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with base64 payload before other payloads strips the encoding" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000597"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#decode message with base64 payload before other payloads decodes base64" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000573"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with nil payload leaves the message data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000688"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with nil payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000561"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with binary payload adds the encoding" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000618"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with binary payload encodes binary data as base64" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000666"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport already encoded message with binary payload adds the encoding" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000655"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport already encoded message with binary payload encodes binary data as base64" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000576"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with UTF-8 payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000563"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over text transport message with UTF-8 payload leaves the data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with binary payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000601"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with binary payload leaves the message data intact as Base64 encoding is not necessary" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000616"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with empty binary string payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000476"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with empty binary string payload leaves the message data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000595"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport already encoded message with binary payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000592"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport already encoded message with binary payload leaves the message data intact as Base64 encoding is not necessary" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000519"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with UTF-8 payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000556"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with UTF-8 payload leaves the data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000565"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with nil payload leaves the message data intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000489"></testcase>
<testcase classname="spec.unit.models.message_encoders.base64_spec" name="Ably::Models::MessageEncoders::Base64#encode over binary transport message with nil payload leaves the encoding intact" file="./spec/unit/models/message_encoders/base64_spec.rb" time="0.000558"></testcase>
<testcase classname="spec.unit.rest.rest_spec" name="Ably::Rest constructor returns an Ably::Rest::Client" file="./spec/unit/rest/rest_spec.rb" time="0.000974"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model #== is false when attributes are not the same" file="./spec/unit/models/error_info_spec.rb" time="0.000610"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model #== is true when attributes are the same" file="./spec/unit/models/error_info_spec.rb" time="0.000588"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model #== is false when class type differs" file="./spec/unit/models/error_info_spec.rb" time="0.000476"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #request_id retrieves attribute :request_id" file="./spec/unit/models/error_info_spec.rb" time="0.000608"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #message retrieves attribute :message" file="./spec/unit/models/error_info_spec.rb" time="0.000574"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #href retrieves attribute :href" file="./spec/unit/models/error_info_spec.rb" time="0.000484"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #[] provides accessor method to #attributes" file="./spec/unit/models/error_info_spec.rb" time="0.000522"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #status_code retrieves attribute :status_code" file="./spec/unit/models/error_info_spec.rb" time="0.000595"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #code retrieves attribute :code" file="./spec/unit/models/error_info_spec.rb" time="0.000506"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #cause retrieves attribute :cause" file="./spec/unit/models/error_info_spec.rb" time="0.000483"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model attributes #attributes provides access to #attributes" file="./spec/unit/models/error_info_spec.rb" time="0.001886"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model is immutable prevents changes" file="./spec/unit/models/error_info_spec.rb" time="0.000738"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model is immutable dups options" file="./spec/unit/models/error_info_spec.rb" time="0.000635"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model #to_json returns a JSON string with Ably payload naming" file="./spec/unit/models/error_info_spec.rb" time="0.000535"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#TI1, #TI4 behaves like a model #to_msgpack returns a msgpack object with Ably payload naming" file="./spec/unit/models/error_info_spec.rb" time="0.000705"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo log entries container help link #TI5 with an error code and an href attribute includes the specified href in the stringified object" file="./spec/unit/models/error_info_spec.rb" time="0.000873"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo log entries container help link #TI5 with an error code and a message with the same error URL includes the specified error URL only once in the stringified object" file="./spec/unit/models/error_info_spec.rb" time="0.000569"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo log entries container help link #TI5 with a specified error code includes https://help.ably.io/error/[CODE] in the stringified object" file="./spec/unit/models/error_info_spec.rb" time="0.000765"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo log entries container help link #TI5 with an error code and a message with a different error URL includes the specified error URL from the message and the error code URL in the stringified object" file="./spec/unit/models/error_info_spec.rb" time="0.001412"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo log entries container help link #TI5 without an error code does not include the help URL" file="./spec/unit/models/error_info_spec.rb" time="0.000917"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#status #TI1, #TI2 is an alias for #status_code" file="./spec/unit/models/error_info_spec.rb" time="0.000779"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#request_id #RSC7c should return request ID" file="./spec/unit/models/error_info_spec.rb" time="0.000588"></testcase>
<testcase classname="spec.unit.models.error_info_spec" name="Ably::Models::ErrorInfo#cause #TI1 should return cause attribute" file="./spec/unit/models/error_info_spec.rb" time="0.000585"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with UTF-8 payload leaves the encoding intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000660"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with UTF-8 payload leaves the message data intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with Array payload encodes Array payload data as json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000520"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with Array payload adds the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000553"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with no data payload leaves the message data intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000601"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with no data payload leaves the encoding intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000533"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode already encoded message with hash payload adds the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000498"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode already encoded message with hash payload encodes hash payload data as json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000640"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with hash payload encodes hash payload data as json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000531"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with hash payload adds the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000589"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with hash payload and underscore case keys encodes hash payload data as json and leaves underscore case in tact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000576"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with hash payload and underscore case keys adds the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000658"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with nil payload leaves the encoding intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000526"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#encode message with nil payload leaves the message data intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000595"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload before other payloads decodes json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000604"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload before other payloads strips the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000566"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload in camelCase decodes json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000614"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload in camelCase strips the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000600"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload strips the encoding" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000515"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with json payload decodes json" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000628"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with another payload leaves the message data intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000592"></testcase>
<testcase classname="spec.unit.models.message_encoders.json_spec" name="Ably::Models::MessageEncoders::Json#decode message with another payload leaves the encoding intact" file="./spec/unit/models/message_encoders/json_spec.rb" time="0.000591"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails == is false when attributes are not the same" file="./spec/unit/models/connection_details_spec.rb" time="0.000909"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails == is true when attributes are the same" file="./spec/unit/models/connection_details_spec.rb" time="0.002118"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails == is false when class type differs" file="./spec/unit/models/connection_details_spec.rb" time="0.000813"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails attributes #connection_state_ttl (#CD2f) retrieves attribute :connection_state_ttl and converts it from ms to s" file="./spec/unit/models/connection_details_spec.rb" time="0.000755"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails attributes #max_idle_interval (#CD2h) retrieves attribute :max_idle_interval and converts it from ms to s" file="./spec/unit/models/connection_details_spec.rb" time="0.000632"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails ConnectionDetails conversion methods with a JSON object returns a new ConnectionDetails object from the JSON" file="./spec/unit/models/connection_details_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails ConnectionDetails conversion methods with a ConnectionDetails object returns the ConnectionDetails object" file="./spec/unit/models/connection_details_spec.rb" time="0.000749"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model #to_msgpack returns a msgpack object with Ably payload naming" file="./spec/unit/models/connection_details_spec.rb" time="0.000792"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #max_frame_size retrieves attribute :max_frame_size" file="./spec/unit/models/connection_details_spec.rb" time="0.000689"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #attributes provides access to #attributes" file="./spec/unit/models/connection_details_spec.rb" time="0.000710"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #[] provides accessor method to #attributes" file="./spec/unit/models/connection_details_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #max_inbound_rate retrieves attribute :max_inbound_rate" file="./spec/unit/models/connection_details_spec.rb" time="0.000756"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #max_message_size retrieves attribute :max_message_size" file="./spec/unit/models/connection_details_spec.rb" time="0.000709"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #client_id retrieves attribute :client_id" file="./spec/unit/models/connection_details_spec.rb" time="0.000733"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model attributes #connection_key retrieves attribute :connection_key" file="./spec/unit/models/connection_details_spec.rb" time="0.000721"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model is immutable dups options" file="./spec/unit/models/connection_details_spec.rb" time="0.000708"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model is immutable prevents changes" file="./spec/unit/models/connection_details_spec.rb" time="0.000795"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model #to_json returns a JSON string with Ably payload naming" file="./spec/unit/models/connection_details_spec.rb" time="0.000745"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model #== is true when attributes are the same" file="./spec/unit/models/connection_details_spec.rb" time="0.000987"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model #== is false when class type differs" file="./spec/unit/models/connection_details_spec.rb" time="0.000735"></testcase>
<testcase classname="spec.unit.models.connection_details_spec" name="Ably::Models::ConnectionDetails behaves like a model #== is false when attributes are not the same" file="./spec/unit/models/connection_details_spec.rb" time="0.000928"></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel msgbus fail with unacceptable STATE event names" file="./spec/unit/realtime/channel_spec.rb" time="4.066662"><failure message="expected KeyError, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:141:in `block (3 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:150:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:150:in `block (3 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected KeyError, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:141:in `block (3 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:150:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:150:in `block (3 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/unit/realtime/channel_spec.rb:150:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel msgbus supports messages" file="./spec/unit/realtime/channel_spec.rb" time="4.015508"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bde2290 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde1a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde17a0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde16d8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdea918 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdea5f8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdea3f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdea350 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdea238 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde5878 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bde5800 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bde5710 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bde5530 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bde5620 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bde55d0&gt;, @mon_data_owner_object_id=18340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bde53a0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdea1c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bde1a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde1a20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdea918 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdea5f8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdea3f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdea350 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdea238 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde5878 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bde5800 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bde5710 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bde5530 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bde5620 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bde55d0&gt;, @mon_data_owner_object_id=18340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bde53a0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde17a0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde16d8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdea170 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bcae978 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcae928 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcae8d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcae798 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcae860 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcae838&gt;, @mon_data_owner_object_id=23020&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcae608&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bde2290 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde1a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde17a0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde16d8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdea918 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdea5f8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdea3f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdea350 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdea238 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde5878 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bde5800 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bde5710 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bde5530 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bde5620 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bde55d0&gt;, @mon_data_owner_object_id=18340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bde53a0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdea1c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bde1a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde1a20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdea918 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdea5f8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdea3f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdea350 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdea238 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde5878 @client=#&lt;Ably::Rest::Client:0x00007efe9bde2038 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bde5800 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bde5710 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bde5530 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bde5620 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bde55d0&gt;, @mon_data_owner_object_id=18340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bde53a0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde17a0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde16d8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdea170 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bcae978 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde2290 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcae928 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcae8d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcae798 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcae860 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcae838&gt;, @mon_data_owner_object_id=23020&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcae608&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:141:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:145:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel callbacks fail with unacceptable STATE event names" file="./spec/unit/realtime/channel_spec.rb" time="4.025000"><failure message="expected KeyError, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:128:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:128:in `block (3 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected KeyError, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:128:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:128:in `block (3 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/unit/realtime/channel_spec.rb:128:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel callbacks are supported for valid STATE events" file="./spec/unit/realtime/channel_spec.rb" time="4.016447"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf375f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf36970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf36510 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf362e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3dbd0 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3d900 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3d7e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3d5b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3cff0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3a1d8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3a160 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf39e68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf39f80 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf39f08&gt;, @mon_data_owner_object_id=18700&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf39c60&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf3cd20 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf36970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf36970 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3dbd0 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3d900 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3d7e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3d5b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3cff0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3a1d8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3a160 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf39e68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf39f80 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf39f08&gt;, @mon_data_owner_object_id=18700&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf39c60&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf36510 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf362e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf3caf0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bcb0430 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcb03e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcb0390 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcb0228 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcb0318 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcb02f0&gt;, @mon_data_owner_object_id=23140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb0070&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf375f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf36970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf36510 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf362e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3dbd0 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3d900 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3d7e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3d5b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3cff0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3a1d8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3a160 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf39e68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf39f80 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf39f08&gt;, @mon_data_owner_object_id=18700&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf39c60&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf3cd20 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf36970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf36970 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3dbd0 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3d900 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3d7e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3d5b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3cff0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3a1d8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf37488 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3a160 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf39e68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf39f80 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf39f08&gt;, @mon_data_owner_object_id=18700&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf39c60&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf36510 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf362e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf3caf0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bcb0430 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf375f0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcb03e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcb0390 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcb0228 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcb0318 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcb02f0&gt;, @mon_data_owner_object_id=23140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb0070&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:123:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#publish name argument as Nil is permitted" file="./spec/unit/realtime/channel_spec.rb" time="4.016365"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be53b70 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be53990 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be53378 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be52fb8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be52ef0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be16e28 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be16978 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be16860 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be166d0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be165b8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be500b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be13f98 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be13e80 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be13c28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be13d18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be13cc8&gt;, @mon_data_owner_object_id=18880&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be13a48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be16540 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be53378 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be53378 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be16e28 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be16978 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be16860 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be166d0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be165b8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be500b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be13f98 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be13e80 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be13c28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be13d18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be13cc8&gt;, @mon_data_owner_object_id=18880&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be13a48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be52fb8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be52ef0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be164c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc77a18 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc779f0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc779a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc77860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc77928 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc77900&gt;, @mon_data_owner_object_id=23200&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc776d0&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be53b70 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be53990 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be53378 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be52fb8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be52ef0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be16e28 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be16978 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be16860 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be166d0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be165b8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be500b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be13f98 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be13e80 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be13c28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be13d18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be13cc8&gt;, @mon_data_owner_object_id=18880&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be13a48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be16540 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be53378 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be53378 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be16e28 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be16978 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be16860 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be166d0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be165b8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be500b0 @client=#&lt;Ably::Rest::Client:0x00007efe9be53990 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be13f98 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be13e80 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be13c28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be13d18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be13cc8&gt;, @mon_data_owner_object_id=18880&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be13a48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be52fb8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be52ef0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be164c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc77a18 @client=#&lt;Ably::Realtime::Client:0x00007efe9be53b70 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc779f0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc779a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc77860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc77928 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc77900&gt;, @mon_data_owner_object_id=23200&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc776d0&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:74:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#publish name argument as Integer raises an argument error" file="./spec/unit/realtime/channel_spec.rb" time="4.015287"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd67158 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd66a28 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd667a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd666e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd69958 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd69750 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd696b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd695e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd694d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd64430 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd643b8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd642c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd64110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd64200 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd641b0&gt;, @mon_data_owner_object_id=19060&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6bf28&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd69458 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd66a28 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd66a28 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd69958 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd69750 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd696b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd695e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd694d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd64430 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd643b8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd642c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd64110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd64200 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd641b0&gt;, @mon_data_owner_object_id=19060&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6bf28&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd667a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd666e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd69408 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc757b8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc75790 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc75740 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc75600 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc756c8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc756a0&gt;, @mon_data_owner_object_id=23260&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc75470&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd67158 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd66a28 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd667a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd666e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd69958 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd69750 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd696b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd695e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd694d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd64430 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd643b8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd642c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd64110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd64200 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd641b0&gt;, @mon_data_owner_object_id=19060&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6bf28&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd69458 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd66a28 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd66a28 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd69958 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd69750 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd696b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd695e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd694d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd64430 @client=#&lt;Ably::Rest::Client:0x00007efe9bd66fc8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd643b8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd642c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd64110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd64200 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd641b0&gt;, @mon_data_owner_object_id=19060&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6bf28&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd667a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd666e0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd69408 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc757b8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd67158 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc75790 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc75740 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc75600 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc756c8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc756a0&gt;, @mon_data_owner_object_id=23260&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc75470&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:74:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#publish name argument as UTF_8 string is permitted" file="./spec/unit/realtime/channel_spec.rb" time="4.016356"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc9d358 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc9d0b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc9cfe8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bca7b00 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bca7538 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bca7498 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bca73a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bca7100 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bca28a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bca2830 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bca25d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bca2290 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bca23d0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bca2380&gt;, @mon_data_owner_object_id=19240&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bca1f48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bca7010 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc9d358 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc9d358 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bca7b00 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bca7538 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bca7498 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bca73a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bca7100 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bca28a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bca2830 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bca25d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bca2290 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bca23d0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bca2380&gt;, @mon_data_owner_object_id=19240&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bca1f48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc9d0b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc9cfe8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bca6f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc7b690 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc7b668 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc7b618 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc7b4d8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc7b5a0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc7b578&gt;, @mon_data_owner_object_id=23320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc7b348&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc9d358 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc9d0b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc9cfe8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bca7b00 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bca7538 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bca7498 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bca73a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bca7100 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bca28a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bca2830 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bca25d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bca2290 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bca23d0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bca2380&gt;, @mon_data_owner_object_id=19240&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bca1f48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bca7010 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc9d358 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc9d358 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bca7b00 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bca7538 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bca7498 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bca73a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bca7100 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bca28a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc9d880 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bca2830 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bca25d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bca2290 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bca23d0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bca2380&gt;, @mon_data_owner_object_id=19240&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bca1f48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc9d0b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc9cfe8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bca6f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc7b690 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc9d9e8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc7b668 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc7b618 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc7b4d8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc7b5a0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc7b578&gt;, @mon_data_owner_object_id=23320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc7b348&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:74:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#publish name argument as SHIFT_JIS string is permitted" file="./spec/unit/realtime/channel_spec.rb" time="4.018624"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9c00c160 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9c012330 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9c016778 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9c014db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9c014950 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9c0387b0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9c03f358 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9c03efc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9c03ee80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9c03eb10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9c02b3d0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9c02ae80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9c02a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9c029508 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9c0297d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9c029738&gt;, @mon_data_owner_object_id=19420&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9c028130&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9c03e9a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9c016778 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9c016778 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9c0387b0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9c03f358 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9c03efc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9c03ee80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9c03eb10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9c02b3d0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9c02ae80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9c02a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9c029508 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9c0297d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9c029738&gt;, @mon_data_owner_object_id=19420&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9c028130&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9c014db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9c014950 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9c03e930 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc79160 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc79138 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc790e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc78fa8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc79070 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc79048&gt;, @mon_data_owner_object_id=23380&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc78e18&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9c00c160 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9c012330 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9c016778 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9c014db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9c014950 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9c0387b0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9c03f358 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9c03efc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9c03ee80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9c03eb10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9c02b3d0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9c02ae80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9c02a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9c029508 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9c0297d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9c029738&gt;, @mon_data_owner_object_id=19420&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9c028130&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9c03e9a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9c016778 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9c016778 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9c0387b0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9c03f358 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9c03efc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9c03ee80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9c03eb10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9c02b3d0 @client=#&lt;Ably::Rest::Client:0x00007efe9c012330 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9c02ae80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9c02a070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9c029508 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9c0297d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9c029738&gt;, @mon_data_owner_object_id=19420&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9c028130&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9c014db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9c014950 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9c03e930 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc79160 @client=#&lt;Ably::Realtime::Client:0x00007efe9c00c160 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc79138 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc790e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc78fa8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc79070 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc79048&gt;, @mon_data_owner_object_id=23380&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc78e18&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:74:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#publish name argument as ASCII_8BIT string is permitted" file="./spec/unit/realtime/channel_spec.rb" time="4.015175"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be68520 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be68390 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be6fd70 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be6faa0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be6f9b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71a58 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71850 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be717b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be716e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be715d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d200 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6ce40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6cfa8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6cf58&gt;, @mon_data_owner_object_id=19600&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6cc88&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be71558 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be6fd70 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be6fd70 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71a58 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71850 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be717b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be716e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be715d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d200 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6ce40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6cfa8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6cf58&gt;, @mon_data_owner_object_id=19600&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6cc88&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be6faa0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be6f9b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be713a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc7e7a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc7e778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc7e728 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc7e5e8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc7e6b0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc7e688&gt;, @mon_data_owner_object_id=23440&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc7e430&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be68520 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be68390 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be6fd70 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be6faa0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be6f9b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71a58 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71850 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be717b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be716e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be715d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d200 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6ce40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6cfa8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6cf58&gt;, @mon_data_owner_object_id=19600&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6cc88&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be71558 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be6fd70 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be6fd70 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71a58 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71850 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be717b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be716e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be715d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d200 @client=#&lt;Ably::Rest::Client:0x00007efe9be68390 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d070 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6ce40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6cfa8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6cf58&gt;, @mon_data_owner_object_id=19600&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6cc88&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be6faa0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be6f9b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be713a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc7e7a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be68520 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc7e778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc7e728 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc7e5e8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc7e6b0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc7e688&gt;, @mon_data_owner_object_id=23440&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc7e430&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:74:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as Nil raises an argument error" file="./spec/unit/realtime/channel_spec.rb" time="4.025375"><failure message="expected ArgumentError with message matching /must be a String/, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:64:in `block (5 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:64:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected ArgumentError with message matching /must be a String/, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:64:in `block (5 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:64:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/unit/realtime/channel_spec.rb:64:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as Integer raises an argument error" file="./spec/unit/realtime/channel_spec.rb" time="4.027778"><failure message="expected ArgumentError with message matching /must be a String/, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
  # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:56:in `block (5 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/channel_spec.rb:56:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected ArgumentError with message matching /must be a String/, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
    # ./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:56:in `block (5 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/channel_spec.rb:56:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/unit/realtime/channel_spec.rb:56:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as UTF_8 string is permitted" file="./spec/unit/realtime/channel_spec.rb" time="4.013431"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd6a718 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd6a470 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd6a3a8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd73408 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd731b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd73110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd73070 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd72f58 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd6e8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd6e840 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd6e750 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd6e570 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd6e688 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd6e638&gt;, @mon_data_owner_object_id=20140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6e3e0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd72ee0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd6a718 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd6a718 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd73408 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd731b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd73110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd73070 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd72f58 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd6e8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd6e840 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd6e750 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd6e570 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd6e688 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd6e638&gt;, @mon_data_owner_object_id=20140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6e3e0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd6a470 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd6a3a8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd72e90 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc87918 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc878a0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc87850 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc876e8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc877d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc877b0&gt;, @mon_data_owner_object_id=23620&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc87580&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd6a718 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd6a470 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd6a3a8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd73408 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd731b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd73110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd73070 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd72f58 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd6e8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd6e840 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd6e750 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd6e570 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd6e688 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd6e638&gt;, @mon_data_owner_object_id=20140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6e3e0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd72ee0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd6a718 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd6a718 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd73408 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd731b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd73110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd73070 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd72f58 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd6e8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9bd6acb8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd6e840 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd6e750 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd6e570 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd6e688 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd6e638&gt;, @mon_data_owner_object_id=20140&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd6e3e0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd6a470 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd6a3a8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd72e90 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc87918 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd6ae48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc878a0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc87850 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc876e8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc877d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc877b0&gt;, @mon_data_owner_object_id=23620&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc87580&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:20:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as UTF_8 string remains as UTF-8" file="./spec/unit/realtime/channel_spec.rb" time="4.016333"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc836b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc83070 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc82df0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc82d28 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc86400 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc86220 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc86180 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc860e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc85fc8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc80a78 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc80a00 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc808e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc80730 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc80820 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc807d0&gt;, @mon_data_owner_object_id=20320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc805a0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc85f50 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc83070 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc83070 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc86400 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc86220 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc86180 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc860e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc85fc8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc80a78 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc80a00 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc808e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc80730 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc80820 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc807d0&gt;, @mon_data_owner_object_id=20320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc805a0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc82df0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc82d28 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc85f00 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc8bea0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc8be50 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc8be00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc8bcc0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc8bd88 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc8bd60&gt;, @mon_data_owner_object_id=23680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc8bb58&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc836b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc83070 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc82df0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc82d28 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc86400 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc86220 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc86180 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc860e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc85fc8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc80a78 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc80a00 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc808e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc80730 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc80820 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc807d0&gt;, @mon_data_owner_object_id=20320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc805a0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc85f50 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc83070 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc83070 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc86400 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc86220 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc86180 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc860e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc85fc8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc80a78 @client=#&lt;Ably::Rest::Client:0x00007efe9bc83548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc80a00 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc808e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc80730 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc80820 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc807d0&gt;, @mon_data_owner_object_id=20320&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc805a0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bc82df0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bc82d28 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc85f00 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc8bea0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc836b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc8be50 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc8be00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc8bcc0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc8bd88 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc8bd60&gt;, @mon_data_owner_object_id=23680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc8bb58&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:24:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as ASCII_8BIT string gets converted to UTF-8" file="./spec/unit/realtime/channel_spec.rb" time="4.017220"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf796d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf791f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf78fa0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf87140 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf86ee8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf86d08 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf86970 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf86808 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf7cfd8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf7cda8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf7cb00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf7c718 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf7c920 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf7c880&gt;, @mon_data_owner_object_id=20500&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf7c3d0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf86790 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf796d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf796d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf87140 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf86ee8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf86d08 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf86970 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf86808 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf7cfd8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf7cda8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf7cb00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf7c718 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf7c920 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf7c880&gt;, @mon_data_owner_object_id=20500&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf7c3d0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf791f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf78fa0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf86740 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc88250 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc88228 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc881d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc53fa0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc88160 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc88110&gt;, @mon_data_owner_object_id=23740&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc53e38&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf796d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf791f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf78fa0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf87140 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf86ee8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf86d08 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf86970 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf86808 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf7cfd8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf7cda8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf7cb00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf7c718 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf7c920 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf7c880&gt;, @mon_data_owner_object_id=20500&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf7c3d0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf86790 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf796d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf796d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf87140 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf86ee8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf86d08 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf86970 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf86808 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf7cfd8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf7a508 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf7cda8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf7cb00 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf7c718 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf7c920 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf7c880&gt;, @mon_data_owner_object_id=20500&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf7c3d0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf791f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf78fa0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf86740 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc88250 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf7aa58 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc88228 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc881d8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc53fa0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc88160 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc88110&gt;, @mon_data_owner_object_id=23740&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc53e38&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:44:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as ASCII_8BIT string is compatible with original encoding" file="./spec/unit/realtime/channel_spec.rb" time="4.015227"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be60f00 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be67a80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be67760 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be67490 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be18728 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be18548 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be184a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be18408 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be182f0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be642b8 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be64240 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be64100 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be1be28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be64038 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be1bfb8&gt;, @mon_data_owner_object_id=20680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be1b798&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be18278 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be67a80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be67a80 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be18728 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be18548 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be184a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be18408 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be182f0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be642b8 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be64240 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be64100 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be1be28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be64038 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be1bfb8&gt;, @mon_data_owner_object_id=20680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be1b798&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be67760 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be67490 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be18228 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc50aa8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc50a80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc50a08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc508a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc50968 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc50940&gt;, @mon_data_owner_object_id=23800&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc50738&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be60f00 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be67a80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be67760 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be67490 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be18728 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be18548 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be184a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be18408 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be182f0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be642b8 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be64240 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be64100 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be1be28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be64038 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be1bfb8&gt;, @mon_data_owner_object_id=20680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be1b798&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be18278 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be67a80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be67a80 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be18728 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be18548 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be184a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be18408 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be182f0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be642b8 @client=#&lt;Ably::Rest::Client:0x00007efe9be60aa0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be64240 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be64100 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be1be28 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be64038 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be1bfb8&gt;, @mon_data_owner_object_id=20680&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be1b798&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be67760 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be67490 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be18228 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc50aa8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be60f00 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc50a80 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc50a08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc508a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc50968 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc50940&gt;, @mon_data_owner_object_id=23800&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc50738&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:48:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as SHIFT_JIS string is compatible with original encoding" file="./spec/unit/realtime/channel_spec.rb" time="4.014962"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd574d8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd56d08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd56178 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd560b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd5eb98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd5e9b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd5e918 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd5e878 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd5e760 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd5af70 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd5aef8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd5ae08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd5ab60 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd5ac50 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd5ac00&gt;, @mon_data_owner_object_id=20860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd5a980&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd5e6c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd56d08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd56d08 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd5eb98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd5e9b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd5e918 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd5e878 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd5e760 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd5af70 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd5aef8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd5ae08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd5ab60 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd5ac50 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd5ac00&gt;, @mon_data_owner_object_id=20860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd5a980&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd56178 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd560b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd5e670 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc55738 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc55710 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc556c0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc55580 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc55648 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc55620&gt;, @mon_data_owner_object_id=23860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc55418&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd574d8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd56d08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd56178 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd560b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd5eb98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd5e9b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd5e918 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd5e878 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd5e760 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd5af70 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd5aef8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd5ae08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd5ab60 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd5ac50 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd5ac00&gt;, @mon_data_owner_object_id=20860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd5a980&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd5e6c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd56d08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd56d08 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd5eb98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd5e9b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd5e918 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd5e878 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd5e760 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd5af70 @client=#&lt;Ably::Rest::Client:0x00007efe9bd57370 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd5aef8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd5ae08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd5ab60 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd5ac50 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd5ac00&gt;, @mon_data_owner_object_id=20860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd5a980&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd56178 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd560b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd5e670 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc55738 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd574d8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc55710 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc556c0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc55580 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc55648 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc55620&gt;, @mon_data_owner_object_id=23860&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc55418&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:36:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel#initializer as SHIFT_JIS string gets converted to UTF-8" file="./spec/unit/realtime/channel_spec.rb" time="4.016471"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bca1200 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bca0aa8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bca07d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bca0710 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc5e9c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc5e798 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc5e6a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc5e608 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc5e1a8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc59810 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc59798 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59680 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc594c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc595b8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc59568&gt;, @mon_data_owner_object_id=21040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc59338&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc5e108 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bca0aa8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bca0aa8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc5e9c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc5e798 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc5e6a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc5e608 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc5e1a8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc59810 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc59798 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59680 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc594c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc595b8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc59568&gt;, @mon_data_owner_object_id=21040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc59338&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bca07d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bca0710 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc5e0b8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5b6b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5b688 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5b638 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc5b4f8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5b5c0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5b598&gt;, @mon_data_owner_object_id=23920&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc5b340&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bca1200 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bca0aa8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bca07d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bca0710 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc5e9c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc5e798 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc5e6a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc5e608 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc5e1a8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc59810 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc59798 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59680 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc594c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc595b8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc59568&gt;, @mon_data_owner_object_id=21040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc59338&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc5e108 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bca0aa8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bca0aa8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc5e9c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc5e798 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc5e6a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc5e608 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc5e1a8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bc59810 @client=#&lt;Ably::Rest::Client:0x00007efe9bca1048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc59798 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59680 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc594c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc595b8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc59568&gt;, @mon_data_owner_object_id=21040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc59338&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bca07d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bca0710 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc5e0b8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5b6b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bca1200 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5b688 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5b638 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc5b4f8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5b5c0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5b598&gt;, @mon_data_owner_object_id=23920&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc5b340&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:32:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #subscribe with no event name specified subscribes the provided block to all events" file="./spec/unit/realtime/channel_spec.rb" time="4.019116"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf40150 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf46bb8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf46690 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf465c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf4d440 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf4cfe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf4cf18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf4ce78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf4cd38 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf49a48 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf499d0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf498b8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf49638 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf49750 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf49700&gt;, @mon_data_owner_object_id=21220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf494a8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf4cc20 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf46bb8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf46bb8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf4d440 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf4cfe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf4cf18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf4ce78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf4cd38 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf49a48 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf499d0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf498b8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf49638 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf49750 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf49700&gt;, @mon_data_owner_object_id=21220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf494a8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf46690 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf465c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf4cbd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc59310 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc592e8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59298 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc59158 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc59220 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc591f8&gt;, @mon_data_owner_object_id=23980&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc58ff0&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf40150 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf46bb8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf46690 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf465c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf4d440 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf4cfe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf4cf18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf4ce78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf4cd38 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf49a48 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf499d0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf498b8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf49638 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf49750 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf49700&gt;, @mon_data_owner_object_id=21220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf494a8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf4cc20 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf46bb8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf46bb8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf4d440 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf4cfe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf4cf18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf4ce78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf4cd38 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf49a48 @client=#&lt;Ably::Rest::Client:0x00007efe9bf47ef0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf499d0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf498b8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf49638 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf49750 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf49700&gt;, @mon_data_owner_object_id=21220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf494a8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf46690 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf465c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf4cbd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc59310 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf40150 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc592e8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc59298 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc59158 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc59220 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc591f8&gt;, @mon_data_owner_object_id=23980&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc58ff0&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:166:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #subscribe with a multiple event name arguments subscribes that block to all of those event names" file="./spec/unit/realtime/channel_spec.rb" time="4.014973"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bde0238 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde75b0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde70b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde6f20 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdef210 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdef030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdeef90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdeeef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdeed60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde4068 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdebf70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdebe58 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdebc50 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdebd68 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdebd18&gt;, @mon_data_owner_object_id=21400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdeba98&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdeece8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bde75b0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde75b0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdef210 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdef030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdeef90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdeeef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdeed60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde4068 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdebf70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdebe58 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdebc50 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdebd68 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdebd18&gt;, @mon_data_owner_object_id=21400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdeba98&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde70b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde6f20 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdeec70 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5f0a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5f080 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5f030 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc5eef0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5efb8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5ef90&gt;, @mon_data_owner_object_id=24040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc5ed60&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bde0238 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde75b0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde70b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde6f20 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdef210 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdef030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdeef90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdeeef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdeed60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde4068 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdebf70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdebe58 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdebc50 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdebd68 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdebd18&gt;, @mon_data_owner_object_id=21400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdeba98&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdeece8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bde75b0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bde75b0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdef210 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdef030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdeef90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdeeef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdeed60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bde4068 @client=#&lt;Ably::Rest::Client:0x00007efe9bde0030 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdebf70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdebe58 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdebc50 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdebd68 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdebd18&gt;, @mon_data_owner_object_id=21400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdeba98&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bde70b0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bde6f20 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdeec70 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5f0a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bde0238 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5f080 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5f030 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc5eef0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5efb8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5ef90&gt;, @mon_data_owner_object_id=24040&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc5ed60&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:166:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #subscribe without a block raises an invalid ArgumentError" file="./spec/unit/realtime/channel_spec.rb" time="4.015264"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd24290 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd2bc20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd2b978 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd2b8b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcead38 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bceab58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bceaa90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcea9c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcea888 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd29538 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd294c0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd293d0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd29218 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd29308 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd292b8&gt;, @mon_data_owner_object_id=21580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd29088&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bcea810 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd2bc20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd2bc20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcead38 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bceab58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bceaa90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcea9c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcea888 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd29538 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd294c0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd293d0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd29218 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd29308 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd292b8&gt;, @mon_data_owner_object_id=21580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd29088&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd2b978 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd2b8b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bcea7c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5c3d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5c358 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5c2e0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc63928 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5c218 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5c128&gt;, @mon_data_owner_object_id=24100&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc63720&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd24290 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd2bc20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd2b978 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd2b8b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcead38 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bceab58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bceaa90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcea9c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcea888 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd29538 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd294c0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd293d0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd29218 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd29308 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd292b8&gt;, @mon_data_owner_object_id=21580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd29088&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bcea810 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd2bc20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd2bc20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcead38 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bceab58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bceaa90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcea9c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcea888 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd29538 @client=#&lt;Ably::Rest::Client:0x00007efe9bd24128 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd294c0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd293d0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd29218 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd29308 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd292b8&gt;, @mon_data_owner_object_id=21580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd29088&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd2b978 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd2b8b0 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bcea7c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc5c3d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd24290 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc5c358 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc5c2e0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc63928 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc5c218 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc5c128&gt;, @mon_data_owner_object_id=24100&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc63720&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:166:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #subscribe with a single event name subscribes that block to matching events" file="./spec/unit/realtime/channel_spec.rb" time="4.017205"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9efb1640 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9efb0588 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9efb7130 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9efb6230 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9d8b04a0 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9d8b6620 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9d8b51d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9d8b4eb0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9d8bae28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9efd2430 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9efd2188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9efd13c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9efd01d0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9efd0c48 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9efd0a40&gt;, @mon_data_owner_object_id=21760&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9efd79f8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9d8ba950 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9efb0588 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9efb0588 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9d8b04a0 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9d8b6620 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9d8b51d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9d8b4eb0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9d8bae28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9efd2430 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9efd2188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9efd13c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9efd01d0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9efd0c48 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9efd0a40&gt;, @mon_data_owner_object_id=21760&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9efd79f8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9efb7130 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9efb6230 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9d8ba4f0 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc60f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc60f70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc60f20 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc60d68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc60ea8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc60e08&gt;, @mon_data_owner_object_id=24160&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc60c00&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9efb1640 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9efb0588 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9efb7130 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9efb6230 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9d8b04a0 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9d8b6620 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9d8b51d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9d8b4eb0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9d8bae28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9efd2430 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9efd2188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9efd13c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9efd01d0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9efd0c48 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9efd0a40&gt;, @mon_data_owner_object_id=21760&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9efd79f8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9d8ba950 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9efb0588 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9efb0588 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9d8b04a0 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9d8b6620 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9d8b51d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9d8b4eb0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9d8bae28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9efd2430 @client=#&lt;Ably::Rest::Client:0x00007efe9efb10c8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9efd2188 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9efd13c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9efd01d0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9efd0c48 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9efd0a40&gt;, @mon_data_owner_object_id=21760&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9efd79f8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9efb7130 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9efb6230 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9d8ba4f0 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc60f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9efb1640 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc60f70 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc60f20 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc60d68 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc60ea8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc60e08&gt;, @mon_data_owner_object_id=24160&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc60c00&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:166:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #subscribe with a multiple duplicate event name arguments subscribes that block to all of those unique event names once" file="./spec/unit/realtime/channel_spec.rb" time="4.015189"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be6a168 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be69ab0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be69790 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be696c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71af8 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71828 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be716c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be71580 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be711e8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d930 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d890 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d7a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6d5c0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6d6d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6d688&gt;, @mon_data_owner_object_id=21940&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6d408&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be710d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be69ab0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be69ab0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71af8 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71828 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be716c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be71580 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be711e8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d930 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d890 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d7a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6d5c0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6d6d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6d688&gt;, @mon_data_owner_object_id=21940&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6d408&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be69790 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be696c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be70f40 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc6ba88 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc6ba60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc6b9e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc6b308 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc6b6f0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc6b6a0&gt;, @mon_data_owner_object_id=24220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc6b128&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be6a168 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be69ab0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be69790 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be696c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71af8 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71828 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be716c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be71580 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be711e8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d930 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d890 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d7a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6d5c0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6d6d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6d688&gt;, @mon_data_owner_object_id=21940&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6d408&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be710d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be69ab0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be69ab0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be71af8 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be71828 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be716c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be71580 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be711e8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9be6d930 @client=#&lt;Ably::Rest::Client:0x00007efe9be69fd8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9be6d890 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9be6d7a0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9be6d5c0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9be6d6d8 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9be6d688&gt;, @mon_data_owner_object_id=21940&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9be6d408&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be69790 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be696c8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be70f40 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc6ba88 @client=#&lt;Ably::Realtime::Client:0x00007efe9be6a168 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc6ba60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc6b9e8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc6b308 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc6b6f0 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc6b6a0&gt;, @mon_data_owner_object_id=24220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc6b128&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:166:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #unsubscribe with no block argument unsubscribes all blocks for the event name argument" file="./spec/unit/realtime/channel_spec.rb" time="4.015102"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd74308 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd37a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd376d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd37610 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd39708 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd38bf0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd38b50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd38ab0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd38970 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd35180 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd350e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd34ff0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd34e38 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd34f28 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd34ed8&gt;, @mon_data_owner_object_id=22120&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd34ca8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd388f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd37a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd37a20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd39708 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd38bf0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd38b50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd38ab0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd38970 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd35180 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd350e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd34ff0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd34e38 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd34f28 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd34ed8&gt;, @mon_data_owner_object_id=22120&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd34ca8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd376d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd37610 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd38808 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc68a40 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc68a18 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc689c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc68860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc68928 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc68900&gt;, @mon_data_owner_object_id=24280&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc686a8&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd74308 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd37a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd376d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd37610 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd39708 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd38bf0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd38b50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd38ab0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd38970 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd35180 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd350e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd34ff0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd34e38 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd34f28 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd34ed8&gt;, @mon_data_owner_object_id=22120&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd34ca8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd388f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd37a20 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd37a20 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd39708 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd38bf0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd38b50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd38ab0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd38970 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd35180 @client=#&lt;Ably::Rest::Client:0x00007efe9bd74178 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd350e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd34ff0 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd34e38 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd34f28 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd34ed8&gt;, @mon_data_owner_object_id=22120&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd34ca8&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd376d8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd37610 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd38808 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc68a40 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd74308 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc68a18 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc689c8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc68860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc68928 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc68900&gt;, @mon_data_owner_object_id=24280&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc686a8&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:211:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #unsubscribe with a single event name argument unsubscribes the provided block with the matching event name" file="./spec/unit/realtime/channel_spec.rb" time="4.040700"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd326d8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd30ea0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd30b80 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd30ab8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd79e98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd79c68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd79b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd79ad8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd799c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bda0bb0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bda0b38 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bda0a48 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bda0890 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bda0980 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bda0930&gt;, @mon_data_owner_object_id=22300&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bda0700&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd79948 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd30ea0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd30ea0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd79e98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd79c68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd79b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd79ad8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd799c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bda0bb0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bda0b38 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bda0a48 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bda0890 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bda0980 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bda0930&gt;, @mon_data_owner_object_id=22300&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bda0700&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd30b80 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd30ab8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd798f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc6db30 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc6db08 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc6da90 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc6d860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc6da18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc6d9f0&gt;, @mon_data_owner_object_id=24340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc6d270&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd326d8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd30ea0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd30b80 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd30ab8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd79e98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd79c68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd79b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd79ad8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd799c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bda0bb0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bda0b38 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bda0a48 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bda0890 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bda0980 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bda0930&gt;, @mon_data_owner_object_id=22300&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bda0700&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd79948 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd30ea0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd30ea0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd79e98 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd79c68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd79b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd79ad8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd799c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bda0bb0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd32548 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bda0b38 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bda0a48 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bda0890 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bda0980 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bda0930&gt;, @mon_data_owner_object_id=22300&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bda0700&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bd30b80 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bd30ab8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd798f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc6db30 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd326d8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc6db08 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc6da90 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc6d860 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc6da18 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc6d9f0&gt;, @mon_data_owner_object_id=24340&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc6d270&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:211:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #unsubscribe with multiple event name arguments unsubscribes each of those matching event names with the provided block" file="./spec/unit/realtime/channel_spec.rb" time="4.028309"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf339f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf30e58 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf309f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf30818 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3e3c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3e080 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3df18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3de50 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3dce8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3b880 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3b7e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3b628 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf3b380 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf3b560 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf3b510&gt;, @mon_data_owner_object_id=22480&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf3af48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf3dc48 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf30e58 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf30e58 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3e3c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3e080 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3df18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3de50 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3dce8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3b880 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3b7e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3b628 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf3b380 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf3b560 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf3b510&gt;, @mon_data_owner_object_id=22480&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf3af48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf309f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf30818 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf3db80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4ec80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4ec58 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4ec08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4eac8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4eb90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4eb68&gt;, @mon_data_owner_object_id=24400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4e960&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf339f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf30e58 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf309f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf30818 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3e3c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3e080 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3df18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3de50 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3dce8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3b880 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3b7e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3b628 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf3b380 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf3b560 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf3b510&gt;, @mon_data_owner_object_id=22480&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf3af48&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf3dc48 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf30e58 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf30e58 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf3e3c8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf3e080 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf3df18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf3de50 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf3dce8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bf3b880 @client=#&lt;Ably::Rest::Client:0x00007efe9bf31e48 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bf3b7e0 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bf3b628 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bf3b380 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bf3b560 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bf3b510&gt;, @mon_data_owner_object_id=22480&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bf3af48&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bf309f8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bf30818 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf3db80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4ec80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf339f0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4ec58 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4ec08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4eac8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4eb90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4eb68&gt;, @mon_data_owner_object_id=24400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4e960&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:211:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #unsubscribe with no event name specified unsubscribes that block from all events" file="./spec/unit/realtime/channel_spec.rb" time="4.015188"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc7030 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bdc6db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bdc6ce8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdd3da8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdd3718 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdd3678 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdd35d8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdd34c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bdc9858 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdc96c8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdc8ae8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdc8368 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdc8778 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdc8660&gt;, @mon_data_owner_object_id=22660&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdc8160&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdd33f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bdc7030 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc7030 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdd3da8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdd3718 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdd3678 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdd35d8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdd34c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bdc9858 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdc96c8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdc8ae8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdc8368 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdc8778 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdc8660&gt;, @mon_data_owner_object_id=22660&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdc8160&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bdc6db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bdc6ce8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdd33a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4cc00 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4cbd8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4cb88 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4ca48 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4cb10 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4cae8&gt;, @mon_data_owner_object_id=24460&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4c8e0&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc7030 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bdc6db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bdc6ce8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdd3da8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdd3718 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdd3678 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdd35d8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdd34c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bdc9858 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdc96c8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdc8ae8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdc8368 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdc8778 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdc8660&gt;, @mon_data_owner_object_id=22660&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdc8160&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdd33f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bdc7030 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc7030 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdd3da8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdd3718 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdd3678 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdd35d8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdd34c0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bdc9858 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc7580 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bdc96c8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bdc8ae8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bdc8368 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bdc8778 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bdc8660&gt;, @mon_data_owner_object_id=22660&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bdc8160&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bdc6db0 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bdc6ce8 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdd33a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4cc00 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc76e8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4cbd8 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4cb88 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4ca48 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4cb10 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4cae8&gt;, @mon_data_owner_object_id=24460&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4c8e0&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:211:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.channel_spec" name="Ably::Realtime::Channel subscriptions #unsubscribe with a non-matching event name argument has no effect" file="./spec/unit/realtime/channel_spec.rb" time="4.016548"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bcb4ad0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bcb4850 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bcb4788 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcbf188 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bcbef58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bcbeeb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcbedf0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcbecd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bcba4d0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcba458 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcba368 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcba110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcba250 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcba1b0&gt;, @mon_data_owner_object_id=22840&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb9ee0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bcbec60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bcb4ad0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bcb4ad0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcbf188 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bcbef58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bcbeeb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcbedf0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcbecd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bcba4d0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcba458 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcba368 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcba110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcba250 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcba1b0&gt;, @mon_data_owner_object_id=22840&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb9ee0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bcb4850 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bcb4788 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bcbebe8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4ab80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4ab58 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4ab08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4a9c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4aa90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4aa68&gt;, @mon_data_owner_object_id=24520&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4a860&gt;&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bcb4ad0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bcb4850 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bcb4788 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcbf188 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bcbef58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bcbeeb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcbedf0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcbecd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bcba4d0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcba458 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcba368 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcba110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcba250 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcba1b0&gt;, @mon_data_owner_object_id=22840&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb9ee0&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bcbec60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bcb4ad0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;valid&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bcb4ad0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bcbf188 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bcbef58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bcbeeb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bcbedf0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bcbecd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bcba4d0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcb5048 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bcba458 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bcba368 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bcba110 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bcba250 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bcba1b0&gt;, @mon_data_owner_object_id=22840&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bcb9ee0&gt;&gt;&gt;, @options={:token=&gt;&quot;valid&quot;}, @token_params={}, @token_option=&quot;valid&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9bcb4850 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9bcb4788 @attributes={:token=&gt;&quot;valid&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bcbebe8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;, @logger=#&lt;Ably::Logger:0x00007efe9bc4ab80 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcb51b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bc4ab58 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bc4ab08 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bc4a9c8 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bc4aa90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bc4aa68&gt;, @mon_data_owner_object_id=24520&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bc4a860&gt;&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/channel_spec.rb:6:in `new&apos;
./spec/unit/realtime/channel_spec.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:10:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/channel_spec.rb:211:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result catches exceptions in the provided block and logs them to logger" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.311253"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result does not call the errback" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.302339"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result calls the provided block with result when provided" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.101947"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result returns a SafeDeferrable that calls the callback block" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.101823"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result does not block EventMachine" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.101940"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block returns result returns a SafeDeferrable that catches and logs exceptions in the provided callbacks" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.001643"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block raises an Exception calls the errback block of the SafeDeferrable" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.101979"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block raises an Exception does not call the callback block of the SafeDeferrable" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.201877"></testcase>
<testcase classname="spec.unit.modules.async_wrapper_spec" name="Ably::Modules::AsyncWrapper#async_wrap blocking block raises an Exception does not call the provided block" file="./spec/unit/modules/async_wrapper_spec.rb" time="0.201952"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #ttl with :ttl option as milliseconds in constructor retrieves attribute :ttl as seconds" file="./spec/unit/models/token_request_spec.rb" time="0.000773"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #ttl when converted to JSON is in milliseconds since epoch" file="./spec/unit/models/token_request_spec.rb" time="0.000754"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #capability retrieves attribute :capability as parsed JSON" file="./spec/unit/models/token_request_spec.rb" time="0.000682"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #timestamp when converted to JSON is in milliseconds since epoch" file="./spec/unit/models/token_request_spec.rb" time="0.000876"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #timestamp with :timestamp option as milliseconds in constructor retrieves attribute :timestamp as Time" file="./spec/unit/models/token_request_spec.rb" time="0.000579"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest attributes #timestamp with :timestamp option as Time in constructor retrieves attribute :timestamp as Time" file="./spec/unit/models/token_request_spec.rb" time="0.000805"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest == is true when attributes are the same" file="./spec/unit/models/token_request_spec.rb" time="0.000676"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest == is false when attributes are not the same" file="./spec/unit/models/token_request_spec.rb" time="0.000604"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest == is false when class type differs" file="./spec/unit/models/token_request_spec.rb" time="0.000646"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #attributes provides access to #attributes" file="./spec/unit/models/token_request_spec.rb" time="0.000648"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #client_id retrieves attribute :client_id" file="./spec/unit/models/token_request_spec.rb" time="0.000637"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #key_name retrieves attribute :key_name" file="./spec/unit/models/token_request_spec.rb" time="0.000530"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #nonce retrieves attribute :nonce" file="./spec/unit/models/token_request_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #mac retrieves attribute :mac" file="./spec/unit/models/token_request_spec.rb" time="0.000691"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model attributes #[] provides accessor method to #attributes" file="./spec/unit/models/token_request_spec.rb" time="0.000543"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model #to_json returns a JSON string with Ably payload naming" file="./spec/unit/models/token_request_spec.rb" time="0.000698"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model #to_msgpack returns a msgpack object with Ably payload naming" file="./spec/unit/models/token_request_spec.rb" time="0.000676"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model #== is false when class type differs" file="./spec/unit/models/token_request_spec.rb" time="0.000504"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model #== is false when attributes are not the same" file="./spec/unit/models/token_request_spec.rb" time="0.000699"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model #== is true when attributes are the same" file="./spec/unit/models/token_request_spec.rb" time="0.000705"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model is immutable prevents changes" file="./spec/unit/models/token_request_spec.rb" time="0.000563"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest behaves like a model is immutable dups options" file="./spec/unit/models/token_request_spec.rb" time="0.000510"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest from_json (#TE6) with JSON string returns a valid TokenRequest object" file="./spec/unit/models/token_request_spec.rb" time="0.000868"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest from_json (#TE6) with Ruby idiomatic Hash object returns a valid TokenRequest object" file="./spec/unit/models/token_request_spec.rb" time="0.000717"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest from_json (#TE6) with JSON-like object returns a valid TokenRequest object" file="./spec/unit/models/token_request_spec.rb" time="0.000747"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest TokenRequest conversion methods with a TokenRequest object returns the TokenRequest object" file="./spec/unit/models/token_request_spec.rb" time="0.000516"></testcase>
<testcase classname="spec.unit.models.token_request_spec" name="Ably::Models::TokenRequest TokenRequest conversion methods with a JSON object returns a new TokenRequest object from the JSON" file="./spec/unit/models/token_request_spec.rb" time="0.004069"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments custom TLS port when set without custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="4.014351"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=555, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be9d0e0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be9c820 @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be9c550 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be9c488 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be9c370 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bea3fd0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bea3f30 @client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be9d0e0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=555, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be9d0e0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be9c820 @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be9c550 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be9c488 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be9c370 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bea3fd0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bea3d78 @client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=555, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be9d0e0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be9c820 @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be9c550 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be9c488 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be9c370 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bea3fd0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bea3f30 @client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be9d0e0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=555, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be9d0e0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be9c820 @client=#&lt;Ably::Rest::Client:0x00007efe9be9d568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be9c550 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be9c488 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be9c370 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bea3fd0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bea3d78 @client=#&lt;Ably::Realtime::Client:0x00007efe9be9dcc0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:387:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set with custom fallback hosts configured sets the custom_host attribute" file="./spec/unit/realtime/client_spec.rb" time="36.968315"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd29e98 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd29948 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd29448 @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd28fe8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd28f20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd28e80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd28c78 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd28bd8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd29948 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd29948 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd29448 @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd28fe8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd28f20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd28e80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd28c78 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd28b60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd29e98 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd29948 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd29448 @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd28fe8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd28f20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd28e80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd28c78 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd28bd8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd29948 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd29948 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd29448 @client=#&lt;Ably::Rest::Client:0x00007efe9bd29d30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd28fe8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd28f20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd28e80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd28c78 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd28b60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd29e98 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:344:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set with custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="33.011848"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9e0700 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e7a00 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e7640 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e7460 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e73c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e71b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e70a0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e6f88 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9e7a00 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e7a00 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e7640 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e7460 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e73c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e71b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e70a0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e6f10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9e0700 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e7a00 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e7640 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e7460 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e73c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e71b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e70a0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e6f88 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9e7a00 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;nonprod:sandbox-a.foo.com&quot;, &quot;nonprod:sandbox-b.foo.com&quot;, &quot;nonprod:sandbox-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e7a00 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e7640 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e0430 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e7460 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e73c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e71b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e70a0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e6f10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e0700 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:348:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set with environment and without custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="33.149773"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8d31c8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8d2c00 @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8d2a20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8d2980 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8d28e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8d26b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8d25e8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8d31c8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8d31c8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8d2c00 @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8d2a20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8d2980 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8d28e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8d26b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8d24f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8d31c8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8d2c00 @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8d2a20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8d2980 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8d28e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8d26b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8d25e8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8d31c8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8d31c8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8d2c00 @client=#&lt;Ably::Rest::Client:0x00007efe9b8d3600 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8d2a20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8d2980 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8d28e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8d26b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8d24f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8d37e0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:334:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set with environment and without custom fallback hosts configured sets the custom_host attribute" file="./spec/unit/realtime/client_spec.rb" time="34.024209"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8306f8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b830590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8301d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ffe60 @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5ffc80 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5ffbe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5ffb40 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5ffa28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5ff9b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8301d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8301d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ffe60 @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5ffc80 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5ffbe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5ffb40 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5ffa28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5ff960 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8306f8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b830590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8301d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ffe60 @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5ffc80 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5ffbe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5ffb40 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5ffa28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5ff9b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8301d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8301d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ffe60 @client=#&lt;Ably::Rest::Client:0x00007efe9b830590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5ffc80 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5ffbe0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5ffb40 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5ffa28 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5ff960 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8306f8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:330:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set with environment and without custom fallback hosts configured sets the environment attribute" file="./spec/unit/realtime/client_spec.rb" time="33.351662"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b562930 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b562408 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b562098 @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b561eb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b561e18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b561d78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b561c60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b561be8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b562408 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b562408 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b562098 @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b561eb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b561e18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b561d78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b561c60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b561b98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b562930 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b562408 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b562098 @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b561eb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b561e18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b561d78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b561c60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b561be8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b562408 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foobar&quot;, @endpoint=&quot;foobar&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b562408 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b562098 @client=#&lt;Ably::Rest::Client:0x00007efe9b5627c8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b561eb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b561e18 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b561d78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b561c60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b561b98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b562930 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:326:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set without custom fallback hosts configured sets the custom_host attribute" file="./spec/unit/realtime/client_spec.rb" time="33.311400"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf734b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf72dd0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf72a38 @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf72650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf724e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf72268 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf71ef8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf71cf0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf72dd0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf72dd0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf72a38 @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf72650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf724e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf72268 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf71ef8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf71ca0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf734b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf72dd0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf72a38 @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf72650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf724e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf72268 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf71ef8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf71cf0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf72dd0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf72dd0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf72a38 @client=#&lt;Ably::Rest::Client:0x00007efe9bf73320 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf72650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf724e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf72268 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf71ef8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf71ca0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf734b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:312:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments rest_host when set without custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="33.801621"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd8cf48 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd8c868 @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd8c610 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd8c570 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd8c4a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd8c368 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd8c2f0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd8cf48 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd8cf48 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd8c868 @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd8c610 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd8c570 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd8c4a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd8c368 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd8c2a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd8cf48 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd8c868 @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd8c610 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd8c570 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd8c4a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd8c368 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd8c2f0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd8cf48 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;foo.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd8cf48 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd8c868 @client=#&lt;Ably::Rest::Client:0x00007efe9bd8d420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd8c610 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd8c570 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd8c4a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd8c368 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd8c2a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd8d5b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:316:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments tls defaults to TLS" file="./spec/unit/realtime/client_spec.rb" time="33.744346"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9dc2b8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e3ea0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e3cc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e3c20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e3b80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e3a68 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e3950 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9dc2b8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9dc2b8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e3ea0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e3cc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e3c20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e3b80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e3a68 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e3900 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9dc2b8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e3ea0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e3cc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e3c20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e3b80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e3a68 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e3950 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9dc2b8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9dc2b8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e3ea0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9dc8a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e3cc0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e3c20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e3b80 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e3a68 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e3900 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9dcb78 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:203:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments tls set to false uses plain text" file="./spec/unit/realtime/client_spec.rb" time="33.298626"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8f36d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8f3338 @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8f30b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8f3018 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8f2f78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8f2e60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8f2de8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8f36d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8f36d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8f3338 @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8f30b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8f3018 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8f2f78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8f2e60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8f2d98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8f36d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8f3338 @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8f30b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8f3018 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8f2f78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8f2e60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8f2de8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8f36d0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8f36d0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8f3338 @client=#&lt;Ably::Rest::Client:0x00007efe9b8f3bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8f30b8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8f3018 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8f2f78 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8f2e60 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8f2d98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8f3e28 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:203:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments tls set to false uses HTTP" file="./spec/unit/realtime/client_spec.rb" time="32.440917"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b822a08 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8223a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b822058 @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b821e78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b821dd8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b821d38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b821c20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b821ba8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8223a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8223a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b822058 @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b821e78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b821dd8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b821d38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b821c20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b821b58 @client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b822a08 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8223a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b822058 @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b821e78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b821dd8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b821d38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b821c20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b821ba8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8223a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8223a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b822058 @client=#&lt;Ably::Rest::Client:0x00007efe9b8228a0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b821e78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b821dd8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b821d38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b821c20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b821b58 @client=#&lt;Ably::Realtime::Client:0x00007efe9b822a08 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:203:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with token_params configures default_token_params" file="./spec/unit/realtime/client_spec.rb" time="32.928350"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b565e50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b565810 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={:ttl=&gt;777, :client_id=&gt;&quot;john&quot;}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b565590 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b5654c8 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b568a88 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5688a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b568808 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b568768 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b568650 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b56b2b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b56b238 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b56b148 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b56af90 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b56b080 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b56b030&gt;, @mon_data_owner_object_id=27960&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b56ae00&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5685d8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b565810 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b565810 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b568a88 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5688a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b568808 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b568768 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b568650 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b56b2b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b56b238 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b56b148 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b56af90 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b56b080 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b56b030&gt;, @mon_data_owner_object_id=27960&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b56ae00&gt;&gt;&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={:ttl=&gt;777, :client_id=&gt;&quot;john&quot;}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b565590 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b5654c8 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b568588 @client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b565e50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b565810 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={:ttl=&gt;777, :client_id=&gt;&quot;john&quot;}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b565590 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b5654c8 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b568a88 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5688a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b568808 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b568768 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b568650 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b56b2b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b56b238 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b56b148 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b56af90 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b56b080 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b56b030&gt;, @mon_data_owner_object_id=27960&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b56ae00&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5685d8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b565810 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b565810 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b568a88 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5688a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b568808 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b568768 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b568650 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b56b2b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b565ce8 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b56b238 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b56b148 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b56af90 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b56b080 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b56b030&gt;, @mon_data_owner_object_id=27960&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b56ae00&gt;&gt;&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={:ttl=&gt;777, :client_id=&gt;&quot;john&quot;}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b565590 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b5654c8 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b568588 @client=#&lt;Ably::Realtime::Client:0x00007efe9b565e50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:144:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri defaults to production" file="./spec/unit/realtime/client_spec.rb" time="34.011755"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf1fe50 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf1f590 @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf1f2c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf1f1a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf1f040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf1eed8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf1ee60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf1fe50 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf1fe50 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf1f590 @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf1f2c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf1f1a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf1f040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf1eed8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf1ee10 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf1fe50 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf1f590 @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf1f2c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf1f1a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf1f040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf1eed8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf1ee60 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf1fe50 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf1fe50 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf1f590 @client=#&lt;Ably::Rest::Client:0x00007efe9bf188f8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf1f2c0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf1f1a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf1f040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf1eed8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf1ee10 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf18ce0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:151:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri with port option and non-TLS connections uses the custom port for non-TLS requests" file="./spec/unit/realtime/client_spec.rb" time="33.939273"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd441a8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=999, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd4b7a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd4b2a0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd4b048 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd4afa8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd4af08 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd4adf0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd4ad78 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd4b7a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=999, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd4b7a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd4b2a0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd4b048 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd4afa8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd4af08 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd4adf0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd4ad28 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd441a8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=999, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd4b7a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd4b2a0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd4b048 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd4afa8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd4af08 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd4adf0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd4ad78 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd4b7a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @tls=false, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=999, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd4b7a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd4b2a0 @client=#&lt;Ably::Rest::Client:0x00007efe9bd4bf48 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd4b048 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd4afa8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd4af08 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd4adf0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd4ad28 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd441a8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:151:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri with environment option uses an alternate uri" file="./spec/unit/realtime/client_spec.rb" time="33.168387"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;sandbox&quot;, @endpoint=&quot;sandbox&quot;, @fallback_hosts=[&quot;sandbox..a.fallback.ably-realtime.com&quot;, &quot;sandbox..b.fallback.ably-realtime.com&quot;, &quot;sandbox..c.fallback.ably-realtime.com&quot;, &quot;sandbox..d.fallback.ably-realtime.com&quot;, &quot;sandbox..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e19c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e11f0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e0c50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e0b10 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e0840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e06b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e0548 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9e19c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;sandbox&quot;, @endpoint=&quot;sandbox&quot;, @fallback_hosts=[&quot;sandbox..a.fallback.ably-realtime.com&quot;, &quot;sandbox..b.fallback.ably-realtime.com&quot;, &quot;sandbox..c.fallback.ably-realtime.com&quot;, &quot;sandbox..d.fallback.ably-realtime.com&quot;, &quot;sandbox..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e19c0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e11f0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e0c50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e0b10 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e0840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e06b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e04f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;sandbox&quot;, @endpoint=&quot;sandbox&quot;, @fallback_hosts=[&quot;sandbox..a.fallback.ably-realtime.com&quot;, &quot;sandbox..b.fallback.ably-realtime.com&quot;, &quot;sandbox..c.fallback.ably-realtime.com&quot;, &quot;sandbox..d.fallback.ably-realtime.com&quot;, &quot;sandbox..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e19c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e11f0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e0c50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e0b10 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e0840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e06b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b9e0548 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9e19c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;sandbox&quot;, @endpoint=&quot;sandbox&quot;, @fallback_hosts=[&quot;sandbox..a.fallback.ably-realtime.com&quot;, &quot;sandbox..b.fallback.ably-realtime.com&quot;, &quot;sandbox..c.fallback.ably-realtime.com&quot;, &quot;sandbox..d.fallback.ably-realtime.com&quot;, &quot;sandbox..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9e19c0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9e11f0 @client=#&lt;Ably::Rest::Client:0x00007efe9b9e38d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9e0c50 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9e0b10 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b9e0840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b9e06b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b9e04f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b9e3c48 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:151:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri with rest_host option uses an alternate uri for REST clients" file="./spec/unit/realtime/client_spec.rb" time="32.833962"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8b7658 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;custom-rest.host.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8b6cf8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8b6870 @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8b64b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8b63e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8b61e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8b6078 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8b5fb0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8b6cf8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;custom-rest.host.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8b6cf8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8b6870 @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8b64b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8b63e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8b61e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8b6078 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8b5f60 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8b7658 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;custom-rest.host.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8b6cf8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8b6870 @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8b64b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8b63e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8b61e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8b6078 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8b5fb0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8b6cf8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=&quot;custom-rest.host.com&quot;, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8b6cf8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8b6870 @client=#&lt;Ably::Rest::Client:0x00007efe9b8b74f0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8b64b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8b63e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8b61e0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8b6078 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8b5f60 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8b7658 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:151:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri with tls_port option and a TLS connection uses the custom port for TLS requests" file="./spec/unit/realtime/client_spec.rb" time="33.160219"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=666, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5e7180 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5e6e38 @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5e6c58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5e6bb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5e6b18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5e6a00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5e6988 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5e7180 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=666, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5e7180 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5e6e38 @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5e6c58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5e6bb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5e6b18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5e6a00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5e6938 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=666, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5e7180 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5e6e38 @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5e6c58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5e6bb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5e6b18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5e6a00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5e6988 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5e7180 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=666, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5e7180 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5e6e38 @client=#&lt;Ably::Rest::Client:0x00007efe9b5e7568 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5e6c58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5e6bb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5e6b18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5e6a00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5e6938 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5e76d0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:151:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments uri with realtime_host option uses an alternate uri for Realtime clients" file="./spec/unit/realtime/client_spec.rb" time="0.001630"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with token sets the token" file="./spec/unit/realtime/client_spec.rb" time="34.177769"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b50a280 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b5098a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b509628 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4f2d88 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4f2ae0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4f2a40 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4f2928 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4f2810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b50d8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b50d778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b50d660 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b50d2a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b50d480 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b50d408&gt;, @mon_data_owner_object_id=28220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b50ce68&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b4f2798 @client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b50a280 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b50a280 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4f2d88 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4f2ae0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4f2a40 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4f2928 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4f2810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b50d8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b50d778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b50d660 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b50d2a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b50d480 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b50d408&gt;, @mon_data_owner_object_id=28220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b50ce68&gt;&gt;&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b5098a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b509628 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b4f2748 @client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b50a280 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b5098a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b509628 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4f2d88 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4f2ae0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4f2a40 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4f2928 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4f2810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b50d8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b50d778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b50d660 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b50d2a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b50d480 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b50d408&gt;, @mon_data_owner_object_id=28220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b50ce68&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b4f2798 @client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b50a280 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;token&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b50a280 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4f2d88 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4f2ae0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4f2a40 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4f2928 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4f2810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b50d8b8 @client=#&lt;Ably::Rest::Client:0x00007efe9b50b3b0 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b50d778 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b50d660 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b50d2a0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b50d480 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b50d408&gt;, @mon_data_owner_object_id=28220&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b50ce68&gt;&gt;&gt;, @options={:token=&gt;&quot;token&quot;}, @token_params={}, @token_option=&quot;token&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b5098a8 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b509628 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b4f2748 @client=#&lt;Ably::Realtime::Client:0x00007efe9b50b7e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:128:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with a string token key instead of options hash sets the token" file="./spec/unit/realtime/client_spec.rb" time="33.321724"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdfc460 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be030f8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @token_params={}, @token_option=&quot;app.kjhkasjhdsakdh127g7g1271&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be01618 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be014d8 @attributes={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bda3e00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bda3b30 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bda3a68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bda39c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bda3810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd9a1e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd9a170 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd9a058 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd99ea0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd99f90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd99f40&gt;, @mon_data_owner_object_id=28400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd99ce8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bda3770 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be030f8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be030f8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bda3e00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bda3b30 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bda3a68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bda39c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bda3810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd9a1e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd9a170 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd9a058 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd99ea0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd99f90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd99f40&gt;, @mon_data_owner_object_id=28400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd99ce8&gt;&gt;&gt;, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @token_params={}, @token_option=&quot;app.kjhkasjhdsakdh127g7g1271&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be01618 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be014d8 @attributes={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bda3720 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdfc460 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be030f8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @token_params={}, @token_option=&quot;app.kjhkasjhdsakdh127g7g1271&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be01618 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be014d8 @attributes={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bda3e00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bda3b30 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bda3a68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bda39c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bda3810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd9a1e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd9a170 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd9a058 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd99ea0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd99f90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd99f40&gt;, @mon_data_owner_object_id=28400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd99ce8&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bda3770 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be030f8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be030f8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bda3e00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bda3b30 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bda3a68 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bda39c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bda3810 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9bd9a1e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bdfc208 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9bd9a170 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9bd9a058 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9bd99ea0 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9bd99f90 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9bd99f40&gt;, @mon_data_owner_object_id=28400&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9bd99ce8&gt;&gt;&gt;, @options={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @token_params={}, @token_option=&quot;app.kjhkasjhdsakdh127g7g1271&quot;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9be01618 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9be014d8 @attributes={:token=&gt;&quot;app.kjhkasjhdsakdh127g7g1271&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bda3720 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdfc460 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:114:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments custom port when set without custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="33.015250"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=555, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc27928 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc272c0 @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc270e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc27040 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc26fa0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc26e10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc26d98 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc27928 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=555, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc27928 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc272c0 @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc270e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc27040 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc26fa0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc26e10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc26d48 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=555, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc27928 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc272c0 @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc270e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc27040 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc26fa0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc26e10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc26d98 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc27928 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=555, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc27928 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc272c0 @client=#&lt;Ably::Rest::Client:0x00007efe9bc27d60 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc270e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc27040 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc26fa0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc26e10 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc26d48 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc27ec8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:376:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with token_details sets the token" file="./spec/unit/realtime/client_spec.rb" time="33.651818"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b902298 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b902018 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9018e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;}, @token_params={}, @token_option=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9063c0 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b906168 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9060c8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b906028 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b905e98 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b900fd8 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b900f60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b900df8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b900c40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b900d30 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b900ce0&gt;, @mon_data_owner_object_id=28580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b900a38&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b905e20 @client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9018e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9018e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9063c0 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b906168 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9060c8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b906028 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b905e98 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b900fd8 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b900f60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b900df8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b900c40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b900d30 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b900ce0&gt;, @mon_data_owner_object_id=28580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b900a38&gt;&gt;&gt;, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;}, @token_params={}, @token_option=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b905dd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b902298 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b902018 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9018e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;}, @token_params={}, @token_option=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9063c0 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b906168 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9060c8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b906028 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b905e98 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b900fd8 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b900f60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b900df8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b900c40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b900d30 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b900ce0&gt;, @mon_data_owner_object_id=28580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b900a38&gt;&gt;&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b905e20 @client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b9018e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b9018e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9063c0 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b906168 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b9060c8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b906028 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b905e98 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;], @logger=#&lt;Ably::Logger:0x00007efe9b900fd8 @client=#&lt;Ably::Rest::Client:0x00007efe9b902018 ...&gt;, @custom_logger=nil, @logger=#&lt;Logger:0x00007efe9b900f60 @level=2, @progname=nil, @default_formatter=#&lt;Logger::Formatter:0x00007efe9b900df8 @datetime_format=nil&gt;, @formatter=#&lt;Proc:0x00007efe9b900c40 /home/runner/work/ably-ruby/ably-ruby/lib/ably/logger.rb:91 (lambda)&gt;, @logdev=#&lt;Logger::LogDevice:0x00007efe9b900d30 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#&lt;IO:&lt;STDOUT&gt;&gt;, @binmode=false, @reraise_write_errors=[], @mon_data=#&lt;Monitor:0x00007efe9b900ce0&gt;, @mon_data_owner_object_id=28580&gt;, @level_override={}&gt;, @log_level=2, @log_mutex=#&lt;Thread::Mutex:0x00007efe9b900a38&gt;&gt;&gt;, @options={:token_details=&gt;#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;}, @token_params={}, @token_option=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;, @key_name=nil, @key_secret=nil, @current_token_details=#&lt;Ably::Models::TokenDetails:0x00007efe9b8fc460 @hash_object=#&lt;Ably::Models::IdiomaticRubyWrapper:0x00007efe9b8fc398 @attributes={:token=&gt;&quot;token&quot;}, @stop_at={}&gt;&gt;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b905dd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b902298 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:136:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments logger with custom logger and log_level uses the custom logger" file="./spec/unit/realtime/client_spec.rb" time="34.033828"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5f8368 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b5f8430 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5ffb68 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ff078 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5fe650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5fe5b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5fe510 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5fe3f8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5fe380 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5ffb68 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b5f8430 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5ffb68 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ff078 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5fe650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5fe5b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5fe510 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5fe3f8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5fe308 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5f8368 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b5f8430 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5ffb68 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ff078 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5fe650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5fe5b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5fe510 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5fe3f8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5fe380 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5ffb68 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b5f8430 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5ffb68 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5ff078 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f8200 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5fe650 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5fe5b0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5fe510 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5fe3f8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5fe308 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f8368 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:225:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments logger with custom logger and log_level sets the custom log level" file="./spec/unit/realtime/client_spec.rb" time="34.034439"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b51a928 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b51a090 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b518d80 @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b518b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b518ad8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b518a38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b518920 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5188a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b51a090 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b51a928 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b51a090 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b518d80 @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b518b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b518ad8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b518a38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b518920 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b518858 @client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b51a928 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b51a090 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b518d80 @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b518b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b518ad8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b518a38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b518920 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5188a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b51a090 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=0, @custom_logger=#&lt;TestLogger:0x00007efe9b51a928 @messages=[]&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b51a090 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b518d80 @client=#&lt;Ably::Rest::Client:0x00007efe9b51a590 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b518b78 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b518ad8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b518a38 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b518920 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b518858 @client=#&lt;Ably::Realtime::Client:0x00007efe9b51a7e8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:225:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments logger with log_level :none silences all logging with a NilLogger" file="./spec/unit/realtime/client_spec.rb" time="36.493946"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be35dc8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be35940 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=:none, @custom_logger=#&lt;Ably::Models::NilLogger:0x00007efe9be34fb8&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be34b30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be3a6c0 @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be39888 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be397e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be39748 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be39518 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be391f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be34b30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=:none, @custom_logger=#&lt;Ably::Models::NilLogger:0x00007efe9be34fb8&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be34b30 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be3a6c0 @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be39888 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be397e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be39748 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be39518 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be38fa0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be35dc8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be35940 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=:none, @custom_logger=#&lt;Ably::Models::NilLogger:0x00007efe9be34fb8&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be34b30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be3a6c0 @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be39888 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be397e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be39748 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be39518 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be391f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be34b30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=:none, @custom_logger=#&lt;Ably::Models::NilLogger:0x00007efe9be34fb8&gt;, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be34b30 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be3a6c0 @client=#&lt;Ably::Rest::Client:0x00007efe9be35940 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be39888 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be397e8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be39748 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be39518 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be38fa0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be35dc8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:225:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments logger default uses Ruby Logger" file="./spec/unit/realtime/client_spec.rb" time="34.437632"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc7b410 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc7a6a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc79f98 @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc79d90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc79a98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc79840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc794d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc79458 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc7a6a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc7a6a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc79f98 @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc79d90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc79a98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc79840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc794d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc79408 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc7b410 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc7a6a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc79f98 @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc79d90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc79a98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc79840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc794d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc79458 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc7a6a0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc7a6a0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc79f98 @client=#&lt;Ably::Rest::Client:0x00007efe9bc7af88 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc79d90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc79a98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc79840 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc794d0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc79408 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc7b410 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:225:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments logger default specifies Logger::WARN log level" file="./spec/unit/realtime/client_spec.rb" time="33.615459"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b938af0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8fb920 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8fb538 @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8fb308 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8fb268 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8fb1c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8fb088 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8fb010 @client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8fb920 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8fb920 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8fb538 @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8fb308 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8fb268 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8fb1c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8fb088 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8fafc0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b938af0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8fb920 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8fb538 @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8fb308 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8fb268 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8fb1c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8fb088 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8fb010 @client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8fb920 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8fb920 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8fb538 @client=#&lt;Ably::Rest::Client:0x00007efe9b8fbf38 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8fb308 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8fb268 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8fb1c8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8fb088 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8fafc0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b938af0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:225:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with a string key instead of options hash sets the key_secret" file="./spec/unit/realtime/client_spec.rb" time="33.662611"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5f2558 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5f2210 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5f2030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5f1f90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5f1ef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5f1dd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5f1d60 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5f2558 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5f2558 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5f2210 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5f2030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5f1f90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5f1ef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5f1dd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5f1d10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5f2558 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5f2210 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5f2030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5f1f90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5f1ef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5f1dd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5f1d60 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5f2558 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5f2558 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5f2210 @client=#&lt;Ably::Rest::Client:0x00007efe9b5f2a30 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5f2030 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5f1f90 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5f1ef0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5f1dd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5f1d10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5f2c60 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:90:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with a string key instead of options hash uses basic auth" file="./spec/unit/realtime/client_spec.rb" time="33.335590"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b521318 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b521070 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b520b98 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5207b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5205d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b520530 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b520490 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b520378 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5200f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b520b98 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b520b98 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5207b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5205d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b520530 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b520490 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b520378 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5200a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b521318 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b521070 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b520b98 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5207b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5205d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b520530 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b520490 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b520378 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5200f8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b520b98 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b520b98 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5207b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b521070 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5205d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b520530 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b520490 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b520378 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5200a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b521318 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:90:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with a string key instead of options hash sets the key_name" file="./spec/unit/realtime/client_spec.rb" time="33.787478"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf4d558 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf4c540 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf535e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf53110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf53070 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf52e68 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf52af8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf529e0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf4c540 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf4c540 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf535e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf53110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf53070 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf52e68 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf52af8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf528a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf4d558 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf4c540 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf535e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf53110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf53070 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf52e68 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf52af8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf529e0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf4c540 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf4c540 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf535e8 @client=#&lt;Ably::Rest::Client:0x00007efe9bf4d030 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf53110 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf53070 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf52e68 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf52af8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf528a0 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf4d558 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:90:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments with a string key instead of options hash sets the key" file="./spec/unit/realtime/client_spec.rb" time="33.747686"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc3098 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdc2d00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdc29e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdc28a0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdc26e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdc2490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdc2328 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bdc3098 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc3098 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdc2d00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdc29e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdc28a0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdc26e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdc2490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdc2238 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc3098 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdc2d00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdc29e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdc28a0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdc26e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdc2490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bdc2328 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bdc3098 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;App.k3y:sec-r3t&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bdc3098 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bdc2d00 @client=#&lt;Ably::Rest::Client:0x00007efe9bdc38e0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bdc29e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bdc28a0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bdc26e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bdc2490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;App.k3y&quot;, @key_secret=&quot;sec-r3t&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bdc2238 @client=#&lt;Ably::Realtime::Client:0x00007efe9bdc3b10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:90:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set with fallback_hosts_use_default sets the environment attribute" file="./spec/unit/realtime/client_spec.rb" time="34.196747"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bcac240 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc73c88 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc738f0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc73710 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc73648 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc735a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc73490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc73418 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc73c88 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc73c88 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc738f0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc73710 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc73648 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc735a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc73490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc733c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bcac240 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc73c88 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc738f0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc73710 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc73648 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc735a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc73490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc73418 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc73c88 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc73c88 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc738f0 @client=#&lt;Ably::Rest::Client:0x00007efe9bcac0d8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc73710 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc73648 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc735a8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc73490 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc733c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bcac240 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:297:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set with fallback_hosts_use_default uses the production default fallback hosts (#RTN17b)" file="./spec/unit/realtime/client_spec.rb" time="34.335134"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b991df8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b991880 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9914e8 @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9912e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b991218 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b991150 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b991010 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b990f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b991880 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b991880 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9914e8 @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9912e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b991218 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b991150 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b991010 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b990f20 @client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b991df8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b991880 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9914e8 @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9912e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b991218 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b991150 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b991010 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b990f98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b991880 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;main.a.fallback.ably-realtime.com&quot;, &quot;main.b.fallback.ably-realtime.com&quot;, &quot;main.c.fallback.ably-realtime.com&quot;, &quot;main.d.fallback.ably-realtime.com&quot;, &quot;main.e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b991880 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b9914e8 @client=#&lt;Ably::Rest::Client:0x00007efe9b991c90 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b9912e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b991218 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b991150 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b991010 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b990f20 @client=#&lt;Ably::Realtime::Client:0x00007efe9b991df8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:301:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set without custom fallback hosts configured uses the default fallback hosts (#TBC, see https://github.com/ably/wiki/issues/361)" file="./spec/unit/realtime/client_spec.rb" time="33.545894"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8c5118 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8c4740 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8c4268 @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8c4088 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8cbfb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8cbf18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8cbe00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8cbd88 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8c4740 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8c4740 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8c4268 @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8c4088 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8cbfb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8cbf18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8cbe00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8cbd38 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b8c5118 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8c4740 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8c4268 @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8c4088 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8cbfb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8cbf18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8cbe00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b8cbd88 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b8c4740 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b8c4740 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b8c4268 @client=#&lt;Ably::Rest::Client:0x00007efe9b8c4ee8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b8c4088 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8cbfb8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b8cbf18 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b8cbe00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b8cbd38 @client=#&lt;Ably::Realtime::Client:0x00007efe9b8c5118 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:272:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set without custom fallback hosts configured sets the environment attribute" file="./spec/unit/realtime/client_spec.rb" time="33.188198"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5dfe30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5dfac0 @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5df8e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5df840 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5df7a0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5df688 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5df610 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5dfe30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5dfe30 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5dfac0 @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5df8e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5df840 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5df7a0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5df688 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5df5c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5dfe30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5dfac0 @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5df8e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5df840 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5df7a0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5df688 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5df610 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b5dfe30 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo..a.fallback.ably-realtime.com&quot;, &quot;foo..b.fallback.ably-realtime.com&quot;, &quot;foo..c.fallback.ably-realtime.com&quot;, &quot;foo..d.fallback.ably-realtime.com&quot;, &quot;foo..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b5dfe30 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5dfac0 @client=#&lt;Ably::Rest::Client:0x00007efe9b5d8338 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5df8e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b5df840 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5df7a0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b5df688 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5df5c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b5d84a0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:268:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set with custom fallback hosts configured sets the environment attribute" file="./spec/unit/realtime/client_spec.rb" time="33.661234"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b506f18 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b506a18 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5066d0 @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5064f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b506450 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5063b0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b506298 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b506220 @client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b506a18 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b506a18 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5066d0 @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5064f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b506450 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5063b0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b506298 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5061d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b506f18 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b506a18 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5066d0 @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5064f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b506450 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5063b0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b506298 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b506220 @client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b506a18 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b506a18 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5066d0 @client=#&lt;Ably::Rest::Client:0x00007efe9b506db0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b5064f0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b506450 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b5063b0 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b506298 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5061d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b506f18 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:282:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments environment when set with custom fallback hosts configured uses the custom provided fallback hosts (#RSC15a)" file="./spec/unit/realtime/client_spec.rb" time="34.247488"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be796e0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be78970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be78448 @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be78100 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be7fc20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be7f568 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be7dfd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be7dba0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be78970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be78970 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be78448 @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be78100 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be7fc20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be7f568 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be7dfd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be7d3d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be796e0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be78970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be78448 @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be78100 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be7fc20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be7f568 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be7dfd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be7dba0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be78970 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=&quot;foo&quot;, @endpoint=&quot;foo&quot;, @fallback_hosts=[&quot;foo-a.foo.com&quot;, &quot;foo-b.foo.com&quot;, &quot;foo-c.foo.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be78970 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be78448 @client=#&lt;Ably::Rest::Client:0x00007efe9be792a8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be78100 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be7fc20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be7f568 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be7dfd8 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be7d3d0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be796e0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:286:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments key only connects to the Ably service" file="./spec/unit/realtime/client_spec.rb" time="33.983754"><failure message="expected no Exception, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/client_spec.rb:7:in `new&apos;
  # ./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/shared/client_initializer_behaviour.rb:72:in `block (5 levels) in &lt;top (required)&gt;&apos;
  # ./spec/shared/client_initializer_behaviour.rb:72:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected no Exception, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/client_spec.rb:7:in `new&apos;
    # ./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/shared/client_initializer_behaviour.rb:72:in `block (5 levels) in &lt;top (required)&gt;&apos;
    # ./spec/shared/client_initializer_behaviour.rb:72:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/shared/client_initializer_behaviour.rb:72:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments key only uses basic auth" file="./spec/unit/realtime/client_spec.rb" time="36.035745"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b95ee80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b95e958 @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b95e728 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b95e688 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b95e5e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b95dc88 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b95dc10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b95ee80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b95ee80 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b95e958 @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b95e728 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b95e688 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b95e5e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b95dc88 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b95db98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b95ee80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b95e958 @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b95e728 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b95e688 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b95e5e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b95dc88 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b95dc10 @client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b95ee80 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b95ee80 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b95e958 @client=#&lt;Ably::Rest::Client:0x00007efe9b95f420 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b95e728 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b95e688 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b95e5e8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b95dc88 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b95db98 @client=#&lt;Ably::Realtime::Client:0x00007efe9b95f5b0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:76:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments key_name and key_secret constructs a key" file="./spec/unit/realtime/client_spec.rb" time="34.163340"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b885d60 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key_name=&gt;&quot;id&quot;, :key_secret=&gt;&quot;secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b885680 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;id&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b885478 @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b885298 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8851d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b885130 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b885018 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b884f78 @client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b885680 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key_name=&gt;&quot;id&quot;, :key_secret=&gt;&quot;secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b885680 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b885478 @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b885298 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8851d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b885130 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b885018 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;id&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b884f00 @client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b885d60 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key_name=&gt;&quot;id&quot;, :key_secret=&gt;&quot;secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b885680 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;id&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b885478 @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b885298 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8851d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b885130 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b885018 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b884f78 @client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b885680 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key_name=&gt;&quot;id&quot;, :key_secret=&gt;&quot;secret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b885680 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b885478 @client=#&lt;Ably::Rest::Client:0x00007efe9b885bf8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b885298 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b8851d0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b885130 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b885018 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;id&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b884f00 @client=#&lt;Ably::Realtime::Client:0x00007efe9b885d60 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:84:in `block (4 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments realtime_host when set without custom fallback hosts configured has no default fallback hosts" file="./spec/unit/realtime/client_spec.rb" time="0.001470"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with valid arguments realtime_host when set without custom fallback hosts configured sets the realtime_host option" file="./spec/unit/realtime/client_spec.rb" time="0.000731"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments key and key_secret raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000718"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments empty hash raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000505"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments key: &quot;invalid&quot; raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000699"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments key: &quot;invalid:asdad&quot; raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000611"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments nil raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000533"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer with invalid arguments key and key_name raises an exception" file="./spec/unit/realtime/client_spec.rb" time="0.000879"></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer delegators delegates :auth_options to .auth" file="./spec/unit/realtime/client_spec.rb" time="34.625022"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b4fff10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b4fe958 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4fd9e0 @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4fcd38 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4fcc98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4fcbf8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4fca90 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b4fc9c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b4fe958 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b4fe958 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4fd9e0 @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4fcd38 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4fcc98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4fcbf8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4fca90 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b4fc810 @client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b4fff10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b4fe958 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4fd9e0 @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4fcd38 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4fcc98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4fcbf8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4fca90 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b4fc9c8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b4fe958 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b4fe958 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b4fd9e0 @client=#&lt;Ably::Rest::Client:0x00007efe9b4ff858 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b4fcd38 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b4fcc98 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b4fcbf8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b4fca90 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b4fc810 @client=#&lt;Ably::Realtime::Client:0x00007efe9b4fff10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:395:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client behaves like a client initializer delegators delegates :client_id to .auth" file="./spec/unit/realtime/client_spec.rb" time="33.464797"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be4f0e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be4ed28 @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be4eb20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be4ea58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be4e9b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4e7b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be4e6c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be4f0e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be4f0e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be4ed28 @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be4eb20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be4ea58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be4e9b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4e7b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be4e670 @client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be4f0e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be4ed28 @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be4eb20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be4ea58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be4e9b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4e7b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9be4e6c0 @client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9be4f0e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;app.key:secret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9be4f0e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9be4ed28 @client=#&lt;Ably::Rest::Client:0x00007efe9be4f660 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9be4eb20 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9be4ea58 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9be4e9b8 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9be4e7b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;app.key&quot;, @key_secret=&quot;secret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9be4e670 @client=#&lt;Ably::Realtime::Client:0x00007efe9be4f8b8 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
Shared Example Group: &quot;a client initializer&quot; called from ./spec/unit/realtime/client_spec.rb:10
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/shared/client_initializer_behaviour.rb:395:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client delegation to the REST Client passes on the options to the initializer" file="./spec/unit/realtime/client_spec.rb" time="33.608747"><failure message="the Ably::Rest::Client class does not implement the instance method: environment" type="RSpec::Mocks::MockExpectationError">Failure/Error: rest_client = instance_double(&apos;Ably::Rest::Client&apos;, auth: instance_double(&apos;Ably::Auth&apos;), options: client_options, environment: &apos;production&apos;, use_tls?: true, custom_tls_port: nil)
  the Ably::Rest::Client class does not implement the instance method: environment
./spec/unit/realtime/client_spec.rb:16:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client delegation to the REST Client for attribute #environment" file="./spec/unit/realtime/client_spec.rb" time="34.070951"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc59b08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc596a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc59388 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc590e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc59040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc58f00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc58e88 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc59b08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc59b08 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc596a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc59388 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc590e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc59040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc58f00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc58e38 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc59b08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc596a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc59388 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc590e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc59040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc58f00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bc58e88 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bc59b08 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bc59b08 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bc596a8 @client=#&lt;Ably::Rest::Client:0x00007efe9bc5a210 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bc59388 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bc590e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bc59040 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bc58f00 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bc58e38 @client=#&lt;Ably::Realtime::Client:0x00007efe9bc5a3a0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:24:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client delegation to the REST Client for attribute #custom_host" file="./spec/unit/realtime/client_spec.rb" time="32.994568"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b96cd50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b96c6c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b96c2d8 @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b96c0a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b96c008 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b973f60 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b973e48 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b973dd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b96c6c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b96c6c0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b96c2d8 @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b96c0a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b96c008 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b973f60 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b973e48 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b973d80 @client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b96cd50 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b96c6c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b96c2d8 @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b96c0a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b96c008 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b973f60 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b973e48 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b973dd0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b96c6c0 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b96c6c0 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b96c2d8 @client=#&lt;Ably::Rest::Client:0x00007efe9b96cbc0 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b96c0a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b96c008 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b973f60 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b973e48 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b973d80 @client=#&lt;Ably::Realtime::Client:0x00007efe9b96cd50 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:24:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client delegation to the REST Client for attribute #log_level" file="./spec/unit/realtime/client_spec.rb" time="33.491356"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b88df10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b88d8a8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b88d560 @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b88d380 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b88d2e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b88d240 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b88d128 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b88d0b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b88d8a8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b88d8a8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b88d560 @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b88d380 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b88d2e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b88d240 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b88d128 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b88d060 @client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b88df10 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b88d8a8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b88d560 @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b88d380 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b88d2e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b88d240 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b88d128 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b88d0b0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b88d8a8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b88d8a8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b88d560 @client=#&lt;Ably::Rest::Client:0x00007efe9b88dda8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b88d380 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b88d2e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b88d240 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b88d128 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b88d060 @client=#&lt;Ably::Realtime::Client:0x00007efe9b88df10 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:24:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client delegation to the REST Client for attribute #use_tls?" file="./spec/unit/realtime/client_spec.rb" time="33.743157"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b592680 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b592518 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b591e60 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5919b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b591758 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b591618 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b591550 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b591370 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5912a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b591e60 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b591e60 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5919b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b591758 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b591618 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b591550 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b591370 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5911e0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9b592680 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9b592518 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b591e60 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5919b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b591758 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b591618 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b591550 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b591370 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=false, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9b5912a8 @client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9b591e60 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :auto_connect=&gt;false, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9b591e60 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9b5919b0 @client=#&lt;Ably::Rest::Client:0x00007efe9b592518 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9b591758 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9b591618 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9b591550 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9b591370 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9b5911e0 @client=#&lt;Ably::Realtime::Client:0x00007efe9b592680 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:24:in `block (5 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client when :transport_params option is passed converts options to strings" file="./spec/unit/realtime/client_spec.rb" time="32.595240"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf8f368 @transport_params={&quot;heartbeats&quot;=&gt;&quot;true&quot;, &quot;v&quot;=&gt;&quot;1.0&quot;, &quot;extra_param&quot;=&gt;&quot;extra_param&quot;}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf8e1e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf8da18 @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf8d248 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf8d130 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf8d068 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf8cd20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf8cca8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf8e1e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf8e1e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf8da18 @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf8d248 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf8d130 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf8d068 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf8cd20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf8cc58 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bf8f368 @transport_params={&quot;heartbeats&quot;=&gt;&quot;true&quot;, &quot;v&quot;=&gt;&quot;1.0&quot;, &quot;extra_param&quot;=&gt;&quot;extra_param&quot;}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf8e1e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf8da18 @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf8d248 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf8d130 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf8d068 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf8cd20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bf8cca8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bf8e1e8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bf8e1e8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bf8da18 @client=#&lt;Ably::Rest::Client:0x00007efe9bf8eaa8 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bf8d248 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bf8d130 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bf8d068 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bf8cd20 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bf8cc58 @client=#&lt;Ably::Realtime::Client:0x00007efe9bf8f368 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:40:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client push #push returns a Push object" file="./spec/unit/realtime/client_spec.rb" time="32.736777"><failure message="undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd836f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd82fe8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd82c78 @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd829a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd828e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd82818 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd826b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd82638 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd82fe8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd82fe8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd82c78 @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd829a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd828e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd82818 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd826b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd825e8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^" type="NameError">Failure/Error: &quot;#{endpoint}.realtime.#{root_domain}&quot;

NameError:
  undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe9bd836f0 @transport_params={}, @rest_client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd82fe8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd82c78 @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd829a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd828e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd82818 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd826b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @echo_messages=true, @queue_messages=true, @custom_realtime_host=nil, @auto_connect=true, @recover=&quot;&quot;, @auth=#&lt;Ably::Realtime::Auth:0x00007efe9bd82638 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @auth_sync=#&lt;Ably::Auth:0x00007efe9bd82fe8 @client_id=nil, @client_id_validated=nil, @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 @agent=&quot;ably-ruby/1.2.7 ruby/3.1.6&quot;, @realtime_client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @tls=true, @protocol=:msgpack, @debug_http=nil, @log_level=2, @custom_logger=nil, @custom_host=nil, @custom_port=nil, @custom_tls_port=nil, @add_request_ids=nil, @log_retries_as_info=nil, @max_message_size=65536, @max_frame_size=524288, @idempotent_rest_publishing=true, @environment=nil, @endpoint=&quot;main&quot;, @fallback_hosts=[&quot;main..a.fallback.ably-realtime.com&quot;, &quot;main..b.fallback.ably-realtime.com&quot;, &quot;main..c.fallback.ably-realtime.com&quot;, &quot;main..d.fallback.ably-realtime.com&quot;, &quot;main..e.fallback.ably-realtime.com&quot;], @http_defaults={:open_timeout=&gt;4, :request_timeout=&gt;10, :max_retry_duration=&gt;15, :max_retry_count=&gt;3}, @options={:key=&gt;&quot;appid.keyuid:keysecret&quot;, :fallback_retry_timeout=&gt;600}, @auth=#&lt;Ably::Auth:0x00007efe9bd82fe8 ...&gt;, @channels=#&lt;Ably::Rest::Channels:0x00007efe9bd82c78 @client=#&lt;Ably::Rest::Client:0x00007efe9bd83560 ...&gt;, @channel_klass=Ably::Rest::Channel, @channels={}&gt;, @encoders=[#&lt;Ably::Models::MessageEncoders::Utf8:0x00007efe9bd829a8 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Json:0x00007efe9bd828e0 @client=Ably::Models::MessageEncoders, @options={}&gt;, #&lt;Ably::Models::MessageEncoders::Cipher:0x00007efe9bd82818 @client=Ably::Models::MessageEncoders, @options={}, @cryptos={}&gt;, #&lt;Ably::Models::MessageEncoders::Base64:0x00007efe9bd826b0 @client=Ably::Models::MessageEncoders, @options={:binary_protocol=&gt;true}&gt;]&gt;, @options={}, @token_params={}, @token_option=nil, @key_name=&quot;appid.keyuid&quot;, @key_secret=&quot;keysecret&quot;&gt;&gt;, @channels=#&lt;Ably::Realtime::Channels:0x00007efe9bd825e8 @client=#&lt;Ably::Realtime::Client:0x00007efe9bd836f0 ...&gt;, @channel_klass=Ably::Realtime::Channel, @channels={}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^
./lib/ably/realtime/client.rb:302:in `hostname&apos;
./lib/ably/realtime/client.rb:309:in `uri&apos;
./lib/ably/realtime/connection.rb:176:in `initialize&apos;
./lib/ably/realtime/client.rb:133:in `new&apos;
./lib/ably/realtime/client.rb:133:in `initialize&apos;
./spec/unit/realtime/client_spec.rb:7:in `new&apos;
./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/unit/realtime/client_spec.rb:52:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.realtime.client_spec" name="Ably::Realtime::Client push #device is not supported and raises an exception" file="./spec/unit/realtime/client_spec.rb" time="33.420076"><failure message="expected Ably::Exceptions::PushNotificationsNotSupported, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

          &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                  ^^^^^^^^^^^&gt; with backtrace:
  # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
  # ./lib/ably/realtime/client.rb:309:in `uri&apos;
  # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
  # ./lib/ably/realtime/client.rb:133:in `new&apos;
  # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
  # ./spec/unit/realtime/client_spec.rb:7:in `new&apos;
  # ./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/client_spec.rb:48:in `block (4 levels) in &lt;top (required)&gt;&apos;
  # ./spec/unit/realtime/client_spec.rb:48:in `block (3 levels) in &lt;top (required)&gt;&apos;
  # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
  # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: orig_handle_failure(*args, &amp;block)

  expected Ably::Exceptions::PushNotificationsNotSupported, got #&lt;NameError: undefined local variable or method `root_domain&apos; for #&lt;Ably::Realtime::Client:0x00007efe...{}&gt;&gt;

            &quot;#{endpoint}.realtime.#{root_domain}&quot;
                                    ^^^^^^^^^^^&gt; with backtrace:
    # ./lib/ably/realtime/client.rb:302:in `hostname&apos;
    # ./lib/ably/realtime/client.rb:309:in `uri&apos;
    # ./lib/ably/realtime/connection.rb:176:in `initialize&apos;
    # ./lib/ably/realtime/client.rb:133:in `new&apos;
    # ./lib/ably/realtime/client.rb:133:in `initialize&apos;
    # ./spec/unit/realtime/client_spec.rb:7:in `new&apos;
    # ./spec/unit/realtime/client_spec.rb:7:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/client_spec.rb:48:in `block (4 levels) in &lt;top (required)&gt;&apos;
    # ./spec/unit/realtime/client_spec.rb:48:in `block (3 levels) in &lt;top (required)&gt;&apos;
    # ./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
    # ./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;
./spec/support/event_machine_helper.rb:156:in `handle_failure&apos;
./spec/unit/realtime/client_spec.rb:48:in `block (3 levels) in &lt;top (required)&gt;&apos;
./spec/support/rest_testapp_before_retry.rb:6:in `block (2 levels) in &lt;top (required)&gt;&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:124:in `block in run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `loop&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:110:in `run&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec_ext/rspec_ext.rb:12:in `run_with_retry&apos;
./vendor/bundle/ruby/3.1.0/gems/rspec-retry-0.6.2/lib/rspec/retry.rb:37:in `block (2 levels) in setup&apos;
./vendor/bundle/ruby/3.1.0/gems/webmock-3.24.0/lib/webmock/rspec.rb:39:in `block (2 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#event (#TH5) is an attribute" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000830"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#event (#TH5) is not required" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000780"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#previous (#TH2) is an attribute" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000799"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#previous (#TH2) is required" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000593"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#current (#TH1) is required" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000675"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#current (#TH1) is an attribute" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000620"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#resumed (#TH4) is false when ommitted" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000488"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#resumed (#TH4) is true when provided" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000801"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#reason (#TH3) is an attribute" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000560"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange#reason (#TH3) is not required" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000535"></testcase>
<testcase classname="spec.unit.models.channel_state_change_spec" name="Ably::Models::ChannelStateChange invalid attributes raises an argument error" file="./spec/unit/models/channel_state_change_spec.rb" time="0.000610"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels [] creates a channel" file="./spec/unit/realtime/channels_spec.rb" time="0.001284"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when channel doesn&apos;t exist ChannelOptions object is expected to be a kind of Ably::Models::ChannelOptions" file="./spec/unit/realtime/channels_spec.rb" time="0.000672"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when channel doesn&apos;t exist ChannelOptions object creates a channel (RTS3a)" file="./spec/unit/realtime/channels_spec.rb" time="0.001129"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when channel doesn&apos;t exist hash is expected to be a kind of Hash" file="./spec/unit/realtime/channels_spec.rb" time="0.000639"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when channel doesn&apos;t exist hash creates a channel (RTS3a)" file="./spec/unit/realtime/channels_spec.rb" time="0.000885"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists will leave the options intact on the channel if not provided" file="./spec/unit/realtime/channels_spec.rb" time="0.001278"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists will update the options on the channel if provided (RSN3c)" file="./spec/unit/realtime/channels_spec.rb" time="0.001098"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists hash is expected to be a kind of Hash" file="./spec/unit/realtime/channels_spec.rb" time="0.000597"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists hash will reuse a channel object if it exists (RTS3a)" file="./spec/unit/realtime/channels_spec.rb" time="0.001128"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists ChannelOptions object is expected to be a kind of Ably::Models::ChannelOptions" file="./spec/unit/realtime/channels_spec.rb" time="0.000672"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels creating channels #get when an existing channel exists ChannelOptions object will reuse a channel object if it exists (RTS3a)" file="./spec/unit/realtime/channels_spec.rb" time="0.000859"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels destroying channels #release detaches and then releases the channel resources" file="./spec/unit/realtime/channels_spec.rb" time="0.001354"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels is Enumerable provides #length" file="./spec/unit/realtime/channels_spec.rb" time="0.004084"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels is Enumerable allows enumeration" file="./spec/unit/realtime/channels_spec.rb" time="0.001355"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels is Enumerable #each yields each channel" file="./spec/unit/realtime/channels_spec.rb" time="0.001140"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels is Enumerable #each returns an enumerator" file="./spec/unit/realtime/channels_spec.rb" time="0.000984"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels#fetch retrieves a channel if it exists" file="./spec/unit/realtime/channels_spec.rb" time="0.001048"></testcase>
<testcase classname="spec.unit.realtime.channels_spec" name="Ably::Realtime::Channels#fetch calls the block if channel is missing" file="./spec/unit/realtime/channels_spec.rb" time="0.000858"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper provides methods to read values using snake_case" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000677"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper provides accessor set method to values using snake_case" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000528"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper provides accessor method to values using snake_case" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000661"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper provides methods to write values using snake_case" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000626"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper #attributes returns raw Hash object" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000619"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper does not provide methods for keys that are missing" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000577"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData returns nil for non existent keys" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000752"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData symbol allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData symbol updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000835"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData symbol updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000849"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_symbol allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000579"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_symbol updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000855"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_symbol updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000584"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData new keys uses mixedCase" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000670"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_string allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000760"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_string updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000825"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_string updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000882"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_string allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000667"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_string updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000850"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData mixed_case_string updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000593"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_string allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000873"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_string updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000755"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_string updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000584"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_symbol allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000474"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_symbol updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000770"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_symbol updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000515"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_string allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000837"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_string updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000635"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData lower_case_string updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000807"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_symbol allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000637"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_symbol updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000822"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData camel_case_symbol updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000656"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_symbol allows access to non conformant keys but prefers correct mixedCaseSyntax" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000485"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_symbol updates returns the new value" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000626"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper non standard mixedCaseData snake_case_symbol updates returns the new value in the JSON" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000796"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper Kernel.Array like method to create a IdiomaticRubyWrapper will return the same IdiomaticRubyWrapper if passed in" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000619"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper Kernel.Array like method to create a IdiomaticRubyWrapper will return the same IdiomaticRubyWrapper if passed in" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000565"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck returns correct size" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000450"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_json returns child JSON objects in the JSON stringified" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000680"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_json returns JSON stringified" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000691"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck supports Hash-like #values" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000626"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck is Enumerable" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000607"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck supports Hash-like #keys" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck iterable yields key value pairs" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000705"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck iterable #each returns an enumerator" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000526"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck iterable #each yields key value pairs" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000724"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck with snake case JSON #to_json uses mixedCase for any non mixedCase keys" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000587"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_msgpack returns a msgpack object" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000693"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #== presents itself as a symbolized version of the object" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000491"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #== returns false if different values to another Hash" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000677"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #== compares with itself" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000671"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #== returns false if different values to another IdiomaticRubyWrapper" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000551"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #== returns false if comparing with a non Hash/IdiomaticRubyWrapper object" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.003390"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_hash converts hashes within hashes" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000801"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_hash returns a hash" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000621"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #fetch fetches the key" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000660"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #fetch calls the block if key does not exist" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000654"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #fetch allows a default value argument" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000653"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #fetch raise an exception if key does not exist" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000608"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #dup keeps the stop_at list intact" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000679"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #dup returns a new IdiomaticRubyWrapper with the same underlying Hash object" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000656"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #dup returns a new object with the underlying JSON duped" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000618"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper acts like a duck #to_json with changes returns stringified JSON with changes" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000740"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper recursively wrapping child objects ignores arrays" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000656"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper recursively wrapping child objects wraps Hashes" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000674"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper recursively wrapping child objects :stop_at option with symbol does not wrap the matching key" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000588"></testcase>
<testcase classname="spec.unit.models.idiomatic_ruby_wrapper_spec" name="Ably::Models::IdiomaticRubyWrapper recursively wrapping child objects :stop_at option with string does not wrap the matching key" file="./spec/unit/models/idiomatic_ruby_wrapper_spec.rb" time="0.000521"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels [] creates a channel" file="./spec/unit/rest/channels_spec.rb" time="0.000986"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists ChannelOptions object will reuse a channel object if it exists (RSN3a)" file="./spec/unit/rest/channels_spec.rb" time="0.000795"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists ChannelOptions object is expected to be a kind of Ably::Models::ChannelOptions" file="./spec/unit/rest/channels_spec.rb" time="0.000771"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists with new channel_options modes hash will update channel with provided options modes (RSN3c)" file="./spec/unit/rest/channels_spec.rb" time="0.000867"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists with new channel_options modes hash is expected to be a kind of Hash" file="./spec/unit/rest/channels_spec.rb" time="0.000640"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists with new channel_options modes ChannelOptions object is expected to be a kind of Ably::Models::ChannelOptions" file="./spec/unit/rest/channels_spec.rb" time="0.000631"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists with new channel_options modes ChannelOptions object will update channel with provided options modes (RSN3c)" file="./spec/unit/rest/channels_spec.rb" time="0.000730"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists hash is expected to be a kind of Hash" file="./spec/unit/rest/channels_spec.rb" time="0.000644"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when an existing channel exists hash will reuse a channel object if it exists (RSN3a)" file="./spec/unit/rest/channels_spec.rb" time="0.000825"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when channel doesn&apos;t exist ChannelOptions object is expected to be a kind of Ably::Models::ChannelOptions" file="./spec/unit/rest/channels_spec.rb" time="0.000675"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when channel doesn&apos;t exist ChannelOptions object creates a channel (RSN3a)" file="./spec/unit/rest/channels_spec.rb" time="0.000921"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when channel doesn&apos;t exist hash is expected to be a kind of Hash" file="./spec/unit/rest/channels_spec.rb" time="0.000512"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#get when channel doesn&apos;t exist hash creates a channel (RSN3a)" file="./spec/unit/rest/channels_spec.rb" time="0.000891"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels is Enumerable allows enumeration" file="./spec/unit/rest/channels_spec.rb" time="0.000935"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels is Enumerable provides #length" file="./spec/unit/rest/channels_spec.rb" time="0.000943"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels is Enumerable #each yields each channel" file="./spec/unit/rest/channels_spec.rb" time="0.000944"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels is Enumerable #each returns an enumerator" file="./spec/unit/rest/channels_spec.rb" time="0.000985"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels destroying channels #release releases the channel resoures" file="./spec/unit/rest/channels_spec.rb" time="0.000746"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#fetch retrieves a channel if it exists" file="./spec/unit/rest/channels_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.rest.channels_spec" name="Ably::Rest::Channels#fetch calls the block if channel is missing" file="./spec/unit/rest/channels_spec.rb" time="0.000547"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel is available in the #push attribute of the channel" file="./spec/unit/rest/push_channel_spec.rb" time="0.000644"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel exposes the channel as attribute #channel" file="./spec/unit/rest/push_channel_spec.rb" time="0.000624"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel raises an exception if constructed with an invalid type" file="./spec/unit/rest/push_channel_spec.rb" time="0.000534"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel is constructed with a channel" file="./spec/unit/rest/push_channel_spec.rb" time="0.000536"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel methods not implemented as push notifications #unsubscribe_device raises an unsupported exception" file="./spec/unit/rest/push_channel_spec.rb" time="0.000673"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel methods not implemented as push notifications #unsubscribe_client_id raises an unsupported exception" file="./spec/unit/rest/push_channel_spec.rb" time="0.000655"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel methods not implemented as push notifications #get_subscriptions raises an unsupported exception" file="./spec/unit/rest/push_channel_spec.rb" time="0.000678"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel methods not implemented as push notifications #subscribe_device raises an unsupported exception" file="./spec/unit/rest/push_channel_spec.rb" time="0.000575"></testcase>
<testcase classname="spec.unit.rest.push_channel_spec" name="Ably::Rest::Channel::PushChannel methods not implemented as push notifications #subscribe_client_id raises an unsupported exception" file="./spec/unit/rest/push_channel_spec.rb" time="0.000621"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails == is true when attributes are the same" file="./spec/unit/models/auth_details_spec.rb" time="0.000662"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails == is false when class type differs" file="./spec/unit/models/auth_details_spec.rb" time="0.000557"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails == is false when attributes are not the same" file="./spec/unit/models/auth_details_spec.rb" time="0.000530"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model #== is false when attributes are not the same" file="./spec/unit/models/auth_details_spec.rb" time="0.000638"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model #== is true when attributes are the same" file="./spec/unit/models/auth_details_spec.rb" time="0.000609"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model #== is false when class type differs" file="./spec/unit/models/auth_details_spec.rb" time="0.000486"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model #to_json returns a JSON string with Ably payload naming" file="./spec/unit/models/auth_details_spec.rb" time="0.000669"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model #to_msgpack returns a msgpack object with Ably payload naming" file="./spec/unit/models/auth_details_spec.rb" time="0.000652"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model attributes #attributes provides access to #attributes" file="./spec/unit/models/auth_details_spec.rb" time="0.000619"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model attributes #[] provides accessor method to #attributes" file="./spec/unit/models/auth_details_spec.rb" time="0.000532"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model attributes #access_token retrieves attribute :access_token" file="./spec/unit/models/auth_details_spec.rb" time="0.000661"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model is immutable prevents changes" file="./spec/unit/models/auth_details_spec.rb" time="0.000641"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails behaves like a model is immutable dups options" file="./spec/unit/models/auth_details_spec.rb" time="0.000551"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails AuthDetails conversion methods with a AuthDetails object returns the AuthDetails object" file="./spec/unit/models/auth_details_spec.rb" time="0.000625"></testcase>
<testcase classname="spec.unit.models.auth_details_spec" name="Ably::Models::AuthDetails AuthDetails conversion methods with a JSON object returns a new AuthDetails object from the JSON" file="./spec/unit/models/auth_details_spec.rb" time="0.000584"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with utf8 payload sets the encoding" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.003406"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with utf8 payload strips the encoding" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.000534"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with utf8 payload before other payloads sets the encoding" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.000722"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with utf8 payload before other payloads strips the encoding" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.000694"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with another payload leaves the message data intact" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.000598"></testcase>
<testcase classname="spec.unit.models.message_encoders.utf8_spec" name="Ably::Models::MessageEncoders::Utf8#decode message with another payload leaves the encoding intact" file="./spec/unit/models/message_encoders/utf8_spec.rb" time="0.000488"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence callbacks fail with unacceptable STATE event names" file="./spec/unit/realtime/presence_spec.rb" time="0.000812"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence callbacks are supported for valid STATE events" file="./spec/unit/realtime/presence_spec.rb" time="0.000808"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #subscribe with no action specified subscribes the provided block to all action" file="./spec/unit/realtime/presence_spec.rb" time="0.001116"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #subscribe with a single action argument subscribes that block to matching actions" file="./spec/unit/realtime/presence_spec.rb" time="0.001097"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #subscribe with a multiple action arguments subscribes that block to all of those actions" file="./spec/unit/realtime/presence_spec.rb" time="0.001707"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #subscribe without a block raises an invalid ArgumentError" file="./spec/unit/realtime/presence_spec.rb" time="0.000690"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #subscribe with a multiple duplicate action arguments subscribes that block to all of those unique actions once" file="./spec/unit/realtime/presence_spec.rb" time="0.001040"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #unsubscribe with a non-matching action argument has no effect" file="./spec/unit/realtime/presence_spec.rb" time="0.001109"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #unsubscribe with multiple action arguments unsubscribes each of those matching actions with the provided block" file="./spec/unit/realtime/presence_spec.rb" time="0.001374"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #unsubscribe with no block argument unsubscribes all blocks for the action argument" file="./spec/unit/realtime/presence_spec.rb" time="0.001099"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #unsubscribe with a single action argument unsubscribes the provided block with the matching action" file="./spec/unit/realtime/presence_spec.rb" time="0.001106"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence subscriptions #unsubscribe with no action specified unsubscribes that block from all events" file="./spec/unit/realtime/presence_spec.rb" time="0.001063"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence msgbus supports messages" file="./spec/unit/realtime/presence_spec.rb" time="0.001073"></testcase>
<testcase classname="spec.unit.realtime.presence_spec" name="Ably::Realtime::Presence msgbus fail with unacceptable STATE event names" file="./spec/unit/realtime/presence_spec.rb" time="0.000705"></testcase>
</testsuite>
