SPEC.md in ably-1.1.4 vs SPEC.md in ably-1.1.5

- old
+ new

@@ -1,6 +1,6 @@ -# Ably Realtime & REST Client Library 1.1.4 Specification +# Ably Realtime & REST Client Library 1.1.5 Specification ### Ably::Realtime::Auth _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_spec.rb))_ * using JSON protocol * with basic auth @@ -598,127 +598,128 @@ * request fails due to invalid content * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L92) * request fails due to slow response and subsequent timeout * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L127) * request fails once due to slow response but succeeds the second time - * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L165) + * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L175) * existing CONNECTED connection * authorize request failure leaves connection in existing condition - * [the connection remains in the CONNECTED state and authorize fails (#RSA4c, #RSA4c1, #RSA4c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L186) + * [the connection remains in the CONNECTED state and authorize fails (#RSA4c, #RSA4c1, #RSA4c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L196) * with auth_callback * opening a new connection * when callback fails due to an exception - * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L214) + * [the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)](./spec/acceptance/realtime/connection_failures_spec.rb#L224) * existing CONNECTED connection * when callback fails due to the request taking longer than realtime_request_timeout - * [the authorization request fails as configured in the realtime_request_timeout (#RSA4c, #RSA4c1, #RSA4c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L245) + * [the authorization request fails as configured in the realtime_request_timeout (#RSA4c, #RSA4c1, #RSA4c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L255) * automatic connection retry * with invalid WebSocket host * when disconnected - * [enters the suspended state after multiple attempts to connect](./spec/acceptance/realtime/connection_failures_spec.rb#L310) + * [enters the suspended state after multiple attempts to connect](./spec/acceptance/realtime/connection_failures_spec.rb#L320) * for the first time - * [reattempts connection immediately and then waits disconnected_retry_timeout for a subsequent attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L331) + * [reattempts connection immediately and then waits disconnected_retry_timeout for a subsequent attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L341) * #close - * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L348) + * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L358) * when connection state is :suspended - * [stays in the suspended state after any number of reconnection attempts](./spec/acceptance/realtime/connection_failures_spec.rb#L367) + * [stays in the suspended state after any number of reconnection attempts](./spec/acceptance/realtime/connection_failures_spec.rb#L377) * for the first time - * [waits suspended_retry_timeout before attempting to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L390) + * [waits suspended_retry_timeout before attempting to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L400) * #close - * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L412) + * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L422) * when connection state is :failed * #close - * [will not transition state to :close and fails with an InvalidStateChange exception](./spec/acceptance/realtime/connection_failures_spec.rb#L431) + * [will not transition state to :close and fails with an InvalidStateChange exception](./spec/acceptance/realtime/connection_failures_spec.rb#L441) * #error_reason - * [contains the error when state is disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L452) - * [contains the error when state is suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L452) - * [contains the error when state is failed](./spec/acceptance/realtime/connection_failures_spec.rb#L452) - * [is reset to nil when :connected](./spec/acceptance/realtime/connection_failures_spec.rb#L466) - * [is reset to nil when :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L477) + * [contains the error when state is disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L462) + * [contains the error when state is suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L462) + * [contains the error when state is failed](./spec/acceptance/realtime/connection_failures_spec.rb#L462) + * [is reset to nil when :connected](./spec/acceptance/realtime/connection_failures_spec.rb#L476) + * [is reset to nil when :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L487) * #connect * connection opening times out - * [attempts to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L508) + * [attempts to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L518) * when retry intervals are stubbed to attempt reconnection quickly - * [never calls the provided success block](./spec/acceptance/realtime/connection_failures_spec.rb#L532) + * [never calls the provided success block](./spec/acceptance/realtime/connection_failures_spec.rb#L542) * connection resume * when DISCONNECTED ProtocolMessage received from the server - * [reconnects automatically and immediately](./spec/acceptance/realtime/connection_failures_spec.rb#L563) + * [reconnects automatically and immediately](./spec/acceptance/realtime/connection_failures_spec.rb#L573) * connection state freshness is monitored - * [resumes connections when disconnected within the connection_state_ttl period (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L584) + * [resumes connections when disconnected within the connection_state_ttl period (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L594) * when connection_state_ttl period has passed since being disconnected - * [clears the local connection state and uses a new connection when the connection_state_ttl period has passed (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L624) + * [clears the local connection state and uses a new connection when the connection_state_ttl period has passed (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L634) * when connection_state_ttl period has passed since last activity on the connection - * [does not clear the local connection state when the connection_state_ttl period has passed since last activity, but the idle timeout has not passed (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L677) - * [clears the local connection state and uses a new connection when the connection_state_ttl + max_idle_interval period has passed since last activity (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L711) - * [still reattaches the channels automatically following a new connection being established (#RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L746) + * [does not clear the local connection state when the connection_state_ttl period has passed since last activity, but the idle timeout has not passed (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L687) + * [clears the local connection state and uses a new connection when the connection_state_ttl + max_idle_interval period has passed since last activity (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L721) + * [still reattaches the channels automatically following a new connection being established (#RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L756) * and subsequently fails to reconnect - * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L805) + * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L815) * when websocket transport is abruptly disconnected - * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L848) + * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L858) * hosts used - * [reconnects with the default host](./spec/acceptance/realtime/connection_failures_spec.rb#L864) + * [reconnects with the default host](./spec/acceptance/realtime/connection_failures_spec.rb#L874) * after successfully reconnecting and resuming - * [retains connection_id and updates the connection_key (#RTN15e, #RTN16d)](./spec/acceptance/realtime/connection_failures_spec.rb#L888) - * [includes the error received in the connection state change from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L903) - * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L929) - * [retains the client_msg_serial (#RTN15c2, #RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L990) + * [retains connection_id and updates the connection_key (#RTN15e, #RTN16d)](./spec/acceptance/realtime/connection_failures_spec.rb#L898) + * [includes the error received in the connection state change from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L913) + * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L939) + * [retains the client_msg_serial (#RTN15c2, #RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1000) * when messages were published whilst the client was disconnected - * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L957) + * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L967) * when failing to resume * because the connection_key is not or no longer valid - * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L1030) - * [issue a reattach for all attached channels and fail all message awaiting an ACK (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1045) - * [issue a reattach for all attaching channels and fail all queued messages (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1083) - * [issue a attach for all suspended channels (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1119) - * [sets the error reason on each channel](./spec/acceptance/realtime/connection_failures_spec.rb#L1157) - * [continues to use the client_msg_serial (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1172) + * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L1040) + * [issue a reattach for all attached channels and fail all message awaiting an ACK (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1055) + * [issue a reattach for all attaching channels and fail all queued messages (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1093) + * [issue a attach for all suspended channels (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1129) + * [sets the error reason on each channel](./spec/acceptance/realtime/connection_failures_spec.rb#L1167) + * [continues to use the client_msg_serial (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1182) * as the DISCONNECTED window to resume has passed - * [starts a new connection automatically and does not try and resume](./spec/acceptance/realtime/connection_failures_spec.rb#L1209) + * [starts a new connection automatically and does not try and resume](./spec/acceptance/realtime/connection_failures_spec.rb#L1219) * when an ERROR protocol message is received * whilst connecting * with a token error code in the range 40140 <= code < 40150 (#RTN14b) - * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1240) + * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1250) * with an error code indicating an error other than a token failure (#RTN14g, #RTN15i) - * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1256) + * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1266) * with no error code indicating an error other than a token failure (#RTN14g, #RTN15i) - * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1269) + * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1279) * whilst connected * with a token error code in the range 40140 <= code < 40150 (#RTN14b) - * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1240) + * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1250) * with an error code indicating an error other than a token failure (#RTN14g, #RTN15i) - * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1256) + * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1266) * with no error code indicating an error other than a token failure (#RTN14g, #RTN15i) - * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1269) + * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1279) * whilst resuming * with a token error code in the region 40140 <= code < 40150 (RTN15c5) - * [triggers a re-authentication and then resumes the connection](./spec/acceptance/realtime/connection_failures_spec.rb#L1313) + * [triggers a re-authentication and then resumes the connection](./spec/acceptance/realtime/connection_failures_spec.rb#L1323) * with any other error (#RTN15c4) - * [moves the connection to the failed state](./spec/acceptance/realtime/connection_failures_spec.rb#L1345) + * [moves the connection to the failed state](./spec/acceptance/realtime/connection_failures_spec.rb#L1355) * fallback host feature * with custom realtime websocket host option - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1389) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1399) * with custom realtime websocket port option - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1407) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1417) * with non-production environment - * [does not use a fallback host by default](./spec/acceptance/realtime/connection_failures_spec.rb#L1426) + * :fallback_hosts_use_default is unset + * [uses fallback hosts by default](./spec/acceptance/realtime/connection_failures_spec.rb#L1441) * :fallback_hosts_use_default is true - * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k7)](./spec/acceptance/realtime/connection_failures_spec.rb#L1444) - * [does not use a fallback host if the connection connects on the default host and then later becomes disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L1462) + * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k7)](./spec/acceptance/realtime/connection_failures_spec.rb#L1459) + * [does not use a fallback host if the connection connects on the default host and then later becomes disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L1477) * :fallback_hosts array is provided - * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1490) + * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1505) * with production environment * when the Internet is down - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1526) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1541) * when the Internet is up * and default options - * [uses a fallback host + the original host once on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L1549) - * [uses the primary host when suspended, and then every fallback host and the primary host again on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L1568) - * [uses the correct host name for the WebSocket requests to the fallback hosts](./spec/acceptance/realtime/connection_failures_spec.rb#L1591) + * [uses a fallback host + the original host once on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L1564) + * [uses the primary host when suspended, and then every fallback host and the primary host again on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L1583) + * [uses the correct host name for the WebSocket requests to the fallback hosts](./spec/acceptance/realtime/connection_failures_spec.rb#L1606) * :fallback_hosts array is provided by an empty array - * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1621) + * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1636) * :fallback_hosts array is provided - * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1641) + * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1656) ### Ably::Realtime::Connection _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/connection_spec.rb))_ * using JSON protocol * intialization @@ -735,11 +736,11 @@ * [uses the existing token created by Auth](./spec/acceptance/realtime/connection_spec.rb#L72) * that expire * opening a new connection * with almost expired tokens * [renews token every time after it expires](./spec/acceptance/realtime/connection_spec.rb#L106) - * with immediately expired token + * with immediately expired token and no fallback hosts * [renews the token on connect, and makes one immediate subsequent attempt to obtain a new token (#RSA4b)](./spec/acceptance/realtime/connection_spec.rb#L136) * when disconnected_retry_timeout is 0.5 seconds * [renews the token on connect, and continues to attempt renew based on the retry schedule](./spec/acceptance/realtime/connection_spec.rb#L151) * using implicit token auth * [uses the primary host for subsequent connection and auth requests](./spec/acceptance/realtime/connection_spec.rb#L181) @@ -767,180 +768,180 @@ * initialization state changes * with implicit #connect * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L431) * with explicit #connect * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L437) - * #connect - * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L445) - * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L450) - * [calls the provided block on success even if state changes to disconnected first](./spec/acceptance/realtime/connection_spec.rb#L457) + * #connect with no fallbacks + * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L447) + * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L452) + * [calls the provided block on success even if state changes to disconnected first](./spec/acceptance/realtime/connection_spec.rb#L459) * with invalid auth details - * [calls the Deferrable errback only once on connection failure](./spec/acceptance/realtime/connection_spec.rb#L486) + * [calls the Deferrable errback only once on connection failure](./spec/acceptance/realtime/connection_spec.rb#L488) * when already connected - * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L502) + * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L504) * connection#id - * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L516) + * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L518) * connection#key - * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L523) + * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L525) * once connected * connection#id - * [is a string](./spec/acceptance/realtime/connection_spec.rb#L534) - * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L541) - * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L548) + * [is a string](./spec/acceptance/realtime/connection_spec.rb#L536) + * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L543) + * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L550) * connection#key - * [is a string](./spec/acceptance/realtime/connection_spec.rb#L557) - * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L564) - * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L571) + * [is a string](./spec/acceptance/realtime/connection_spec.rb#L559) + * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L566) + * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L573) * following a previous connection being opened and closed - * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L581) + * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L583) * when closing - * [fails the deferrable before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L598) + * [fails the deferrable before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L600) * #serial connection serial - * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L615) - * [is set to 0 when a message is received back](./spec/acceptance/realtime/connection_spec.rb#L638) - * [is set to 1 when the second message is received](./spec/acceptance/realtime/connection_spec.rb#L646) + * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L617) + * FAILED: ~~[is set to 0 when a message is received back](./spec/acceptance/realtime/connection_spec.rb#L640)~~ + * [is set to 1 when the second message is received](./spec/acceptance/realtime/connection_spec.rb#L648) * when a message is sent but the ACK has not yet been received - * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L623) + * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L625) * #msgSerial * when messages are queued for publish before a connection is established - * [the msgSerial is always incrementing (and not reset when the new connection is established) ensuring messages are never de-duped by the realtime service](./spec/acceptance/realtime/connection_spec.rb#L674) + * [the msgSerial is always incrementing (and not reset when the new connection is established) ensuring messages are never de-duped by the realtime service](./spec/acceptance/realtime/connection_spec.rb#L676) * #close - * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L694) - * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L701) + * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L696) + * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L703) * when already closed - * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L712) + * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L714) * when connection state is * :initialized - * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L739) + * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L741) * :connected - * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L756) + * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L758) * with an unresponsive connection - * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L783) + * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L785) * #ping - * [echoes a heart beat (#RTN13a)](./spec/acceptance/realtime/connection_spec.rb#L805) - * [sends a unique ID in each protocol message (#RTN13e)](./spec/acceptance/realtime/connection_spec.rb#L815) - * [waits until the connection becomes CONNECTED when in the CONNETING state](./spec/acceptance/realtime/connection_spec.rb#L839) + * [echoes a heart beat (#RTN13a)](./spec/acceptance/realtime/connection_spec.rb#L807) + * [sends a unique ID in each protocol message (#RTN13e)](./spec/acceptance/realtime/connection_spec.rb#L817) + * [waits until the connection becomes CONNECTED when in the CONNETING state](./spec/acceptance/realtime/connection_spec.rb#L841) * with incompatible states * when not connected - * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L852) + * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L854) * when suspended - * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L861) + * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L863) * when failed - * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L873) + * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L875) * when closed - * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L885) + * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L887) * when it becomes closed - * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L899) + * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L901) * with a success block that raises an exception - * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L912) + * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L914) * when ping times out - * [fails the deferrable logs a warning (#RTN13a, #RTN13c)](./spec/acceptance/realtime/connection_spec.rb#L926) - * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L945) + * [fails the deferrable logs a warning (#RTN13a, #RTN13c)](./spec/acceptance/realtime/connection_spec.rb#L928) + * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L947) * Heartbeats (#RTN23) * heartbeat interval * when reduced artificially - * [is the sum of the max_idle_interval and realtime_request_timeout (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L972) - * [disconnects the transport if no heartbeat received since connected (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L982) - * [disconnects the transport if no heartbeat received since last event received (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L993) + * [is the sum of the max_idle_interval and realtime_request_timeout (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L974) + * [disconnects the transport if no heartbeat received since connected (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L984) + * [disconnects the transport if no heartbeat received since last event received (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L995) * transport-level heartbeats are supported in the websocket transport - * [provides the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1008) - * [receives websocket heartbeat messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1017) + * [provides the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1010) + * [receives websocket heartbeat messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1019) * with websocket heartbeats disabled (undocumented) - * [does not provide the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1033) - * [receives websocket protocol messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1042) + * [does not provide the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1035) + * [receives websocket protocol messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1044) * #details - * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L1060) - * [contains the ConnectionDetails object once connected (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1067) - * [contains the new ConnectionDetails object once a subsequent connection is created (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1076) + * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L1062) + * [contains the ConnectionDetails object once connected (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1069) + * [contains the new ConnectionDetails object once a subsequent connection is created (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1078) * with a different default connection_state_ttl - * [updates the private Connection#connection_state_ttl when received from Ably in ConnectionDetails](./spec/acceptance/realtime/connection_spec.rb#L1097) + * [updates the private Connection#connection_state_ttl when received from Ably in ConnectionDetails](./spec/acceptance/realtime/connection_spec.rb#L1099) * recovery * #recovery_key - * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L1134) - * [is available when connection is in one of the states: connecting, connected, disconnected](./spec/acceptance/realtime/connection_spec.rb#L1162) - * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L1191) + * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L1136) + * [is available when connection is in one of the states: connecting, connected, disconnected](./spec/acceptance/realtime/connection_spec.rb#L1164) + * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L1194) * opening a new connection using a recently disconnected connection's #recovery_key * connection#id after recovery - * [remains the same](./spec/acceptance/realtime/connection_spec.rb#L1203) + * [remains the same](./spec/acceptance/realtime/connection_spec.rb#L1206) * when messages have been sent whilst the old connection is disconnected * the new connection - * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L1239) + * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L1242) * when messages have been published * the new connection - * [uses the correct msgSerial from the old connection](./spec/acceptance/realtime/connection_spec.rb#L1268) + * [uses the correct msgSerial from the old connection](./spec/acceptance/realtime/connection_spec.rb#L1271) * when messages are published before the new connection is recovered * the new connection - * [uses the correct msgSerial from the old connection for the queued messages](./spec/acceptance/realtime/connection_spec.rb#L1298) + * [uses the correct msgSerial from the old connection for the queued messages](./spec/acceptance/realtime/connection_spec.rb#L1301) * with :recover option * with invalid syntax - * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L1345) + * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L1348) * with invalid formatted value sent to server - * [sets the #error_reason and moves the connection to FAILED](./spec/acceptance/realtime/connection_spec.rb#L1354) + * [sets the #error_reason and moves the connection to FAILED](./spec/acceptance/realtime/connection_spec.rb#L1357) * with expired (missing) value sent to server - * [connects but sets the error reason and includes the reason in the state change](./spec/acceptance/realtime/connection_spec.rb#L1369) + * [connects but sets the error reason and includes the reason in the state change](./spec/acceptance/realtime/connection_spec.rb#L1372) * with many connections simultaneously - * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1388) + * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1391) * when a state transition is unsupported - * [logs the invalid state change as fatal](./spec/acceptance/realtime/connection_spec.rb#L1408) + * [logs the invalid state change as fatal](./spec/acceptance/realtime/connection_spec.rb#L1411) * protocol failure * receiving an invalid ProtocolMessage - * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1424) + * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1427) * undocumented method * #internet_up? - * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1442) + * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1445) * internet up URL protocol * when using TLS for the connection - * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1453) + * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1456) * when using a non-secured connection - * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1463) + * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1466) * when the Internet is up - * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1494) - * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1501) + * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1497) + * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1504) * with a TLS connection - * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1477) + * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1480) * with a non-TLS connection - * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1487) + * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1490) * when the Internet is down - * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1516) - * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1523) + * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1519) + * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1526) * state change side effects * when connection enters the :disconnected state - * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1537) + * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1540) * when connection enters the :suspended state - * [moves the channels into the suspended state and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1570) + * [moves the channels into the suspended state and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1573) * when connection enters the :failed state - * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1601) + * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1604) * connection state change - * [emits event to all and single subscribers](./spec/acceptance/realtime/connection_spec.rb#L1615) - * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1630) + * [emits event to all and single subscribers](./spec/acceptance/realtime/connection_spec.rb#L1618) + * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1633) * ConnectionStateChange object - * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1638) - * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1646) - * [has the event that generated the state change (#TH5)](./spec/acceptance/realtime/connection_spec.rb#L1654) - * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1670) + * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1641) + * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1649) + * [has the event that generated the state change (#TH5)](./spec/acceptance/realtime/connection_spec.rb#L1657) + * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1673) * on failure - * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1683) + * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1686) * retry_in - * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1698) - * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1705) - * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1715) - * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1725) + * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1701) + * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1708) + * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1718) + * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1728) * whilst CONNECTED * when a CONNECTED message is received (#RTN24) - * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1760) - * [updates the ConnectionDetail and Connection attributes (#RTC8a1)](./spec/acceptance/realtime/connection_spec.rb#L1775) + * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1763) + * [updates the ConnectionDetail and Connection attributes (#RTC8a1)](./spec/acceptance/realtime/connection_spec.rb#L1778) * when a CONNECTED message with an error is received - * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1810) + * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1813) * version params - * [sends the protocol version param v (#G4, #RTN2f)](./spec/acceptance/realtime/connection_spec.rb#L1831) - * [sends the lib version param lib (#RTN2g)](./spec/acceptance/realtime/connection_spec.rb#L1840) + * [sends the protocol version param v (#G4, #RTN2f)](./spec/acceptance/realtime/connection_spec.rb#L1834) + * [sends the lib version param lib (#RTN2g)](./spec/acceptance/realtime/connection_spec.rb#L1843) * with variant - * [sends the lib version param lib with the variant (#RTN2g + #RSC7b)](./spec/acceptance/realtime/connection_spec.rb#L1860) + * [sends the lib version param lib with the variant (#RTN2g + #RSC7b)](./spec/acceptance/realtime/connection_spec.rb#L1863) * transport_params (#RTC1f) - * [pases transport_params to query](./spec/acceptance/realtime/connection_spec.rb#L1874) + * [pases transport_params to query](./spec/acceptance/realtime/connection_spec.rb#L1877) * when changing default param - * [overrides default param (#RTC1f1)](./spec/acceptance/realtime/connection_spec.rb#L1887) + * [overrides default param (#RTC1f1)](./spec/acceptance/realtime/connection_spec.rb#L1890) ### Ably::Realtime::Channel Message _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/message_spec.rb))_ * using JSON protocol * [sends a String data payload](./spec/acceptance/realtime/message_spec.rb#L25) @@ -1577,11 +1578,11 @@ * when the client does not have presence subscribe privileges but is present on the channel * [receives presence updates for all presence events generated by the current connection and the presence map is kept up to date (#RTP17a)](./spec/acceptance/realtime/presence_spec.rb#L2379) * local PresenceMap for presence members entered by this client * [maintains a copy of the member map for any member that shares this connection's connection ID (#RTP17)](./spec/acceptance/realtime/presence_spec.rb#L2427) * #RTP17b - * FAILED: ~~[updates presence members on leave](./spec/acceptance/realtime/presence_spec.rb#L2455)~~ + * [updates presence members on leave](./spec/acceptance/realtime/presence_spec.rb#L2455) * [does no update presence members on fabricated leave](./spec/acceptance/realtime/presence_spec.rb#L2480) * when a channel becomes attached again * and the resume flag is true * and the presence flag is false * [does not send any presence events as the PresenceMap is in sync (#RTP5c1)](./spec/acceptance/realtime/presence_spec.rb#L2527) @@ -1907,18 +1908,18 @@ * using JSON protocol * failed requests * due to invalid Auth * [should raise an InvalidRequest exception with a valid error message and code](./spec/acceptance/rest/base_spec.rb#L75) * server error with JSON error response body - * [should raise a ServerError exception](./spec/acceptance/rest/base_spec.rb#L94) + * [should raise a ServerError exception](./spec/acceptance/rest/base_spec.rb#L96) * 500 server error without a valid JSON response body - * [should raise a ServerError exception](./spec/acceptance/rest/base_spec.rb#L105) + * [should raise a ServerError exception](./spec/acceptance/rest/base_spec.rb#L109) * token authentication failures * when auth#token_renewable? - * [should automatically reissue a token](./spec/acceptance/rest/base_spec.rb#L143) + * [should automatically reissue a token](./spec/acceptance/rest/base_spec.rb#L147) * when NOT auth#token_renewable? - * [should raise an TokenExpired exception](./spec/acceptance/rest/base_spec.rb#L158) + * [should raise an TokenExpired exception](./spec/acceptance/rest/base_spec.rb#L162) ### Ably::Rest::Channel _(see [spec/acceptance/rest/channel_spec.rb](./spec/acceptance/rest/channel_spec.rb))_ * using JSON protocol * #publish @@ -2097,125 +2098,130 @@ * for the fallback hosts * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L286) * [is configured to timeout connection requests in 10 seconds](./spec/acceptance/rest/client_spec.rb#L290) * fallback hosts * configured - * [should make connection attempts to A.ably-realtime.com, B.ably-realtime.com, C.ably-realtime.com, D.ably-realtime.com, E.ably-realtime.com (#RSC15a)](./spec/acceptance/rest/client_spec.rb#L304) + * [should make connection attempts to a.ably-realtime.com, b.ably-realtime.com, c.ably-realtime.com, d.ably-realtime.com, e.ably-realtime.com (#RSC15a)](./spec/acceptance/rest/client_spec.rb#L304) * when environment is NOT production (#RSC15b) - * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L321) + * and custom fallback hosts are empty + * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L322) + * and no custom fallback hosts are provided + * [should make connection attempts to sandbox-a-fallback.ably-realtime.com, sandbox-b-fallback.ably-realtime.com, sandbox-c-fallback.ably-realtime.com, sandbox-d-fallback.ably-realtime.com, sandbox-e-fallback.ably-realtime.com (#RSC15a)](./spec/acceptance/rest/client_spec.rb#L330) * when environment is production * and connection times out - * [tries fallback hosts 3 times (#RSC15b, #RSC15b)](./spec/acceptance/rest/client_spec.rb#L360) + * [tries fallback hosts 3 times (#RSC15b, #RSC15b)](./spec/acceptance/rest/client_spec.rb#L374) * and the total request time exeeds 15 seconds - * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L375) + * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L389) * and connection fails - * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L391) + * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L405) * and first request to primary endpoint fails - * [tries a fallback host, and for the next request tries the primary endpoint again (#RSC15e)](./spec/acceptance/rest/client_spec.rb#L425) + * [tries a fallback host, and for the next request tries the primary endpoint again (#RSC15e)](./spec/acceptance/rest/client_spec.rb#L439) * and basic authentication fails - * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L452) + * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L466) * and server returns a 50x error - * [attempts the fallback hosts as this is an authentication failure (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L474) + * [attempts the fallback hosts as this is an authentication failure (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L488) * when environment is production and server returns a 50x error * with custom fallback hosts provided - * [attempts the fallback hosts as this is an authentication failure (#RSC15b, #RSC15a, #TO3k6)](./spec/acceptance/rest/client_spec.rb#L523) + * [attempts the fallback hosts as this is an authentication failure (#RSC15b, #RSC15a, #TO3k6)](./spec/acceptance/rest/client_spec.rb#L537) * with an empty array of fallback hosts provided (#RSC15b, #RSC15a, #TO3k6) - * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L536) + * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L550) * using a local web-server * and timing out the primary host * POST with request timeout less than max_retry_duration - * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L600) + * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L614) * GET with request timeout less than max_retry_duration - * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L623) + * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L637) * POST with request timeout more than max_retry_duration - * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L646) + * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L660) * GET with request timeout more than max_retry_duration - * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L668) + * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L682) * and failing the primary host - * [tries one of the fallback hosts](./spec/acceptance/rest/client_spec.rb#L713) + * [tries one of the fallback hosts](./spec/acceptance/rest/client_spec.rb#L727) * to fail the primary host, allow a fallback to succeed, then later trigger a fallback to the primary host (#RSC15f) - * [succeeds and remembers fallback host preferences across requests](./spec/acceptance/rest/client_spec.rb#L769) + * [succeeds and remembers fallback host preferences across requests](./spec/acceptance/rest/client_spec.rb#L783) * with custom :fallback_retry_timeout - * [stops using the preferred fallback after this time](./spec/acceptance/rest/client_spec.rb#L806) + * [stops using the preferred fallback after this time](./spec/acceptance/rest/client_spec.rb#L820) * when environment is not production and server returns a 50x error + * with no fallback hosts provided (#TBC, see https://github.com/ably/wiki/issues/361) + * [uses the default fallback hosts for that environment as this is not an authentication failure](./spec/acceptance/rest/client_spec.rb#L874) * with custom fallback hosts provided (#RSC15b, #TO3k6) - * [attempts the fallback hosts as this is not an authentication failure](./spec/acceptance/rest/client_spec.rb#L867) + * [attempts the fallback hosts as this is not an authentication failure](./spec/acceptance/rest/client_spec.rb#L902) * with an empty array of fallback hosts provided (#RSC15b, #TO3k6) - * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L880) + * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L915) * with fallback_hosts_use_default: true (#RSC15b, #TO3k7) - * [attempts the default fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L905) + * [attempts the default fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L940) * with a custom host * that does not exist - * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L921) + * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L956) * fallback hosts - * [are never used](./spec/acceptance/rest/client_spec.rb#L942) + * [are never used](./spec/acceptance/rest/client_spec.rb#L977) * that times out - * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L957) + * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L992) * fallback hosts - * [are never used](./spec/acceptance/rest/client_spec.rb#L970) + * [are never used](./spec/acceptance/rest/client_spec.rb#L1005) * HTTP configuration options - * [is frozen](./spec/acceptance/rest/client_spec.rb#L1027) + * [is frozen](./spec/acceptance/rest/client_spec.rb#L1062) * defaults - * [#http_open_timeout is 4s](./spec/acceptance/rest/client_spec.rb#L982) - * [#http_request_timeout is 10s](./spec/acceptance/rest/client_spec.rb#L986) - * [#http_max_retry_count is 3](./spec/acceptance/rest/client_spec.rb#L990) - * [#http_max_retry_duration is 15s](./spec/acceptance/rest/client_spec.rb#L994) + * [#http_open_timeout is 4s](./spec/acceptance/rest/client_spec.rb#L1017) + * [#http_request_timeout is 10s](./spec/acceptance/rest/client_spec.rb#L1021) + * [#http_max_retry_count is 3](./spec/acceptance/rest/client_spec.rb#L1025) + * [#http_max_retry_duration is 15s](./spec/acceptance/rest/client_spec.rb#L1029) * configured - * [#http_open_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1010) - * [#http_request_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1014) - * [#http_max_retry_count uses provided value](./spec/acceptance/rest/client_spec.rb#L1018) - * [#http_max_retry_duration uses provided value](./spec/acceptance/rest/client_spec.rb#L1022) + * [#http_open_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1045) + * [#http_request_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1049) + * [#http_max_retry_count uses provided value](./spec/acceptance/rest/client_spec.rb#L1053) + * [#http_max_retry_duration uses provided value](./spec/acceptance/rest/client_spec.rb#L1057) * #auth - * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L1038) - * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L1042) + * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L1073) + * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L1077) * version headers * with variant none - * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1076) + * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1111) * with variant foo - * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1076) + * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1111) * #request (#RSC19*) * get - * [returns an HttpPaginatedResponse object](./spec/acceptance/rest/client_spec.rb#L1091) + * [returns an HttpPaginatedResponse object](./spec/acceptance/rest/client_spec.rb#L1126) * 404 request to invalid URL - * [returns an object with 404 status code and error message](./spec/acceptance/rest/client_spec.rb#L1098) + * [returns an object with 404 status code and error message](./spec/acceptance/rest/client_spec.rb#L1133) * paged results - * [provides paging](./spec/acceptance/rest/client_spec.rb#L1110) + * [provides paging](./spec/acceptance/rest/client_spec.rb#L1145) * post - * [supports post](./spec/acceptance/rest/client_spec.rb#L1135) + * [supports post](./spec/acceptance/rest/client_spec.rb#L1170) * delete - * [supports delete](./spec/acceptance/rest/client_spec.rb#L1148) + * [supports delete](./spec/acceptance/rest/client_spec.rb#L1183) * patch - * [supports patch](./spec/acceptance/rest/client_spec.rb#L1164) + * [supports patch](./spec/acceptance/rest/client_spec.rb#L1199) * put - * [supports put](./spec/acceptance/rest/client_spec.rb#L1187) + * [supports put](./spec/acceptance/rest/client_spec.rb#L1222) * request_id generation * Timeout error - * with option add_request_ids: true - * [has an error with the same request_id of the request](./spec/acceptance/rest/client_spec.rb#L1210) + * with option add_request_ids: true and no fallback hosts + * [has an error with the same request_id of the request](./spec/acceptance/rest/client_spec.rb#L1245) * with option add_request_ids: true and REST operations with a message body * with mocks to inspect the params * with a single publish - * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1232) + * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1267) * with an array publish - * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1239) + * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1274) * without mocks to ensure the requests are accepted * with a single publish - * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1248) + * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1283) * with an array publish - * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1255) + * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1290) * option add_request_ids: true and specified fallback hosts - * [request_id is the same across retries](./spec/acceptance/rest/client_spec.rb#L1280) - * without request_id - * [does not include request_id in ConnectionTimeout error](./spec/acceptance/rest/client_spec.rb#L1292) + * [request_id is the same across retries](./spec/acceptance/rest/client_spec.rb#L1315) + * without request_id and no fallback hosts + * [does not include request_id in ConnectionTimeout error](./spec/acceptance/rest/client_spec.rb#L1327) * UnauthorizedRequest nonce error - * [includes request_id in UnauthorizedRequest error due to replayed nonce](./spec/acceptance/rest/client_spec.rb#L1305) + * [includes request_id in UnauthorizedRequest error due to replayed nonce](./spec/acceptance/rest/client_spec.rb#L1340) * failed request logging - * [is absent when requests do not fail](./spec/acceptance/rest/client_spec.rb#L1322) + * [is absent when requests do not fail](./spec/acceptance/rest/client_spec.rb#L1357) * with the first request failing - * [is present with success message when requests do not actually fail](./spec/acceptance/rest/client_spec.rb#L1337) + * [is present with success message when requests do not actually fail](./spec/acceptance/rest/client_spec.rb#L1372) * with all requests failing - * [is present when all requests fail](./spec/acceptance/rest/client_spec.rb#L1354) + * [is present when all requests fail](./spec/acceptance/rest/client_spec.rb#L1389) ### Ably::Models::MessageEncoders _(see [spec/acceptance/rest/encoders_spec.rb](./spec/acceptance/rest/encoders_spec.rb))_ * with binary transport protocol * without encryption @@ -3845,13 +3851,44 @@ * with log_level :none * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L249) * with custom logger and log_level * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L259) * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L263) + * environment + * when set without custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L275) + * [uses the default fallback hosts (#TBC, see https://github.com/ably/wiki/issues/361)](./spec/shared/client_initializer_behaviour.rb#L279) + * when set with custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L289) + * [uses the custom provided fallback hosts (#RSC15a)](./spec/shared/client_initializer_behaviour.rb#L293) + * when set with fallback_hosts_use_default + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L304) + * [uses the production default fallback hosts (#RTN17b)](./spec/shared/client_initializer_behaviour.rb#L308) + * rest_host + * when set without custom fallback hosts configured + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L319) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L323) + * when set with environment and without custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L333) + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L337) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L341) + * when set with custom fallback hosts configured + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L351) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L355) + * realtime_host + * when set without custom fallback hosts configured + * [sets the realtime_host option](./spec/shared/client_initializer_behaviour.rb#L368) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L372) + * custom port + * when set without custom fallback hosts configured + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L383) + * custom TLS port + * when set without custom fallback hosts configured + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L394) * delegators - * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L277) - * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L282) + * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L408) + * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L413) * delegation to the REST Client * [passes on the options to the initializer](./spec/unit/realtime/client_spec.rb#L15) * for attribute * [#environment](./spec/unit/realtime/client_spec.rb#L23) * [#use_tls?](./spec/unit/realtime/client_spec.rb#L23) @@ -4053,13 +4090,44 @@ * with log_level :none * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L249) * with custom logger and log_level * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L259) * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L263) + * environment + * when set without custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L275) + * [uses the default fallback hosts (#TBC, see https://github.com/ably/wiki/issues/361)](./spec/shared/client_initializer_behaviour.rb#L279) + * when set with custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L289) + * [uses the custom provided fallback hosts (#RSC15a)](./spec/shared/client_initializer_behaviour.rb#L293) + * when set with fallback_hosts_use_default + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L304) + * [uses the production default fallback hosts (#RTN17b)](./spec/shared/client_initializer_behaviour.rb#L308) + * rest_host + * when set without custom fallback hosts configured + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L319) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L323) + * when set with environment and without custom fallback hosts configured + * [sets the environment attribute](./spec/shared/client_initializer_behaviour.rb#L333) + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L337) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L341) + * when set with custom fallback hosts configured + * [sets the custom_host attribute](./spec/shared/client_initializer_behaviour.rb#L351) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L355) + * realtime_host + * when set without custom fallback hosts configured + * [sets the realtime_host option](./spec/shared/client_initializer_behaviour.rb#L368) + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L372) + * custom port + * when set without custom fallback hosts configured + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L383) + * custom TLS port + * when set without custom fallback hosts configured + * [has no default fallback hosts](./spec/shared/client_initializer_behaviour.rb#L394) * delegators - * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L277) - * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L282) + * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L408) + * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L413) * initializer options * TLS * disabled * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection (#RSA1)](./spec/unit/rest/client_spec.rb#L17) * fallback_retry_timeout (#RSC15f) @@ -4143,8 +4211,8 @@ ------- ## Test summary - * Passing tests: 2073 + * Passing tests: 2109 * Pending tests: 5 * Failing tests: 1