<testsuites name="Mocha Tests" time="1132.177" tests="1078" failures="2" skipped="39">
  <testsuite name="Root Suite" timestamp="2026-03-03T13:31:20" tests="0" time="0.000" failures="0">
  </testsuite>
  <testsuite name="realtime/annotations" timestamp="2026-03-03T13:31:20" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/annotations.test.js" time="6.871" failures="0">
    <testcase name="realtime/annotations publish and subscribe annotations" time="1.670" classname="publish and subscribe annotations">
    </testcase>
    <testcase name="realtime/annotations get all annotations rest request" time="3.775" classname="get all annotations rest request">
    </testcase>
  </testsuite>
  <testsuite name="realtime/api" timestamp="2026-03-03T13:31:27" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/api.test.js" time="0.006" failures="0">
    <testcase name="realtime/api Client constructors" time="0.000" classname="Client constructors">
    </testcase>
    <testcase name="realtime/api constructor without any arguments" time="0.001" classname="constructor without any arguments">
    </testcase>
    <testcase name="realtime/api constructor with conflict client options" time="0.002" classname="constructor with conflict client options">
    </testcase>
    <testcase name="realtime/api Crypto" time="0.000" classname="Crypto">
    </testcase>
    <testcase name="realtime/api Message" time="0.000" classname="Message">
    </testcase>
    <testcase name="realtime/api PresenceMessage" time="0.000" classname="PresenceMessage">
    </testcase>
  </testsuite>
  <testsuite name="realtime/auth" timestamp="2026-03-03T13:31:27" tests="84" file="/home/runner/work/ably-js/ably-js/test/realtime/auth.test.js" time="151.629" failures="0">
    <testcase name="realtime/auth authbase0" time="0.316" classname="authbase0">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_json" time="0.898" classname="auth_useAuthUrl_json">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_post_json" time="0.511" classname="auth_useAuthUrl_post_json">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_plainText" time="0.457" classname="auth_useAuthUrl_plainText">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenRequestResponse" time="0.462" classname="auth_useAuthCallback_tokenRequestResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenDetailsResponse" time="0.345" classname="auth_useAuthCallback_tokenDetailsResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenStringResponse" time="0.332" classname="auth_useAuthCallback_tokenStringResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_mixed_authParams_qsParams" time="0.502" classname="auth_useAuthUrl_mixed_authParams_qsParams">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance" time="0.292" classname="auth_clientid_inheritance">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance2" time="0.068" classname="auth_clientid_inheritance2">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance3" time="0.260" classname="auth_clientid_inheritance3">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance4" time="0.383" classname="auth_clientid_inheritance4">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance5" time="0.323" classname="auth_clientid_inheritance5">
    </testcase>
    <testcase name="realtime/auth authCallback_error" time="0.002" classname="authCallback_error">
    </testcase>
    <testcase name="realtime/auth authCallback_timeout" time="0.101" classname="authCallback_timeout">
    </testcase>
    <testcase name="realtime/auth authCallback_nothing" time="0.000" classname="authCallback_nothing">
    </testcase>
    <testcase name="realtime/auth authCallback_malformed" time="0.000" classname="authCallback_malformed">
    </testcase>
    <testcase name="realtime/auth authCallback_too_long_string" time="0.010" classname="authCallback_too_long_string">
    </testcase>
    <testcase name="realtime/auth authCallback_empty_string" time="0.001" classname="authCallback_empty_string">
    </testcase>
    <testcase name="realtime/auth authUrl_timeout" time="0.101" classname="authUrl_timeout">
    </testcase>
    <testcase name="realtime/auth authUrl_404" time="0.024" classname="authUrl_404">
    </testcase>
    <testcase name="realtime/auth authUrl_wrong_content_type" time="0.009" classname="authUrl_wrong_content_type">
    </testcase>
    <testcase name="realtime/auth authUrl_401" time="0.132" classname="authUrl_401">
    </testcase>
    <testcase name="realtime/auth authUrl_double_encoded" time="0.131" classname="authUrl_double_encoded">
    </testcase>
    <testcase name="realtime/auth authUrl_403" time="0.131" classname="authUrl_403">
    </testcase>
    <testcase name="realtime/auth authUrl_403_custom_error" time="0.131" classname="authUrl_403_custom_error">
    </testcase>
    <testcase name="realtime/auth authUrl_403_previously_active" time="0.583" classname="authUrl_403_previously_active">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with web_socket binary protocol" time="5.032" classname="auth_token_expires with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with web_socket text protocol" time="5.032" classname="auth_token_expires with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with comet binary protocol" time="5.033" classname="auth_token_expires with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with comet text protocol" time="5.034" classname="auth_token_expires with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with binary protocol" time="5.033" classname="auth_token_expires with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with text protocol" time="5.031" classname="auth_token_expires with text protocol">
    </testcase>
    <testcase name="realtime/auth auth_query_time_once" time="0.066" classname="auth_query_time_once">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with web_socket binary protocol" time="5.291" classname="auth_tokenDetails_expiry_with_authcallback with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with web_socket text protocol" time="5.291" classname="auth_tokenDetails_expiry_with_authcallback with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with comet binary protocol" time="5.175" classname="auth_tokenDetails_expiry_with_authcallback with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with comet text protocol" time="5.186" classname="auth_tokenDetails_expiry_with_authcallback with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with binary protocol" time="5.304" classname="auth_tokenDetails_expiry_with_authcallback with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with text protocol" time="5.296" classname="auth_tokenDetails_expiry_with_authcallback with text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with web_socket binary protocol" time="5.364" classname="auth_token_string_expiry_with_authcallback with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with web_socket text protocol" time="5.291" classname="auth_token_string_expiry_with_authcallback with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with comet binary protocol" time="5.174" classname="auth_token_string_expiry_with_authcallback with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with comet text protocol" time="5.175" classname="auth_token_string_expiry_with_authcallback with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with binary protocol" time="5.290" classname="auth_token_string_expiry_with_authcallback with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with text protocol" time="5.293" classname="auth_token_string_expiry_with_authcallback with text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with web_socket binary protocol" time="5.032" classname="auth_token_string_expiry_with_token with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with web_socket text protocol" time="5.031" classname="auth_token_string_expiry_with_token with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with comet binary protocol" time="5.034" classname="auth_token_string_expiry_with_token with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with comet text protocol" time="5.032" classname="auth_token_string_expiry_with_token with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with binary protocol" time="5.032" classname="auth_token_string_expiry_with_token with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_token with text protocol" time="5.030" classname="auth_token_string_expiry_with_token with text protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with web_socket binary protocol" time="0.439" classname="auth_expired_token_string with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with web_socket text protocol" time="0.363" classname="auth_expired_token_string with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with comet binary protocol" time="0.243" classname="auth_expired_token_string with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with comet text protocol" time="0.241" classname="auth_expired_token_string with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with binary protocol" time="0.370" classname="auth_expired_token_string with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with text protocol" time="0.363" classname="auth_expired_token_string with text protocol">
    </testcase>
    <testcase name="realtime/auth authorize_updates_stored_details" time="0.001" classname="authorize_updates_stored_details">
    </testcase>
    <testcase name="realtime/auth mocked_reauth" time="0.388" classname="mocked_reauth">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_clientid" time="0.601" classname="auth_jwt_with_clientid">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_clientid_application_jwt" time="0.324" classname="auth_jwt_with_clientid_application_jwt">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_subscribe_only_capability" time="0.414" classname="auth_jwt_with_subscribe_only_capability">
    </testcase>
    <testcase name="realtime/auth realtime client mirrors the auth clientId" time="0.324" classname="realtime client mirrors the auth clientId">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_publish_capability" time="0.393" classname="auth_jwt_with_publish_capability">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_token_that_expires" time="4.400" classname="auth_jwt_with_token_that_expires">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_token_that_renews" time="5.192" classname="auth_jwt_with_token_that_renews">
    </testcase>
    <testcase name="realtime/auth init_client_with_simple_jwt_token" time="0.325" classname="init_client_with_simple_jwt_token">
    </testcase>
    <testcase name="realtime/auth reauth_consistently_expired_token" time="3.170" classname="reauth_consistently_expired_token">
    </testcase>
    <testcase name="realtime/auth expired_token_no_autoremove_when_dont_have_servertime" time="0.323" classname="expired_token_no_autoremove_when_dont_have_servertime">
    </testcase>
    <testcase name="realtime/auth expired_token_autoremove_when_have_servertime" time="0.385" classname="expired_token_autoremove_when_have_servertime">
    </testcase>
    <testcase name="realtime/auth multiple_concurrent_authorize" time="0.668" classname="multiple_concurrent_authorize">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with web_socket binary protocol" time="0.380" classname="authorize_immediately_after_init with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with web_socket text protocol" time="0.382" classname="authorize_immediately_after_init with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with comet binary protocol" time="0.383" classname="authorize_immediately_after_init with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with comet text protocol" time="0.387" classname="authorize_immediately_after_init with comet text protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with binary protocol" time="0.393" classname="authorize_immediately_after_init with binary protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with text protocol" time="0.386" classname="authorize_immediately_after_init with text protocol">
    </testcase>
  </testsuite>
  <testsuite name="realtime/channel" timestamp="2026-03-03T13:33:59" tests="124" file="/home/runner/work/ably-js/ably-js/test/realtime/channel.test.js" time="95.780" failures="0">
    <testcase name="realtime/channel channelinit0 with web_socket binary protocol" time="0.253" classname="channelinit0 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with web_socket text protocol" time="0.268" classname="channelinit0 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with comet binary protocol" time="0.074" classname="channelinit0 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with comet text protocol" time="0.075" classname="channelinit0 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with binary protocol" time="0.255" classname="channelinit0 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with text protocol" time="0.255" classname="channelinit0 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with web_socket binary protocol" time="0.323" classname="channelattach0 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with web_socket text protocol" time="0.317" classname="channelattach0 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with comet binary protocol" time="0.151" classname="channelattach0 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with comet text protocol" time="0.146" classname="channelattach0 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with binary protocol" time="0.313" classname="channelattach0 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with text protocol" time="0.325" classname="channelattach0 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with web_socket binary protocol" time="0.357" classname="channelattach2 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with web_socket text protocol" time="0.328" classname="channelattach2 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with comet binary protocol" time="0.162" classname="channelattach2 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with comet text protocol" time="0.148" classname="channelattach2 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with binary protocol" time="0.315" classname="channelattach2 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with text protocol" time="0.314" classname="channelattach2 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with web_socket binary protocol" time="1.317" classname="channelattachempty with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with web_socket text protocol" time="1.326" classname="channelattachempty with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with comet binary protocol" time="1.149" classname="channelattachempty with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with comet text protocol" time="1.146" classname="channelattachempty with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with binary protocol" time="1.315" classname="channelattachempty with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with text protocol" time="1.318" classname="channelattachempty with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with web_socket binary protocol" time="1.318" classname="channelattachinvalid with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with web_socket text protocol" time="1.317" classname="channelattachinvalid with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with comet binary protocol" time="1.151" classname="channelattachinvalid with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with comet text protocol" time="1.146" classname="channelattachinvalid with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with binary protocol" time="1.326" classname="channelattachinvalid with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with text protocol" time="1.325" classname="channelattachinvalid with text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with web_socket binary protocol" time="0.323" classname="publish_no_attach with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with web_socket text protocol" time="0.356" classname="publish_no_attach with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with comet binary protocol" time="0.148" classname="publish_no_attach with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with comet text protocol" time="0.156" classname="publish_no_attach with comet text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with binary protocol" time="0.332" classname="publish_no_attach with binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with text protocol" time="0.326" classname="publish_no_attach with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with web_socket binary protocol" time="0.319" classname="channelattach_publish_invalid with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with web_socket text protocol" time="0.318" classname="channelattach_publish_invalid with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with comet binary protocol" time="0.219" classname="channelattach_publish_invalid with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with comet text protocol" time="0.222" classname="channelattach_publish_invalid with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with binary protocol" time="0.318" classname="channelattach_publish_invalid with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with text protocol" time="0.320" classname="channelattach_publish_invalid with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with web_socket binary protocol" time="1.380" classname="channelattach_invalid_twice with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with web_socket text protocol" time="1.382" classname="channelattach_invalid_twice with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with comet binary protocol" time="1.213" classname="channelattach_invalid_twice with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with comet text protocol" time="1.221" classname="channelattach_invalid_twice with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with binary protocol" time="1.380" classname="channelattach_invalid_twice with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with text protocol" time="1.389" classname="channelattach_invalid_twice with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachWhenState" time="0.319" classname="channelattachWhenState">
    </testcase>
    <testcase name="realtime/channel channelattachOnceOrIfBefore" time="0.326" classname="channelattachOnceOrIfBefore">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with web_socket binary protocol" time="1.595" classname="attachWithChannelParamsBasicChannelsGet with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with web_socket text protocol" time="1.578" classname="attachWithChannelParamsBasicChannelsGet with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet binary protocol" time="1.409" classname="attachWithChannelParamsBasicChannelsGet with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet text protocol" time="1.408" classname="attachWithChannelParamsBasicChannelsGet with comet text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with binary protocol" time="1.589" classname="attachWithChannelParamsBasicChannelsGet with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with text protocol" time="1.585" classname="attachWithChannelParamsBasicChannelsGet with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with web_socket binary protocol" time="1.581" classname="attachWithChannelParamsBasicSetOptions with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with web_socket text protocol" time="1.579" classname="attachWithChannelParamsBasicSetOptions with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet binary protocol" time="1.410" classname="attachWithChannelParamsBasicSetOptions with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet text protocol" time="1.527" classname="attachWithChannelParamsBasicSetOptions with comet text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with binary protocol" time="1.620" classname="attachWithChannelParamsBasicSetOptions with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with text protocol" time="1.583" classname="attachWithChannelParamsBasicSetOptions with text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with web_socket binary protocol" time="0.326" classname="subscribeAfterSetOptions with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with web_socket text protocol" time="0.318" classname="subscribeAfterSetOptions with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with comet binary protocol" time="0.221" classname="subscribeAfterSetOptions with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with comet text protocol" time="0.230" classname="subscribeAfterSetOptions with comet text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with binary protocol" time="0.338" classname="subscribeAfterSetOptions with binary protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with text protocol" time="0.319" classname="subscribeAfterSetOptions with text protocol">
    </testcase>
    <testcase name="realtime/channel channelGetShouldThrowWhenWouldCauseReattach" time="0.346" classname="channelGetShouldThrowWhenWouldCauseReattach">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with web_socket binary protocol" time="0.454" classname="setOptionsCallbackBehaviour with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with web_socket text protocol" time="0.448" classname="setOptionsCallbackBehaviour with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with comet binary protocol" time="0.286" classname="setOptionsCallbackBehaviour with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with comet text protocol" time="0.284" classname="setOptionsCallbackBehaviour with comet text protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with binary protocol" time="0.452" classname="setOptionsCallbackBehaviour with binary protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with text protocol" time="0.436" classname="setOptionsCallbackBehaviour with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with web_socket binary protocol" time="1.797" classname="attachWithChannelParamsModesAndChannelModes with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with web_socket text protocol" time="1.759" classname="attachWithChannelParamsModesAndChannelModes with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with comet binary protocol" time="1.664" classname="attachWithChannelParamsModesAndChannelModes with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with comet text protocol" time="1.681" classname="attachWithChannelParamsModesAndChannelModes with comet text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with binary protocol" time="1.779" classname="attachWithChannelParamsModesAndChannelModes with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsModesAndChannelModes with text protocol" time="1.885" classname="attachWithChannelParamsModesAndChannelModes with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with web_socket binary protocol" time="1.771" classname="attachWithChannelModes with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with web_socket text protocol" time="1.771" classname="attachWithChannelModes with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with comet binary protocol" time="1.606" classname="attachWithChannelModes with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with comet text protocol" time="1.616" classname="attachWithChannelModes with comet text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with binary protocol" time="1.771" classname="attachWithChannelModes with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelModes with text protocol" time="1.774" classname="attachWithChannelModes with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with web_socket binary protocol" time="0.882" classname="attachWithChannelParamsDeltaAndModes with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with web_socket text protocol" time="0.828" classname="attachWithChannelParamsDeltaAndModes with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with comet binary protocol" time="0.800" classname="attachWithChannelParamsDeltaAndModes with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with comet text protocol" time="0.790" classname="attachWithChannelParamsDeltaAndModes with comet text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with binary protocol" time="0.826" classname="attachWithChannelParamsDeltaAndModes with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsDeltaAndModes with text protocol" time="0.881" classname="attachWithChannelParamsDeltaAndModes with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithInvalidChannelParams" time="0.405" classname="attachWithInvalidChannelParams">
    </testcase>
    <testcase name="realtime/channel channelsubscribe0" time="1.388" classname="channelsubscribe0">
    </testcase>
    <testcase name="realtime/channel channelsubscribe1" time="1.903" classname="channelsubscribe1">
    </testcase>
    <testcase name="realtime/channel server_sent_detached" time="0.439" classname="server_sent_detached">
    </testcase>
    <testcase name="realtime/channel server_sent_detached_while_attaching" time="0.254" classname="server_sent_detached_while_attaching">
    </testcase>
    <testcase name="realtime/channel server_sent_error" time="0.335" classname="server_sent_error">
    </testcase>
    <testcase name="realtime/channel server_sent_attached_err" time="0.327" classname="server_sent_attached_err">
    </testcase>
    <testcase name="realtime/channel publish_no_queueing" time="0.002" classname="publish_no_queueing">
    </testcase>
    <testcase name="realtime/channel channel_attach_timeout" time="2.343" classname="channel_attach_timeout">
    </testcase>
    <testcase name="realtime/channel suspended_connection" time="3.633" classname="suspended_connection">
    </testcase>
    <testcase name="realtime/channel attached_while_detaching" time="0.330" classname="attached_while_detaching">
    </testcase>
    <testcase name="realtime/channel detaching from suspended channel transitions channel to detached state" time="0.001" classname="detaching from suspended channel transitions channel to detached state">
    </testcase>
    <testcase name="realtime/channel detaching when connection is not connected immediately transitions channel to detached" time="0.258" classname="detaching when connection is not connected immediately transitions channel to detached">
    </testcase>
    <testcase name="realtime/channel detaching from failed channel results in error" time="0.001" classname="detaching from failed channel results in error">
    </testcase>
    <testcase name="realtime/channel rewind works on channel after reattaching" time="0.542" classname="rewind works on channel after reattaching">
    </testcase>
    <testcase name="realtime/channel attach_returns_state_change" time="0.323" classname="attach_returns_state_change">
    </testcase>
    <testcase name="realtime/channel subscribe_returns_state_change" time="0.319" classname="subscribe_returns_state_change">
    </testcase>
    <testcase name="realtime/channel rewind_has_backlog_0" time="0.408" classname="rewind_has_backlog_0">
    </testcase>
    <testcase name="realtime/channel rewind_has_backlog_1" time="0.321" classname="rewind_has_backlog_1">
    </testcase>
    <testcase name="realtime/channel should not throw exception then run RealtimeChannels.get() with same options" time="0.002" classname="should not throw exception then run RealtimeChannels.get() with same options">
    </testcase>
    <testcase name="realtime/channel whenState" time="0.331" classname="whenState">
    </testcase>
    <testcase name="realtime/channel set channelSerial field for ATTACH ProtocolMessage if available" time="0.579" classname="set channelSerial field for ATTACH ProtocolMessage if available">
    </testcase>
    <testcase name="realtime/channel channel.properties.channelSerial is updated with channelSerial from latest message" time="0.263" classname="channel.properties.channelSerial is updated with channelSerial from latest message">
    </testcase>
    <testcase name="realtime/channel attach resolves even if channel.off() is called while attaching" time="0.321" classname="attach resolves even if channel.off() is called while attaching">
    </testcase>
    <testcase name="realtime/channel detach resolves even if channel.off() is called while detaching" time="0.389" classname="detach resolves even if channel.off() is called while detaching">
    </testcase>
  </testsuite>
  <testsuite name="realtime/connection" timestamp="2026-03-03T13:35:35" tests="8" file="/home/runner/work/ably-js/ably-js/test/realtime/connection.test.js" time="2.726" failures="0">
    <testcase name="realtime/connection connectionPing" time="0.255" classname="connectionPing">
    </testcase>
    <testcase name="realtime/connection connectionPingWithCallback" time="0.315" classname="connectionPingWithCallback">
    </testcase>
    <testcase name="realtime/connection connectionAttributes" time="0.329" classname="connectionAttributes">
    </testcase>
    <testcase name="realtime/connection unrecoverableConnection" time="0.262" classname="unrecoverableConnection">
    </testcase>
    <testcase name="realtime/connection connectionQueuing" time="0.580" classname="connectionQueuing">
    </testcase>
    <testcase name="realtime/connection connectionDetails" time="0.260" classname="connectionDetails">
    </testcase>
    <testcase name="realtime/connection stale_connection_resets_msgSerial_and_sendAttempted" time="0.461" classname="stale_connection_resets_msgSerial_and_sendAttempted">
    </testcase>
    <testcase name="realtime/connection whenState" time="0.262" classname="whenState">
    </testcase>
  </testsuite>
  <testsuite name="realtime/connectivity" timestamp="2026-03-03T13:35:37" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/connectivity.test.js" time="0.000" failures="0">
    <testcase name="realtime/connectivity http_connectivity_check" time="0.018" classname="http_connectivity_check">
    </testcase>
    <testcase name="realtime/connectivity disable_connectivity_check" time="0.000" classname="disable_connectivity_check">
    </testcase>
  </testsuite>
  <testsuite name="configured_connectivity_check_url" timestamp="2026-03-03T13:35:37" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/connectivity.test.js" time="1.012" failures="0">
    <testcase name="realtime/connectivity configured_connectivity_check_url succeeds with scheme" time="0.417" classname="succeeds with scheme">
    </testcase>
    <testcase name="realtime/connectivity configured_connectivity_check_url fails with scheme" time="0.132" classname="fails with scheme">
    </testcase>
    <testcase name="realtime/connectivity configured_connectivity_check_url succeeds with querystring" time="0.132" classname="succeeds with querystring">
    </testcase>
    <testcase name="realtime/connectivity configured_connectivity_check_url fails with querystring" time="0.132" classname="fails with querystring">
    </testcase>
    <testcase name="realtime/connectivity configured_connectivity_check_url succeeds with plain url" time="0.064" classname="succeeds with plain url">
    </testcase>
    <testcase name="realtime/connectivity configured_connectivity_check_url fails with plain url" time="0.132" classname="fails with plain url">
    </testcase>
  </testsuite>
  <testsuite name="realtime/crypto" timestamp="2026-03-03T13:35:38" tests="40" file="/home/runner/work/ably-js/ably-js/test/realtime/crypto.test.js" time="13.907" failures="0">
    <testcase name="realtime/crypto generateRandomKey0" time="0.000" classname="generateRandomKey0">
    </testcase>
    <testcase name="realtime/crypto generateRandomKey1" time="0.000" classname="generateRandomKey1">
    </testcase>
    <testcase name="realtime/crypto getDefaultParams_withResultOfGenerateRandomKey" time="0.000" classname="getDefaultParams_withResultOfGenerateRandomKey">
    </testcase>
    <testcase name="realtime/crypto getDefaultParams_ArrayBuffer_key" time="0.001" classname="getDefaultParams_ArrayBuffer_key">
    </testcase>
    <testcase name="realtime/crypto getDefaultParams_base64_key" time="0.000" classname="getDefaultParams_base64_key">
    </testcase>
    <testcase name="realtime/crypto getDefaultParams_check_keylength" time="0.000" classname="getDefaultParams_check_keylength">
    </testcase>
    <testcase name="realtime/crypto getDefaultParams_preserves_custom_algorithms" time="0.000" classname="getDefaultParams_preserves_custom_algorithms">
    </testcase>
    <testcase name="realtime/crypto encrypt_message_128" time="0.005" classname="encrypt_message_128">
    </testcase>
    <testcase name="realtime/crypto encrypt_message_256" time="0.028" classname="encrypt_message_256">
    </testcase>
    <testcase name="realtime/crypto decrypt_message_128" time="0.002" classname="decrypt_message_128">
    </testcase>
    <testcase name="realtime/crypto decrypt_message_256" time="0.013" classname="decrypt_message_256">
    </testcase>
    <testcase name="realtime/crypto fromEncoded_cipher_options" time="0.006" classname="fromEncoded_cipher_options">
    </testcase>
    <testcase name="realtime/crypto msgpack_128" time="0.004" classname="msgpack_128">
    </testcase>
    <testcase name="realtime/crypto msgpack_256" time="0.041" classname="msgpack_256">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with web_socket binary protocol" time="0.383" classname="single_send_128 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with web_socket text protocol" time="0.386" classname="single_send_128 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with comet binary protocol" time="0.216" classname="single_send_128 with comet binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with comet text protocol" time="0.217" classname="single_send_128 with comet text protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with binary protocol" time="0.376" classname="single_send_128 with binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_128 with text protocol" time="0.383" classname="single_send_128 with text protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with web_socket binary protocol" time="0.379" classname="single_send_256 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with web_socket text protocol" time="0.380" classname="single_send_256 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with comet binary protocol" time="0.215" classname="single_send_256 with comet binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with comet text protocol" time="0.225" classname="single_send_256 with comet text protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with binary protocol" time="0.379" classname="single_send_256 with binary protocol">
    </testcase>
    <testcase name="realtime/crypto single_send_256 with text protocol" time="0.379" classname="single_send_256 with text protocol">
    </testcase>
    <testcase name="realtime/crypto multiple_send_binary_2_200" time="0.586" classname="multiple_send_binary_2_200">
    </testcase>
    <testcase name="realtime/crypto multiple_send_text_2_200" time="0.597" classname="multiple_send_text_2_200">
    </testcase>
    <testcase name="realtime/crypto multiple_send_binary_20_100" time="2.288" classname="multiple_send_binary_20_100">
    </testcase>
    <testcase name="realtime/crypto multiple_send_text_20_100" time="2.301" classname="multiple_send_text_20_100">
    </testcase>
    <testcase name="realtime/crypto multiple_send_binary_10_10" time="0.497" classname="multiple_send_binary_10_10">
    </testcase>
    <testcase name="realtime/crypto multiple_send_text_10_10" time="0.536" classname="multiple_send_text_10_10">
    </testcase>
    <testcase name="realtime/crypto single_send_binary_text" time="0.393" classname="single_send_binary_text">
    </testcase>
    <testcase name="realtime/crypto single_send_text_binary" time="0.386" classname="single_send_text_binary">
    </testcase>
    <testcase name="realtime/crypto publish_immediately" time="0.392" classname="publish_immediately">
    </testcase>
    <testcase name="realtime/crypto encrypted history" time="0.156" classname="encrypted history">
    </testcase>
    <testcase name="realtime/crypto single_send_key_mismatch" time="0.419" classname="single_send_key_mismatch">
    </testcase>
    <testcase name="realtime/crypto single_send_unencrypted" time="0.395" classname="single_send_unencrypted">
    </testcase>
    <testcase name="realtime/crypto single_send_encrypted_unhandled" time="0.388" classname="single_send_encrypted_unhandled">
    </testcase>
    <testcase name="realtime/crypto set_cipher_params0" time="0.529" classname="set_cipher_params0">
    </testcase>
  </testsuite>
  <testsuite name="realtime/delta" timestamp="2026-03-03T13:35:52" tests="5" file="/home/runner/work/ably-js/ably-js/test/realtime/delta.test.js" time="8.362" failures="0">
    <testcase name="realtime/delta deltaPlugin" time="1.951" classname="deltaPlugin">
    </testcase>
    <testcase name="realtime/delta unusedPlugin" time="1.952" classname="unusedPlugin">
    </testcase>
    <testcase name="realtime/delta lastMessageNotFoundRecovery" time="1.967" classname="lastMessageNotFoundRecovery">
    </testcase>
    <testcase name="realtime/delta deltaDecodeFailureRecovery" time="2.021" classname="deltaDecodeFailureRecovery">
    </testcase>
    <testcase name="realtime/delta noPlugin" time="0.467" classname="noPlugin">
    </testcase>
  </testsuite>
  <testsuite name="realtime/encoding" timestamp="2026-03-03T13:36:01" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/encoding.test.js" time="1.528" failures="0">
    <testcase name="realtime/encoding message_decoding" time="0.546" classname="message_decoding">
    </testcase>
    <testcase name="realtime/encoding message_encoding" time="0.981" classname="message_encoding">
    </testcase>
  </testsuite>
  <testsuite name="realtime/event_emitter" timestamp="2026-03-03T13:36:02" tests="13" file="/home/runner/work/ably-js/ably-js/test/realtime/event_emitter.test.js" time="0.000" failures="0">
    <testcase name="realtime/event_emitter attachdetach0" time="0.349" classname="attachdetach0">
    </testcase>
    <testcase name="realtime/event_emitter emitCallsAllCallbacksIgnoringExceptions" time="0.001" classname="emitCallsAllCallbacksIgnoringExceptions">
    </testcase>
    <testcase name="realtime/event_emitter onceCalledOnlyOnce" time="0.001" classname="onceCalledOnlyOnce">
    </testcase>
    <testcase name="realtime/event_emitter onceCallbackDoesNotImpactOnCallback" time="0.000" classname="onceCallbackDoesNotImpactOnCallback">
    </testcase>
    <testcase name="realtime/event_emitter offRemovesAllMatchingListeners" time="0.000" classname="offRemovesAllMatchingListeners">
    </testcase>
    <testcase name="realtime/event_emitter offRemovesAllListeners" time="0.000" classname="offRemovesAllListeners">
    </testcase>
    <testcase name="realtime/event_emitter offRemovesAllMatchingEventListeners" time="0.000" classname="offRemovesAllMatchingEventListeners">
    </testcase>
    <testcase name="realtime/event_emitter offRemovesAllMatchingEvents" time="0.001" classname="offRemovesAllMatchingEvents">
    </testcase>
    <testcase name="realtime/event_emitter offRemovesEmptyEventNameListeners" time="0.000" classname="offRemovesEmptyEventNameListeners">
    </testcase>
    <testcase name="realtime/event_emitter arrayOfEvents" time="0.000" classname="arrayOfEvents">
    </testcase>
    <testcase name="realtime/event_emitter arrayOfEventsWithOnce" time="0.001" classname="arrayOfEventsWithOnce">
    </testcase>
    <testcase name="realtime/event_emitter listenerAddedInListenerCb" time="0.000" classname="listenerAddedInListenerCb">
    </testcase>
    <testcase name="realtime/event_emitter listenerRemovedInListenerCb" time="0.000" classname="listenerRemovedInListenerCb">
    </testcase>
  </testsuite>
  <testsuite name="event_emitter_promise" timestamp="2026-03-03T13:36:03" tests="4" file="/home/runner/work/ably-js/ably-js/test/realtime/event_emitter.test.js" time="0.518" failures="0">
    <testcase name="realtime/event_emitter event_emitter_promise whenState" time="0.261" classname="whenState">
    </testcase>
    <testcase name="realtime/event_emitter event_emitter_promise once" time="0.254" classname="once">
    </testcase>
    <testcase name="realtime/event_emitter event_emitter_promise anyEventsWithOnce" time="0.001" classname="anyEventsWithOnce">
    </testcase>
    <testcase name="realtime/event_emitter event_emitter_promise arrayOfEventsWithOnce" time="0.001" classname="arrayOfEventsWithOnce">
    </testcase>
  </testsuite>
  <testsuite name="realtime/failure" timestamp="2026-03-03T13:36:03" tests="23" file="/home/runner/work/ably-js/ably-js/test/realtime/failure.test.js" time="28.068" failures="0">
    <testcase name="realtime/failure invalid_cred_failure" time="0.197" classname="invalid_cred_failure">
    </testcase>
    <testcase name="realtime/failure break_transport" time="0.262" classname="break_transport">
    </testcase>
    <testcase name="realtime/failure no_connection_lifecycle" time="4.802" classname="no_connection_lifecycle">
    </testcase>
    <testcase name="realtime/failure disconnected_backoff_web_socket" time="1.147" classname="disconnected_backoff_web_socket">
    </testcase>
    <testcase name="realtime/failure disconnected_backoff_comet" time="1.137" classname="disconnected_backoff_comet">
    </testcase>
    <testcase name="realtime/failure failed_channel" time="0.325" classname="failed_channel">
    </testcase>
    <testcase name="realtime/failure attach_timeout" time="3.190" classname="attach_timeout">
    </testcase>
    <testcase name="realtime/failure channel_backoff_web_socket" time="1.616" classname="channel_backoff_web_socket">
    </testcase>
    <testcase name="realtime/failure channel_backoff_comet" time="1.472" classname="channel_backoff_comet">
    </testcase>
    <testcase name="realtime/failure nack_of_sent_message_on_connection_suspended" time="0.267" classname="nack_of_sent_message_on_connection_suspended">
    </testcase>
    <testcase name="realtime/failure nack_of_sent_message_on_connection_failed" time="0.261" classname="nack_of_sent_message_on_connection_failed">
    </testcase>
    <testcase name="realtime/failure nack_of_sent_message_on_connection_closed" time="0.252" classname="nack_of_sent_message_on_connection_closed">
    </testcase>
    <testcase name="realtime/failure nack_of_queued_message_on_connection_suspended" time="0.001" classname="nack_of_queued_message_on_connection_suspended">
    </testcase>
    <testcase name="realtime/failure nack_of_queued_message_on_connection_failed" time="0.001" classname="nack_of_queued_message_on_connection_failed">
    </testcase>
    <testcase name="realtime/failure nack_of_queued_message_on_connection_closed" time="0.001" classname="nack_of_queued_message_on_connection_closed">
    </testcase>
    <testcase name="realtime/failure idle_transport_timeout" time="2.393" classname="idle_transport_timeout">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with web_socket binary protocol" time="0.604" classname="try_fallback_hosts_on_placement_constraint with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with web_socket text protocol" time="0.603" classname="try_fallback_hosts_on_placement_constraint with web_socket text protocol">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with comet binary protocol" time="0.490" classname="try_fallback_hosts_on_placement_constraint with comet binary protocol">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with comet text protocol" time="0.479" classname="try_fallback_hosts_on_placement_constraint with comet text protocol">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with binary protocol" time="0.602" classname="try_fallback_hosts_on_placement_constraint with binary protocol">
    </testcase>
    <testcase name="realtime/failure try_fallback_hosts_on_placement_constraint with text protocol" time="0.622" classname="try_fallback_hosts_on_placement_constraint with text protocol">
    </testcase>
    <testcase name="realtime/failure no_messages_if_not_attached" time="7.327" classname="no_messages_if_not_attached">
    </testcase>
  </testsuite>
  <testsuite name="realtime/history" timestamp="2026-03-03T13:36:31" tests="1" file="/home/runner/work/ably-js/ably-js/test/realtime/history.test.js" time="0.618" failures="0">
    <testcase name="realtime/history history_until_attach" time="0.618" classname="history_until_attach">
    </testcase>
  </testsuite>
  <testsuite name="realtime/init" timestamp="2026-03-03T13:36:32" tests="15" file="/home/runner/work/ably-js/ably-js/test/realtime/init.test.js" time="2.696" failures="0">
    <testcase name="realtime/init initbase0" time="0.267" classname="initbase0">
    </testcase>
    <testcase name="realtime/init init_key_string" time="0.001" classname="init_key_string">
    </testcase>
    <testcase name="realtime/init init_token_string" time="0.197" classname="init_token_string">
    </testcase>
    <testcase name="realtime/init init_key_with_usetokenauth" time="0.332" classname="init_key_with_usetokenauth">
    </testcase>
    <testcase name="realtime/init init_usetokenauth_defaulttokenparams_wildcard" time="0.319" classname="init_usetokenauth_defaulttokenparams_wildcard">
    </testcase>
    <testcase name="realtime/init init_defaulttokenparams_nonwildcard" time="0.330" classname="init_defaulttokenparams_nonwildcard">
    </testcase>
    <testcase name="realtime/init init_conflicting_clientids" time="0.331" classname="init_conflicting_clientids">
    </testcase>
    <testcase name="realtime/init init_with_usetokenauth_false_and_a_clientid" time="0.000" classname="init_with_usetokenauth_false_and_a_clientid">
    </testcase>
    <testcase name="realtime/init init_primary_domain" time="0.001" classname="init_primary_domain">
    </testcase>
    <testcase name="realtime/init init_timeouts" time="0.000" classname="init_timeouts">
    </testcase>
    <testcase name="realtime/init init_fallbacks" time="0.020" classname="init_fallbacks">
    </testcase>
    <testcase name="realtime/init node_transports" time="0.001" classname="node_transports">
    </testcase>
    <testcase name="realtime/init init_and_connection_details" time="0.345" classname="init_and_connection_details">
    </testcase>
    <testcase name="realtime/init init_fallbacks_once_connected" time="0.254" classname="init_fallbacks_once_connected">
    </testcase>
    <testcase name="realtime/init init_fallbacks_once_connected_2" time="0.291" classname="init_fallbacks_once_connected_2">
    </testcase>
  </testsuite>
  <testsuite name="realtime/liveobjects" timestamp="2026-03-03T13:36:35" tests="1" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="0.000" failures="0">
    <testcase name="realtime/liveobjects can attach to channel with object modes" time="0.318" classname="can attach to channel with object modes">
    </testcase>
  </testsuite>
  <testsuite name="Realtime without LiveObjects plugin" timestamp="2026-03-03T13:36:36" tests="3" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="1.281" failures="0">
    <testcase name="realtime/liveobjects Realtime without LiveObjects plugin throws an error when attempting to access the channel&apos;s `object` property" time="0.001" classname="throws an error when attempting to access the channel&apos;s `object` property">
    </testcase>
    <testcase name="realtime/liveobjects Realtime without LiveObjects plugin doesn&apos;t break when it receives an OBJECT ProtocolMessage" time="0.635" classname="doesn&apos;t break when it receives an OBJECT ProtocolMessage">
    </testcase>
    <testcase name="realtime/liveobjects Realtime without LiveObjects plugin doesn&apos;t break when it receives an OBJECT_SYNC ProtocolMessage" time="0.644" classname="doesn&apos;t break when it receives an OBJECT_SYNC ProtocolMessage">
    </testcase>
  </testsuite>
  <testsuite name="Realtime with LiveObjects plugin" timestamp="2026-03-03T13:36:37" tests="331" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="0.000" failures="0">
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin returns RealtimeObject class instance when accessing channel&apos;s `object` property" time="0.001" classname="returns RealtimeObject class instance when accessing channel&apos;s `object` property">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() returns LiveObject with id &quot;root&quot;" time="0.326" classname="RealtimeObject.get() returns LiveObject with id &quot;root&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() returns empty root when no objects exist on a channel" time="0.317" classname="RealtimeObject.get() returns empty root when no objects exist on a channel">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() waits for initial OBJECT_SYNC to be completed before resolving" time="0.317" classname="RealtimeObject.get() waits for initial OBJECT_SYNC to be completed before resolving">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() resolves immediately when OBJECT_SYNC sequence is completed" time="0.329" classname="RealtimeObject.get() resolves immediately when OBJECT_SYNC sequence is completed">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() waits for OBJECT_SYNC with empty cursor before resolving" time="0.320" classname="RealtimeObject.get() waits for OBJECT_SYNC with empty cursor before resolving">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() on unattached channel implicitly attaches and waits for sync" time="0.328" classname="RealtimeObject.get() on unattached channel implicitly attaches and waits for sync">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin on ATTACHED without HAS_OBJECTS clears local state" time="1.087" classname="on ATTACHED without HAS_OBJECTS clears local state">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with web_socket binary protocol" time="0.483" classname="OBJECT_SYNC sequence builds object tree on channel attachment with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with web_socket text protocol" time="0.474" classname="OBJECT_SYNC sequence builds object tree on channel attachment with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with comet binary protocol" time="0.979" classname="OBJECT_SYNC sequence builds object tree on channel attachment with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with comet text protocol" time="0.951" classname="OBJECT_SYNC sequence builds object tree on channel attachment with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with binary protocol" time="0.607" classname="OBJECT_SYNC sequence builds object tree on channel attachment with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree on channel attachment with text protocol" time="1.076" classname="OBJECT_SYNC sequence builds object tree on channel attachment with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with web_socket binary protocol" time="2.785" classname="OBJECT_SYNC sequence builds object tree with all operations applied with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with web_socket text protocol" time="1.946" classname="OBJECT_SYNC sequence builds object tree with all operations applied with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with comet binary protocol" time="1.716" classname="OBJECT_SYNC sequence builds object tree with all operations applied with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with comet text protocol" time="2.174" classname="OBJECT_SYNC sequence builds object tree with all operations applied with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with binary protocol" time="1.863" classname="OBJECT_SYNC sequence builds object tree with all operations applied with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence builds object tree with all operations applied with text protocol" time="1.500" classname="OBJECT_SYNC sequence builds object tree with all operations applied with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence does not change references to existing objects" time="1.168" classname="OBJECT_SYNC sequence does not change references to existing objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with web_socket binary protocol" time="1.617" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with web_socket text protocol" time="1.042" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with comet binary protocol" time="0.947" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with comet text protocol" time="0.562" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with binary protocol" time="0.626" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter is initialized with initial value from OBJECT_SYNC sequence with text protocol" time="0.558" classname="LiveCounter is initialized with initial value from OBJECT_SYNC sequence with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with web_socket binary protocol" time="0.664" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with web_socket text protocol" time="1.056" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with comet binary protocol" time="1.352" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with comet text protocol" time="0.368" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with binary protocol" time="0.643" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap is initialized with initial value from OBJECT_SYNC sequence with text protocol" time="0.597" classname="LiveMap is initialized with initial value from OBJECT_SYNC sequence with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object creates tombstoned object" time="1.251" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object creates tombstoned object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with web_socket binary protocol" time="1.149" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with web_socket text protocol" time="0.544" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with comet binary protocol" time="1.265" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with comet text protocol" time="0.964" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with binary protocol" time="1.364" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with text protocol" time="1.504" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object deletes existing object with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with web_socket binary protocol" time="0.669" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with web_socket text protocol" time="0.566" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with comet binary protocol" time="1.407" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with comet text protocol" time="0.968" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with binary protocol" time="0.678" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with text protocol" time="1.580" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object triggers subscription callback for existing object with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;" time="0.988" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;" time="1.353" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for an object sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for a map entry sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;" time="0.538" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for a map entry sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_SYNC sequence with &quot;tombstone=true&quot; for a map entry sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;" time="1.296" classname="OBJECT_SYNC sequence with &quot;tombstone=true&quot; for a map entry sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with web_socket binary protocol" time="1.367" classname="can apply MAP_CREATE with primitives object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with web_socket text protocol" time="0.691" classname="can apply MAP_CREATE with primitives object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with comet binary protocol" time="0.577" classname="can apply MAP_CREATE with primitives object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with comet text protocol" time="0.571" classname="can apply MAP_CREATE with primitives object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with binary protocol" time="0.817" classname="can apply MAP_CREATE with primitives object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with primitives object operation messages with text protocol" time="1.140" classname="can apply MAP_CREATE with primitives object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with web_socket binary protocol" time="0.818" classname="can apply MAP_CREATE with object ids object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with web_socket text protocol" time="0.840" classname="can apply MAP_CREATE with object ids object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with comet binary protocol" time="0.644" classname="can apply MAP_CREATE with object ids object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with comet text protocol" time="0.663" classname="can apply MAP_CREATE with object ids object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with binary protocol" time="1.271" classname="can apply MAP_CREATE with object ids object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_CREATE with object ids object operation messages with text protocol" time="1.247" classname="can apply MAP_CREATE with object ids object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_CREATE object operation messages are applied based on the site timeserials vector of the object" time="1.554" classname="MAP_CREATE object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin only one MAP_CREATE operation is applied for the same object ID" time="0.984" classname="only one MAP_CREATE operation is applied for the same object ID">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with web_socket binary protocol" time="1.186" classname="can apply MAP_SET with primitives object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with web_socket text protocol" time="1.422" classname="can apply MAP_SET with primitives object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with comet binary protocol" time="0.463" classname="can apply MAP_SET with primitives object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with comet text protocol" time="1.385" classname="can apply MAP_SET with primitives object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with binary protocol" time="2.721" classname="can apply MAP_SET with primitives object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with primitives object operation messages with text protocol" time="1.553" classname="can apply MAP_SET with primitives object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with web_socket binary protocol" time="0.806" classname="can apply MAP_SET with object ids object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with web_socket text protocol" time="0.694" classname="can apply MAP_SET with object ids object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with comet binary protocol" time="1.090" classname="can apply MAP_SET with object ids object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with comet text protocol" time="0.632" classname="can apply MAP_SET with object ids object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with binary protocol" time="0.808" classname="can apply MAP_SET with object ids object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_SET with object ids object operation messages with text protocol" time="0.681" classname="can apply MAP_SET with object ids object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_SET object operation messages are applied based on the site timeserials vector of the object" time="1.371" classname="MAP_SET object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with web_socket binary protocol" time="1.202" classname="can apply MAP_REMOVE object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with web_socket text protocol" time="1.230" classname="can apply MAP_REMOVE object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with comet binary protocol" time="1.520" classname="can apply MAP_REMOVE object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with comet text protocol" time="1.450" classname="can apply MAP_REMOVE object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with binary protocol" time="1.189" classname="can apply MAP_REMOVE object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply MAP_REMOVE object operation messages with text protocol" time="1.184" classname="can apply MAP_REMOVE object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_REMOVE object operation messages are applied based on the site timeserials vector of the object" time="0.995" classname="MAP_REMOVE object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_REMOVE for a map entry sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;" time="1.269" classname="MAP_REMOVE for a map entry sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_REMOVE for a map entry sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;" time="0.401" classname="MAP_REMOVE for a map entry sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with web_socket binary protocol" time="0.688" classname="can apply COUNTER_CREATE object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with web_socket text protocol" time="0.552" classname="can apply COUNTER_CREATE object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with comet binary protocol" time="1.262" classname="can apply COUNTER_CREATE object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with comet text protocol" time="1.388" classname="can apply COUNTER_CREATE object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with binary protocol" time="0.843" classname="can apply COUNTER_CREATE object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_CREATE object operation messages with text protocol" time="1.238" classname="can apply COUNTER_CREATE object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin COUNTER_CREATE object operation messages are applied based on the site timeserials vector of the object" time="0.534" classname="COUNTER_CREATE object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin only one COUNTER_CREATE operation is applied for the same object ID" time="1.350" classname="only one COUNTER_CREATE operation is applied for the same object ID">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with web_socket binary protocol" time="1.406" classname="can apply COUNTER_INC object operation messages with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with web_socket text protocol" time="1.610" classname="can apply COUNTER_INC object operation messages with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with comet binary protocol" time="1.379" classname="can apply COUNTER_INC object operation messages with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with comet text protocol" time="1.832" classname="can apply COUNTER_INC object operation messages with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with binary protocol" time="2.050" classname="can apply COUNTER_INC object operation messages with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply COUNTER_INC object operation messages with text protocol" time="1.532" classname="can apply COUNTER_INC object operation messages with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin COUNTER_INC object operation messages are applied based on the site timeserials vector of the object" time="1.402" classname="COUNTER_INC object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can apply OBJECT_DELETE object operation messages" time="1.262" classname="can apply OBJECT_DELETE object operation messages">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_DELETE for unknown object id creates zero-value tombstoned object" time="0.976" classname="OBJECT_DELETE for unknown object id creates zero-value tombstoned object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_DELETE object operation messages are applied based on the site timeserials vector of the object" time="0.400" classname="OBJECT_DELETE object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_DELETE triggers subscription callback with deleted data" time="0.675" classname="OBJECT_DELETE triggers subscription callback with deleted data">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_DELETE for an object sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;" time="1.137" classname="OBJECT_DELETE for an object sets &quot;tombstoneAt&quot; from &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin OBJECT_DELETE for an object sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;" time="1.567" classname="OBJECT_DELETE for an object sets &quot;tombstoneAt&quot; using local clock if missing &quot;serialTimestamp&quot;">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin MAP_SET with reference to a tombstoned object results in undefined value on key" time="1.507" classname="MAP_SET with reference to a tombstoned object results in undefined value on key">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin object operation message on a tombstoned object does not revive it" time="0.968" classname="object operation message on a tombstoned object does not revive it">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin object operation messages are buffered during OBJECT_SYNC sequence" time="1.010" classname="object operation messages are buffered during OBJECT_SYNC sequence">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin buffered object operation messages are applied when OBJECT_SYNC sequence ends" time="1.235" classname="buffered object operation messages are applied when OBJECT_SYNC sequence ends">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin buffered object operation messages are discarded on ATTACHED" time="0.401" classname="buffered object operation messages are discarded on ATTACHED">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin buffered object operation messages are discarded when already-attached channel receives ATTACHED with RESUMED flag" time="0.562" classname="buffered object operation messages are discarded when already-attached channel receives ATTACHED with RESUMED flag">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin buffered object operation messages are NOT discarded on new OBJECT_SYNC sequence" time="0.405" classname="buffered object operation messages are NOT discarded on new OBJECT_SYNC sequence">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin operations are buffered when OBJECT_SYNC is received after completed sync without expected preceding ATTACHED" time="0.404" classname="operations are buffered when OBJECT_SYNC is received after completed sync without expected preceding ATTACHED">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin buffered object operation messages are applied based on the site timeserials vector of the object" time="1.007" classname="buffered object operation messages are applied based on the site timeserials vector of the object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin subsequent object operation messages are applied immediately after OBJECT_SYNC ended and buffered operations are applied" time="1.565" classname="subsequent object operation messages are applied immediately after OBJECT_SYNC ended and buffered operations are applied">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with web_socket binary protocol" time="5.176" classname="LiveCounter.increment sends COUNTER_INC operation with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with web_socket text protocol" time="5.214" classname="LiveCounter.increment sends COUNTER_INC operation with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with comet binary protocol" time="5.050" classname="LiveCounter.increment sends COUNTER_INC operation with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with comet text protocol" time="5.038" classname="LiveCounter.increment sends COUNTER_INC operation with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with binary protocol" time="5.193" classname="LiveCounter.increment sends COUNTER_INC operation with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment sends COUNTER_INC operation with text protocol" time="5.176" classname="LiveCounter.increment sends COUNTER_INC operation with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.increment throws on invalid input" time="0.670" classname="LiveCounter.increment throws on invalid input">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with web_socket binary protocol" time="4.646" classname="LiveCounter.decrement sends COUNTER_INC operation with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with web_socket text protocol" time="5.234" classname="LiveCounter.decrement sends COUNTER_INC operation with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with comet binary protocol" time="4.447" classname="LiveCounter.decrement sends COUNTER_INC operation with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with comet text protocol" time="4.481" classname="LiveCounter.decrement sends COUNTER_INC operation with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with binary protocol" time="5.653" classname="LiveCounter.decrement sends COUNTER_INC operation with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement sends COUNTER_INC operation with text protocol" time="5.227" classname="LiveCounter.decrement sends COUNTER_INC operation with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.decrement throws on invalid input" time="1.441" classname="LiveCounter.decrement throws on invalid input">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with web_socket binary protocol" time="1.103" classname="LiveMap.set sends MAP_SET operation with primitive values with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with web_socket text protocol" time="0.977" classname="LiveMap.set sends MAP_SET operation with primitive values with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with comet binary protocol" time="0.807" classname="LiveMap.set sends MAP_SET operation with primitive values with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with comet text protocol" time="0.939" classname="LiveMap.set sends MAP_SET operation with primitive values with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with binary protocol" time="1.571" classname="LiveMap.set sends MAP_SET operation with primitive values with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with primitive values with text protocol" time="1.118" classname="LiveMap.set sends MAP_SET operation with primitive values with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with web_socket binary protocol" time="1.618" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with web_socket text protocol" time="1.031" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with comet binary protocol" time="1.235" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with comet text protocol" time="1.661" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with binary protocol" time="1.615" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set sends MAP_SET operation with reference to another LiveObject with text protocol" time="1.029" classname="LiveMap.set sends MAP_SET operation with reference to another LiveObject with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.set throws on invalid input" time="1.348" classname="LiveMap.set throws on invalid input">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with web_socket binary protocol" time="1.270" classname="LiveMap.remove sends MAP_REMOVE operation with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with web_socket text protocol" time="2.056" classname="LiveMap.remove sends MAP_REMOVE operation with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with comet binary protocol" time="0.946" classname="LiveMap.remove sends MAP_REMOVE operation with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with comet text protocol" time="1.553" classname="LiveMap.remove sends MAP_REMOVE operation with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with binary protocol" time="1.106" classname="LiveMap.remove sends MAP_REMOVE operation with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove sends MAP_REMOVE operation with text protocol" time="1.111" classname="LiveMap.remove sends MAP_REMOVE operation with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.remove throws on invalid input" time="1.623" classname="LiveMap.remove throws on invalid input">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() returns value type object" time="1.042" classname="LiveCounter.create() returns value type object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with web_socket binary protocol" time="0.528" classname="value type created with LiveCounter.create() can be assigned to the object tree with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with web_socket text protocol" time="1.118" classname="value type created with LiveCounter.create() can be assigned to the object tree with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with comet binary protocol" time="0.557" classname="value type created with LiveCounter.create() can be assigned to the object tree with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with comet text protocol" time="0.559" classname="value type created with LiveCounter.create() can be assigned to the object tree with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with binary protocol" time="0.670" classname="value type created with LiveCounter.create() can be assigned to the object tree with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() can be assigned to the object tree with text protocol" time="0.543" classname="value type created with LiveCounter.create() can be assigned to the object tree with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with web_socket binary protocol" time="1.038" classname="LiveCounter.create() sends COUNTER_CREATE operation with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with web_socket text protocol" time="1.665" classname="LiveCounter.create() sends COUNTER_CREATE operation with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with comet binary protocol" time="1.020" classname="LiveCounter.create() sends COUNTER_CREATE operation with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with comet text protocol" time="1.448" classname="LiveCounter.create() sends COUNTER_CREATE operation with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with binary protocol" time="1.040" classname="LiveCounter.create() sends COUNTER_CREATE operation with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveCounter.create() sends COUNTER_CREATE operation with text protocol" time="2.226" classname="LiveCounter.create() sends COUNTER_CREATE operation with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveCounter.create() with an invalid input throws when assigned to the object tree" time="0.536" classname="value type created with LiveCounter.create() with an invalid input throws when assigned to the object tree">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() returns value type object" time="1.207" classname="LiveMap.create() returns value type object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with web_socket binary protocol" time="1.123" classname="value type created with LiveMap.create() can be assigned to the object tree with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with web_socket text protocol" time="1.666" classname="value type created with LiveMap.create() can be assigned to the object tree with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with comet binary protocol" time="0.559" classname="value type created with LiveMap.create() can be assigned to the object tree with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with comet text protocol" time="1.249" classname="value type created with LiveMap.create() can be assigned to the object tree with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with binary protocol" time="1.416" classname="value type created with LiveMap.create() can be assigned to the object tree with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() can be assigned to the object tree with text protocol" time="0.531" classname="value type created with LiveMap.create() can be assigned to the object tree with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with web_socket binary protocol" time="1.126" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with web_socket text protocol" time="1.136" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with comet binary protocol" time="1.446" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with comet text protocol" time="0.896" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with binary protocol" time="0.542" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with primitive values with text protocol" time="1.996" classname="LiveMap.create() sends MAP_CREATE operation with primitive values with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with web_socket binary protocol" time="0.668" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with web_socket text protocol" time="1.099" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with comet binary protocol" time="1.514" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with comet text protocol" time="0.440" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with binary protocol" time="0.673" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with text protocol" time="0.536" classname="LiveMap.create() sends MAP_CREATE operation with reference to another LiveObject with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin value type created with LiveMap.create() with an invalid input throws when assigned to the object tree" time="0.533" classname="value type created with LiveMap.create() with an invalid input throws when assigned to the object tree">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext.get() returns child DefaultBatchContext instances" time="1.706" classname="DefaultBatchContext.get() returns child DefaultBatchContext instances">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext access API methods on objects work and are synchronous" time="1.833" classname="DefaultBatchContext access API methods on objects work and are synchronous">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext write API methods on objects do not mutate objects inside the batch function" time="1.666" classname="DefaultBatchContext write API methods on objects do not mutate objects inside the batch function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with web_socket binary protocol" time="1.668" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with web_socket text protocol" time="1.530" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with comet binary protocol" time="1.958" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with comet text protocol" time="1.365" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with binary protocol" time="2.350" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations are applied when batch function finishes with text protocol" time="2.134" classname="DefaultBatchContext scheduled mutation operations are applied when batch function finishes with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.batch()/DefaultInstance.batch() can be called without scheduling any mutation operations" time="1.439" classname="PathObject.batch()/DefaultInstance.batch() can be called without scheduling any mutation operations">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext scheduled mutation operations can be canceled by throwing an error in the batch function" time="2.023" classname="DefaultBatchContext scheduled mutation operations can be canceled by throwing an error in the batch function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext can&apos;t be interacted with after batch function finishes" time="0.404" classname="DefaultBatchContext can&apos;t be interacted with after batch function finishes">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultBatchContext can&apos;t be interacted with after error was thrown from batch function" time="0.400" classname="DefaultBatchContext can&apos;t be interacted with after error was thrown from batch function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin RealtimeObject.get() returns PathObject instance" time="0.415" classname="RealtimeObject.get() returns PathObject instance">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.get() returns child PathObject instances" time="1.418" classname="PathObject.get() returns child PathObject instances">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.path() returns correct path strings" time="1.157" classname="PathObject.path() returns correct path strings">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.at() navigates using dot-separated paths" time="0.533" classname="PathObject.at() navigates using dot-separated paths">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject resolves complex path strings" time="0.534" classname="PathObject resolves complex path strings">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.value() returns primitive values correctly" time="1.104" classname="PathObject.value() returns primitive values correctly">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.value() returns LiveCounter values" time="1.534" classname="PathObject.value() returns LiveCounter values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.instance() returns DefaultInstance for LiveMap and LiveCounter" time="1.044" classname="PathObject.instance() returns DefaultInstance for LiveMap and LiveCounter">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject collection methods work for LiveMap objects" time="2.065" classname="PathObject collection methods work for LiveMap objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.set() works for LiveMap objects with primitive values" time="2.045" classname="PathObject.set() works for LiveMap objects with primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.set() works for LiveMap objects with LiveObject references" time="0.661" classname="PathObject.set() works for LiveMap objects with LiveObject references">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.remove() works for LiveMap objects" time="1.908" classname="PathObject.remove() works for LiveMap objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.increment() and PathObject.decrement() work for LiveCounter objects" time="2.536" classname="PathObject.increment() and PathObject.decrement() work for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.get() throws error for non-string keys" time="0.402" classname="PathObject.get() throws error for non-string keys">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.at() throws error for non-string paths" time="0.533" classname="PathObject.at() throws error for non-string paths">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject handling of operations on non-existent paths" time="1.022" classname="PathObject handling of operations on non-existent paths">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject handling of operations for paths with non-collection intermediate segments" time="1.512" classname="PathObject handling of operations for paths with non-collection intermediate segments">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject handling of operations on wrong underlying object type" time="2.586" classname="PathObject handling of operations on wrong underlying object type">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() receives events for direct changes to the subscribed path" time="1.077" classname="PathObject.subscribe() receives events for direct changes to the subscribed path">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() receives events for nested changes with unlimited depth by default" time="1.665" classname="PathObject.subscribe() receives events for nested changes with unlimited depth by default">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() with depth parameter receives expected events" time="2.919" classname="PathObject.subscribe() with depth parameter receives expected events">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() on nested path receives events for that path and its children" time="3.127" classname="PathObject.subscribe() on nested path receives events for that path and its children">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() works with complex nested paths and escaped dots" time="1.170" classname="PathObject.subscribe() works with complex nested paths and escaped dots">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() on LiveMap path receives set/remove events" time="2.143" classname="PathObject.subscribe() on LiveMap path receives set/remove events">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() on LiveCounter path receives increment/decrement events" time="1.546" classname="PathObject.subscribe() on LiveCounter path receives increment/decrement events">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() on Primitive path receives changes to the primitive value" time="3.441" classname="PathObject.subscribe() on Primitive path receives changes to the primitive value">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() returns &quot;unsubscribe&quot; function" time="1.301" classname="PathObject.subscribe() returns &quot;unsubscribe&quot; function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can unsubscribe from PathObject.subscribe() updates using returned &quot;unsubscribe&quot; function" time="1.597" classname="can unsubscribe from PathObject.subscribe() updates using returned &quot;unsubscribe&quot; function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() handles multiple subscriptions independently" time="0.973" classname="PathObject.subscribe() handles multiple subscriptions independently">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() event object provides correct PathObject instance" time="1.405" classname="PathObject.subscribe() event object provides correct PathObject instance">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() handles subscription listener errors gracefully" time="0.468" classname="PathObject.subscribe() handles subscription listener errors gracefully">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribe() throws error for invalid options" time="0.554" classname="PathObject.subscribe() throws error for invalid options">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribeIterator() yields events for changes to the subscribed path" time="1.102" classname="PathObject.subscribeIterator() yields events for changes to the subscribed path">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribeIterator() with depth option works correctly" time="2.037" classname="PathObject.subscribeIterator() with depth option works correctly">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribeIterator() can be broken out of and subscription is removed properly" time="1.489" classname="PathObject.subscribeIterator() can be broken out of and subscription is removed properly">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.subscribeIterator() handles multiple concurrent iterators independently" time="0.981" classname="PathObject.subscribeIterator() handles multiple concurrent iterators independently">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compact() returns value as is for primitive values" time="1.101" classname="PathObject.compact() returns value as is for primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compact() returns number for LiveCounter objects" time="1.498" classname="PathObject.compact() returns number for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compact() returns plain object for LiveMap objects with buffers as-is" time="0.568" classname="PathObject.compact() returns plain object for LiveMap objects with buffers as-is">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compact() handles complex nested structures" time="1.525" classname="PathObject.compact() handles complex nested structures">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compact() handles cyclic references" time="0.820" classname="PathObject.compact() handles cyclic references">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compactJson() returns JSON-encodable value for primitive values" time="1.106" classname="PathObject.compactJson() returns JSON-encodable value for primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compactJson() returns number for LiveCounter objects" time="1.579" classname="PathObject.compactJson() returns number for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compactJson() returns plain object for LiveMap with base64-encoded buffers" time="0.545" classname="PathObject.compactJson() returns plain object for LiveMap with base64-encoded buffers">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compactJson() handles complex nested structures" time="1.489" classname="PathObject.compactJson() handles complex nested structures">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.compactJson() handles cyclic references with objectId" time="0.880" classname="PathObject.compactJson() handles cyclic references with objectId">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin PathObject.batch() passes RootBatchContext to its batch function" time="0.422" classname="PathObject.batch() passes RootBatchContext to its batch function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.id returns object ID of the underlying LiveObject" time="1.828" classname="DefaultInstance.id returns object ID of the underlying LiveObject">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.get() returns child DefaultInstance instances" time="1.147" classname="DefaultInstance.get() returns child DefaultInstance instances">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.value() returns primitive values correctly" time="1.568" classname="DefaultInstance.value() returns primitive values correctly">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.value() returns LiveCounter values" time="0.541" classname="DefaultInstance.value() returns LiveCounter values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance collection methods work for LiveMap objects" time="1.616" classname="DefaultInstance collection methods work for LiveMap objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.set() works for LiveMap objects with primitive values" time="1.117" classname="DefaultInstance.set() works for LiveMap objects with primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.set() works for LiveMap objects with LiveObject references" time="1.129" classname="DefaultInstance.set() works for LiveMap objects with LiveObject references">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.remove() works for LiveMap objects" time="1.097" classname="DefaultInstance.remove() works for LiveMap objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.increment() and DefaultInstance.decrement() work for LiveCounter objects" time="2.691" classname="DefaultInstance.increment() and DefaultInstance.decrement() work for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.get() throws error for non-string keys" time="0.535" classname="DefaultInstance.get() throws error for non-string keys">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance handling of operations on wrong underlying object type" time="1.551" classname="DefaultInstance handling of operations on wrong underlying object type">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() receives events for LiveMap set/remove operations" time="2.142" classname="DefaultInstance.subscribe() receives events for LiveMap set/remove operations">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() receives events for LiveCounter increment/decrement" time="2.524" classname="DefaultInstance.subscribe() receives events for LiveCounter increment/decrement">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() returns &quot;unsubscribe&quot; function" time="0.534" classname="DefaultInstance.subscribe() returns &quot;unsubscribe&quot; function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can unsubscribe from DefaultInstance.subscribe() updates using returned &quot;unsubscribe&quot; function" time="0.988" classname="can unsubscribe from DefaultInstance.subscribe() updates using returned &quot;unsubscribe&quot; function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() handles multiple subscriptions independently" time="1.572" classname="DefaultInstance.subscribe() handles multiple subscriptions independently">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() event object provides correct DefaultInstance reference" time="1.454" classname="DefaultInstance.subscribe() event object provides correct DefaultInstance reference">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribe() handles subscription listener errors gracefully" time="0.652" classname="DefaultInstance.subscribe() handles subscription listener errors gracefully">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribeIterator() yields events for LiveMap set/remove operations" time="1.542" classname="DefaultInstance.subscribeIterator() yields events for LiveMap set/remove operations">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribeIterator() yields events for LiveCounter increment/decrement" time="1.548" classname="DefaultInstance.subscribeIterator() yields events for LiveCounter increment/decrement">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribeIterator() can be broken out of and subscription is removed properly" time="1.605" classname="DefaultInstance.subscribeIterator() can be broken out of and subscription is removed properly">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.subscribeIterator() handles multiple concurrent iterators independently" time="1.555" classname="DefaultInstance.subscribeIterator() handles multiple concurrent iterators independently">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() returns value as is for primitive values" time="1.580" classname="DefaultInstance.compact() returns value as is for primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() returns number for LiveCounter objects" time="1.172" classname="DefaultInstance.compact() returns number for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() returns plain object for LiveMap objects with buffers as-is" time="1.187" classname="DefaultInstance.compact() returns plain object for LiveMap objects with buffers as-is">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() handles complex nested structures" time="0.545" classname="DefaultInstance.compact() handles complex nested structures">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() and PathObject.compact() return equivalent results" time="1.353" classname="DefaultInstance.compact() and PathObject.compact() return equivalent results">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compact() handles cyclic references" time="1.650" classname="DefaultInstance.compact() handles cyclic references">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() returns JSON-encodable value for primitive values" time="1.552" classname="DefaultInstance.compactJson() returns JSON-encodable value for primitive values">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() returns number for LiveCounter objects" time="0.672" classname="DefaultInstance.compactJson() returns number for LiveCounter objects">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() returns plain object for LiveMap with base64-encoded buffers" time="1.142" classname="DefaultInstance.compactJson() returns plain object for LiveMap with base64-encoded buffers">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() handles complex nested structures" time="1.103" classname="DefaultInstance.compactJson() handles complex nested structures">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() and PathObject.compactJson() return equivalent results" time="0.534" classname="DefaultInstance.compactJson() and PathObject.compactJson() return equivalent results">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.compactJson() handles cyclic references with objectId" time="0.885" classname="DefaultInstance.compactJson() handles cyclic references with objectId">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin DefaultInstance.batch() passes RootBatchContext to its batch function" time="1.290" classname="DefaultInstance.batch() passes RootBatchContext to its batch function">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with web_socket binary protocol" time="1.537" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with web_socket text protocol" time="1.795" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with comet binary protocol" time="1.619" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with comet text protocol" time="1.138" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with binary protocol" time="1.856" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming COUNTER_INC operation on a LiveCounter with text protocol" time="1.379" classname="can subscribe to the incoming COUNTER_INC operation on a LiveCounter with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with web_socket binary protocol" time="1.608" classname="can subscribe to multiple incoming operations on a LiveCounter with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with web_socket text protocol" time="2.125" classname="can subscribe to multiple incoming operations on a LiveCounter with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with comet binary protocol" time="1.042" classname="can subscribe to multiple incoming operations on a LiveCounter with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with comet text protocol" time="1.790" classname="can subscribe to multiple incoming operations on a LiveCounter with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with binary protocol" time="1.515" classname="can subscribe to multiple incoming operations on a LiveCounter with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveCounter with text protocol" time="1.078" classname="can subscribe to multiple incoming operations on a LiveCounter with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with web_socket binary protocol" time="0.886" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with web_socket text protocol" time="0.751" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with comet binary protocol" time="1.150" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with comet text protocol" time="1.132" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with binary protocol" time="0.749" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_SET operation on a LiveMap with text protocol" time="0.891" classname="can subscribe to the incoming MAP_SET operation on a LiveMap with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with web_socket binary protocol" time="1.932" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with web_socket text protocol" time="1.306" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with comet binary protocol" time="0.701" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with comet text protocol" time="0.704" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with binary protocol" time="1.551" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to the incoming MAP_REMOVE operation on a LiveMap with text protocol" time="1.593" classname="can subscribe to the incoming MAP_REMOVE operation on a LiveMap with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with web_socket binary protocol" time="1.012" classname="can subscribe to multiple incoming operations on a LiveMap with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with web_socket text protocol" time="1.154" classname="can subscribe to multiple incoming operations on a LiveMap with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with comet binary protocol" time="0.967" classname="can subscribe to multiple incoming operations on a LiveMap with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with comet text protocol" time="0.971" classname="can subscribe to multiple incoming operations on a LiveMap with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with binary protocol" time="1.007" classname="can subscribe to multiple incoming operations on a LiveMap with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can subscribe to multiple incoming operations on a LiveMap with text protocol" time="1.013" classname="can subscribe to multiple incoming operations on a LiveMap with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin subscription event message contains the metadata of the update" time="2.194" classname="subscription event message contains the metadata of the update">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can unsubscribe from LiveCounter updates via returned &quot;unsubscribe&quot; callback" time="1.903" classname="can unsubscribe from LiveCounter updates via returned &quot;unsubscribe&quot; callback">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin can unsubscribe from LiveMap updates via returned &quot;unsubscribe&quot; callback" time="1.477" classname="can unsubscribe from LiveMap updates via returned &quot;unsubscribe&quot; callback">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin gcGracePeriod is set from connectionDetails.objectsGCGracePeriod" time="0.254" classname="gcGracePeriod is set from connectionDetails.objectsGCGracePeriod">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin gcGracePeriod has a default value if connectionDetails.objectsGCGracePeriod is missing" time="0.255" classname="gcGracePeriod has a default value if connectionDetails.objectsGCGracePeriod is missing">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned object is removed from the pool after the GC grace period" time="1.062" classname="tombstoned object is removed from the pool after the GC grace period">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with web_socket binary protocol" time="2.066" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with web_socket text protocol" time="2.062" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with web_socket text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with comet binary protocol" time="1.001" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with comet binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with comet text protocol" time="1.502" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with comet text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with binary protocol" time="1.064" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with binary protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin tombstoned map entry is removed from the LiveMap after the GC grace period with text protocol" time="1.063" classname="tombstoned map entry is removed from the LiveMap after the GC grace period with text protocol">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public API throws missing object modes error when attached without correct modes" time="1.977" classname="public API throws missing object modes error when attached without correct modes">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public API throws missing object modes error when not yet attached but client options are missing correct modes" time="2.050" classname="public API throws missing object modes error when not yet attached but client options are missing correct modes">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public API throws invalid channel state error when channel DETACHED" time="2.006" classname="public API throws invalid channel state error when channel DETACHED">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public API throws invalid channel state error when channel FAILED" time="1.033" classname="public API throws invalid channel state error when channel FAILED">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public write API throws invalid channel state error when channel SUSPENDED" time="1.028" classname="public write API throws invalid channel state error when channel SUSPENDED">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin public write API throws invalid channel option when &quot;echoMessages&quot; is disabled" time="1.184" classname="public write API throws invalid channel option when &quot;echoMessages&quot; is disabled">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin object message publish respects connectionDetails.maxMessageSize" time="0.538" classname="object message publish respects connectionDetails.maxMessageSize">
    </testcase>
  </testsuite>
  <testsuite name="ObjectMessage message size" timestamp="2026-03-03T13:43:55" tests="28" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="0.018" failures="0">
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size client id" time="0.001" classname="client id">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size extras" time="0.000" classname="extras">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size object id" time="0.000" classname="object id">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size nonce" time="0.000" classname="nonce">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size initial value" time="0.000" classname="initial value">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op no payload" time="0.001" classname="map create op no payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with object id payload" time="0.001" classname="map create op with object id payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with string payload" time="0.000" classname="map create op with string payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with bytes payload" time="0.001" classname="map create op with bytes payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with boolean payload" time="0.000" classname="map create op with boolean payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with double payload" time="0.000" classname="map create op with double payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with object payload" time="0.001" classname="map create op with object payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map create op with array payload" time="0.000" classname="map create op with array payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map remove op" time="0.001" classname="map remove op">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=objectId" time="0.000" classname="map set operation value=objectId">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=string" time="0.000" classname="map set operation value=string">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=bytes" time="0.001" classname="map set operation value=bytes">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=boolean true" time="0.000" classname="map set operation value=boolean true">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=boolean false" time="0.001" classname="map set operation value=boolean false">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=double" time="0.000" classname="map set operation value=double">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=double 0" time="0.000" classname="map set operation value=double 0">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=json-object" time="0.000" classname="map set operation value=json-object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map set operation value=json-array" time="0.000" classname="map set operation value=json-array">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size map object" time="0.000" classname="map object">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size counter create op no payload" time="0.001" classname="counter create op no payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size counter create op with payload" time="0.000" classname="counter create op with payload">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size counter inc op" time="0.001" classname="counter inc op">
    </testcase>
    <testcase name="realtime/liveobjects Realtime with LiveObjects plugin ObjectMessage message size counter object" time="0.000" classname="counter object">
    </testcase>
  </testsuite>
  <testsuite name="Apply on ACK" timestamp="2026-03-03T13:43:55" tests="0" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="0.000" failures="0">
  </testsuite>
  <testsuite name="Operations applied locally on ACK" timestamp="2026-03-03T13:43:55" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="7.700" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK creating a LiveCounter applies immediately on ACK" time="1.569" classname="creating a LiveCounter applies immediately on ACK">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK LiveCounter.increment applies operation immediately on ACK" time="1.612" classname="LiveCounter.increment applies operation immediately on ACK">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK creating a LiveMap applies immediately on ACK" time="0.666" classname="creating a LiveMap applies immediately on ACK">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK LiveMap.set applies operation immediately on ACK" time="1.064" classname="LiveMap.set applies operation immediately on ACK">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK LiveMap.remove applies operation immediately on ACK" time="1.125" classname="LiveMap.remove applies operation immediately on ACK">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Operations applied locally on ACK batch operations apply immediately on ACK" time="1.663" classname="batch operations apply immediately on ACK">
    </testcase>
  </testsuite>
  <testsuite name="Does not double-apply" timestamp="2026-03-03T13:44:02" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="3.175" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK Does not double-apply echo after ACK does not double-apply" time="1.040" classname="echo after ACK does not double-apply">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK Does not double-apply ACK after echo does not double-apply" time="2.132" classname="ACK after echo does not double-apply">
    </testcase>
  </testsuite>
  <testsuite name="Does not incorrectly skip operations" timestamp="2026-03-03T13:44:06" tests="1" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="1.038" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK Does not incorrectly skip operations apply-on-ACK does not update siteTimeserials" time="1.038" classname="apply-on-ACK does not update siteTimeserials">
    </testcase>
  </testsuite>
  <testsuite name="ACKs buffered during OBJECT_SYNC" timestamp="2026-03-03T13:44:07" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="0.000" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK ACKs buffered during OBJECT_SYNC operation buffered during sync is applied after sync completes" time="1.643" classname="operation buffered during sync is applied after sync completes">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK ACKs buffered during OBJECT_SYNC appliedOnAckSerials is cleared on sync" time="2.106" classname="appliedOnAckSerials is cleared on sync">
    </testcase>
  </testsuite>
  <testsuite name="publishAndApply rejects when channel state changes during sync wait" timestamp="2026-03-03T13:44:10" tests="3" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="4.683" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK ACKs buffered during OBJECT_SYNC publishAndApply rejects when channel state changes during sync wait rejects with error 92008 when channel enters detached state" time="1.841" classname="rejects with error 92008 when channel enters detached state">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK ACKs buffered during OBJECT_SYNC publishAndApply rejects when channel state changes during sync wait rejects with error 92008 when channel enters suspended state" time="1.630" classname="rejects with error 92008 when channel enters suspended state">
    </testcase>
    <testcase name="realtime/liveobjects Apply on ACK ACKs buffered during OBJECT_SYNC publishAndApply rejects when channel state changes during sync wait rejects with error 92008 when channel enters failed state" time="1.211" classname="rejects with error 92008 when channel enters failed state">
    </testcase>
  </testsuite>
  <testsuite name="Subscription events" timestamp="2026-03-03T13:44:15" tests="1" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="1.726" failures="0">
    <testcase name="realtime/liveobjects Apply on ACK Subscription events subscription callbacks fire for both locally-applied and Realtime-received operations" time="1.726" classname="subscription callbacks fire for both locally-applied and Realtime-received operations">
    </testcase>
  </testsuite>
  <testsuite name="Sync events" timestamp="2026-03-03T13:44:17" tests="12" file="/home/runner/work/ably-js/ably-js/test/realtime/liveobjects.test.js" time="3.090" failures="0">
    <testcase name="realtime/liveobjects Sync events The first ATTACHED should always provoke a SYNCING even when HAS_OBJECTS is false, so that the SYNCED is preceded by SYNCING" time="0.254" classname="The first ATTACHED should always provoke a SYNCING even when HAS_OBJECTS is false, so that the SYNCED is preceded by SYNCING">
    </testcase>
    <testcase name="realtime/liveobjects Sync events ATTACHED with HAS_OBJECTS false once SYNCED emits SYNCING and then SYNCED" time="0.264" classname="ATTACHED with HAS_OBJECTS false once SYNCED emits SYNCING and then SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events If we&apos;re in SYNCING awaiting an OBJECT_SYNC but then instead get an ATTACHED with HAS_OBJECTS false, we should emit a SYNCED" time="0.266" classname="If we&apos;re in SYNCING awaiting an OBJECT_SYNC but then instead get an ATTACHED with HAS_OBJECTS false, we should emit a SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events An initial ATTACHED with HAS_OBJECTS true provokes a SYNCING" time="0.261" classname="An initial ATTACHED with HAS_OBJECTS true provokes a SYNCING">
    </testcase>
    <testcase name="realtime/liveobjects Sync events ATTACHED with HAS_OBJECTS true when SYNCED should provoke another SYNCING, because we&apos;re waiting to receive the updated objects in an OBJECT_SYNC" time="0.261" classname="ATTACHED with HAS_OBJECTS true when SYNCED should provoke another SYNCING, because we&apos;re waiting to receive the updated objects in an OBJECT_SYNC">
    </testcase>
    <testcase name="realtime/liveobjects Sync events If we&apos;re in SYNCING awaiting an OBJECT_SYNC but then instead get another ATTACHED with HAS_OBJECTS true, we should remain SYNCING (i.e. not emit another event)" time="0.254" classname="If we&apos;re in SYNCING awaiting an OBJECT_SYNC but then instead get another ATTACHED with HAS_OBJECTS true, we should remain SYNCING (i.e. not emit another event)">
    </testcase>
    <testcase name="realtime/liveobjects Sync events A complete multi-message OBJECT_SYNC sequence after ATTACHED emits SYNCING and then SYNCED" time="0.253" classname="A complete multi-message OBJECT_SYNC sequence after ATTACHED emits SYNCING and then SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events A complete single-message OBJECT_SYNC after ATTACHED emits SYNCING and then SYNCED" time="0.255" classname="A complete single-message OBJECT_SYNC after ATTACHED emits SYNCING and then SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events SYNCED is not emitted midway through a multi-message OBJECT_SYNC sequence" time="0.255" classname="SYNCED is not emitted midway through a multi-message OBJECT_SYNC sequence">
    </testcase>
    <testcase name="realtime/liveobjects Sync events A complete multi-message OBJECT_SYNC sequence when already SYNCED emits SYNCING and then SYNCED" time="0.255" classname="A complete multi-message OBJECT_SYNC sequence when already SYNCED emits SYNCING and then SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events A complete single-message OBJECT_SYNC when already SYNCED emits SYNCING and then SYNCED" time="0.256" classname="A complete single-message OBJECT_SYNC when already SYNCED emits SYNCING and then SYNCED">
    </testcase>
    <testcase name="realtime/liveobjects Sync events A new OBJECT_SYNC sequence in the middle of a sync sequence does not provoke another SYNCING" time="0.254" classname="A new OBJECT_SYNC sequence in the middle of a sync sequence does not provoke another SYNCING">
    </testcase>
  </testsuite>
  <testsuite name="realtime/message" timestamp="2026-03-03T13:44:20" tests="41" file="/home/runner/work/ably-js/ably-js/test/realtime/message.test.js" time="0.000" failures="0">
    <testcase name="realtime/message publishonce" time="0.276" classname="publishonce">
    </testcase>
    <testcase name="realtime/message publishfast with web_socket binary protocol" time="0.887" classname="publishfast with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/message publishfast with web_socket text protocol" time="0.888" classname="publishfast with web_socket text protocol">
    </testcase>
    <testcase name="realtime/message publishfast with comet binary protocol" time="0.723" classname="publishfast with comet binary protocol">
    </testcase>
    <testcase name="realtime/message publishfast with comet text protocol" time="0.727" classname="publishfast with comet text protocol">
    </testcase>
    <testcase name="realtime/message publishfast with binary protocol" time="0.887" classname="publishfast with binary protocol">
    </testcase>
    <testcase name="realtime/message publishfast with text protocol" time="0.965" classname="publishfast with text protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with web_socket binary protocol" time="1.583" classname="publishQueued with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with web_socket text protocol" time="1.634" classname="publishQueued with web_socket text protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with comet binary protocol" time="1.473" classname="publishQueued with comet binary protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with comet text protocol" time="1.471" classname="publishQueued with comet text protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with binary protocol" time="1.597" classname="publishQueued with binary protocol">
    </testcase>
    <testcase name="realtime/message publishQueued with text protocol" time="1.617" classname="publishQueued with text protocol">
    </testcase>
    <testcase name="realtime/message publishEcho" time="0.571" classname="publishEcho">
    </testcase>
    <testcase name="realtime/message publishVariations" time="3.256" classname="publishVariations">
    </testcase>
    <testcase name="realtime/message publishDisallowed" time="0.333" classname="publishDisallowed">
    </testcase>
    <testcase name="realtime/message publishEncodings" time="0.613" classname="publishEncodings">
    </testcase>
    <testcase name="realtime/message restpublish" time="5.131" classname="restpublish">
    </testcase>
    <testcase name="realtime/message publish with web_socket binary protocol" time="0.916" classname="publish with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/message publish with web_socket text protocol" time="0.784" classname="publish with web_socket text protocol">
    </testcase>
    <testcase name="realtime/message publish with comet binary protocol" time="0.740" classname="publish with comet binary protocol">
    </testcase>
    <testcase name="realtime/message publish with comet text protocol" time="0.740" classname="publish with comet text protocol">
    </testcase>
    <testcase name="realtime/message publish with binary protocol" time="0.926" classname="publish with binary protocol">
    </testcase>
    <testcase name="realtime/message publish with text protocol" time="0.909" classname="publish with text protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with web_socket binary protocol" time="0.383" classname="publish emoji string with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with web_socket text protocol" time="0.383" classname="publish emoji string with web_socket text protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with comet binary protocol" time="0.218" classname="publish emoji string with comet binary protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with comet text protocol" time="0.222" classname="publish emoji string with comet text protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with binary protocol" time="0.407" classname="publish emoji string with binary protocol">
    </testcase>
    <testcase name="realtime/message publish emoji string with text protocol" time="0.394" classname="publish emoji string with text protocol">
    </testcase>
    <testcase name="realtime/message implicit_client_id_0" time="0.332" classname="implicit_client_id_0">
    </testcase>
    <testcase name="realtime/message explicit_client_id_0" time="0.390" classname="explicit_client_id_0">
    </testcase>
    <testcase name="realtime/message explicit_client_id_1" time="0.898" classname="explicit_client_id_1">
    </testcase>
    <testcase name="realtime/message subscribe_with_event_array" time="0.385" classname="subscribe_with_event_array">
    </testcase>
    <testcase name="realtime/message subscribe_with_filter_object" time="0.386" classname="subscribe_with_filter_object">
    </testcase>
    <testcase name="realtime/message unsubscribe_with_filter_object" time="0.386" classname="unsubscribe_with_filter_object">
    </testcase>
    <testcase name="realtime/message extras_field" time="0.393" classname="extras_field">
    </testcase>
    <testcase name="realtime/message maxMessageSize" time="0.256" classname="maxMessageSize">
    </testcase>
    <testcase name="realtime/message idempotentRealtimePublishing" time="0.386" classname="idempotentRealtimePublishing">
    </testcase>
    <testcase name="realtime/message subscribes to filtered channel" time="0.471" classname="subscribes to filtered channel">
    </testcase>
    <testcase name="realtime/message unrecognized message action" time="0.322" classname="unrecognized message action">
    </testcase>
  </testsuite>
  <testsuite name="DefaultMessage.fromEncoded" timestamp="2026-03-03T13:44:56" tests="9" file="/home/runner/work/ably-js/ably-js/test/realtime/message.test.js" time="0.005" failures="0">
    <testcase name="realtime/message DefaultMessage.fromEncoded should stringify the numeric action" time="0.001" classname="should stringify the numeric action">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should stringify the numeric action" time="0.000" classname="should stringify the numeric action">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should handle no action provided" time="0.000" classname="should handle no action provided">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should handle unknown action provided" time="0.001" classname="should handle unknown action provided">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should set version from version" time="0.000" classname="should set version from version">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should set version from serial" time="0.000" classname="should set version from serial">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should populate version from serial/timestamp when decoding message" time="0.000" classname="should populate version from serial/timestamp when decoding message">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should populate annotations and summary when decoding message" time="0.001" classname="should populate annotations and summary when decoding message">
    </testcase>
    <testcase name="realtime/message DefaultMessage.fromEncoded should ensure clipped field is set to false where not explicitly provided" time="0.001" classname="should ensure clipped field is set to false where not explicitly provided">
    </testcase>
  </testsuite>
  <testsuite name="realtime/presence" timestamp="2026-03-03T13:44:56" tests="36" file="/home/runner/work/ably-js/ably-js/test/realtime/presence.test.js" time="35.912" failures="0">
    <testcase name="realtime/presence presenceEnterWithoutAttach" time="0.654" classname="presenceEnterWithoutAttach">
    </testcase>
    <testcase name="realtime/presence presenceEnterWithoutConnect" time="0.642" classname="presenceEnterWithoutConnect">
    </testcase>
    <testcase name="realtime/presence presenceEnterWithCallback" time="0.643" classname="presenceEnterWithCallback">
    </testcase>
    <testcase name="realtime/presence presenceEnterWithNothing" time="0.653" classname="presenceEnterWithNothing">
    </testcase>
    <testcase name="realtime/presence presenceEnterWithData" time="0.651" classname="presenceEnterWithData">
    </testcase>
    <testcase name="realtime/presence presenceMessageAction" time="0.383" classname="presenceMessageAction">
    </testcase>
    <testcase name="realtime/presence presenceMessageExtras" time="0.448" classname="presenceMessageExtras">
    </testcase>
    <testcase name="realtime/presence presenceEnterDetachEnter" time="1.155" classname="presenceEnterDetachEnter">
    </testcase>
    <testcase name="realtime/presence presenceEnterInvalid" time="0.317" classname="presenceEnterInvalid">
    </testcase>
    <testcase name="realtime/presence presenceEnterAndLeave" time="0.836" classname="presenceEnterAndLeave">
    </testcase>
    <testcase name="realtime/presence presenceEnterUpdate" time="1.151" classname="presenceEnterUpdate">
    </testcase>
    <testcase name="realtime/presence presenceEnterGet" time="0.659" classname="presenceEnterGet">
    </testcase>
    <testcase name="realtime/presence presenceSubscribeUnattached" time="0.605" classname="presenceSubscribeUnattached">
    </testcase>
    <testcase name="realtime/presence presenceGetUnattached" time="0.652" classname="presenceGetUnattached">
    </testcase>
    <testcase name="realtime/presence presenceEnterLeaveGet" time="1.139" classname="presenceEnterLeaveGet">
    </testcase>
    <testcase name="realtime/presence presenceHistory" time="1.067" classname="presenceHistory">
    </testcase>
    <testcase name="realtime/presence presenceSecondConnection" time="0.653" classname="presenceSecondConnection">
    </testcase>
    <testcase name="realtime/presence presenceTwoMembers" time="0.403" classname="presenceTwoMembers">
    </testcase>
    <testcase name="realtime/presence presenceEnterAfterClose" time="1.085" classname="presenceEnterAfterClose">
    </testcase>
    <testcase name="realtime/presence presenceEnterClosed" time="0.193" classname="presenceEnterClosed">
    </testcase>
    <testcase name="realtime/presence presenceClientIdIsImplicit" time="0.322" classname="presenceClientIdIsImplicit">
    </testcase>
    <testcase name="realtime/presence presenceEncoding" time="0.590" classname="presenceEncoding">
    </testcase>
    <testcase name="realtime/presence presence_enter_inherited_clientid" time="0.709" classname="presence_enter_inherited_clientid">
    </testcase>
    <testcase name="realtime/presence presence_enter_before_know_clientid" time="0.713" classname="presence_enter_before_know_clientid">
    </testcase>
    <testcase name="realtime/presence presence_refresh_on_detach" time="0.952" classname="presence_refresh_on_detach">
    </testcase>
    <testcase name="realtime/presence presence_detach_during_sync" time="0.529" classname="presence_detach_during_sync">
    </testcase>
    <testcase name="realtime/presence presence_auto_reenter" time="0.741" classname="presence_auto_reenter">
    </testcase>
    <testcase name="realtime/presence presence_auto_reenter_different_connid" time="5.480" classname="presence_auto_reenter_different_connid">
    </testcase>
    <testcase name="realtime/presence multiple_pending" time="0.403" classname="multiple_pending">
    </testcase>
    <testcase name="realtime/presence leave_published_for_member_missing_from_sync" time="0.610" classname="leave_published_for_member_missing_from_sync">
    </testcase>
    <testcase name="realtime/presence leave_published_for_members_on_presenceless_attached" time="0.407" classname="leave_published_for_members_on_presenceless_attached">
    </testcase>
    <testcase name="realtime/presence suspended_preserves_presence" time="1.916" classname="suspended_preserves_presence">
    </testcase>
    <testcase name="realtime/presence presence_many_updates" time="8.394" classname="presence_many_updates">
    </testcase>
  </testsuite>
  <testsuite name="realtime/reauth" timestamp="2026-03-03T13:45:32" tests="24" file="/home/runner/work/ably-js/ably-js/test/realtime/reauth.test.js" time="14.683" failures="0">
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with web_socket binary protocol" time="0.529" classname="reauthCapabilityUpgradeNewChannel with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with web_socket text protocol" time="0.537" classname="reauthCapabilityUpgradeNewChannel with web_socket text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with comet binary protocol" time="0.457" classname="reauthCapabilityUpgradeNewChannel with comet binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with comet text protocol" time="0.422" classname="reauthCapabilityUpgradeNewChannel with comet text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with binary protocol" time="0.531" classname="reauthCapabilityUpgradeNewChannel with binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeNewChannel with text protocol" time="0.522" classname="reauthCapabilityUpgradeNewChannel with text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with web_socket binary protocol" time="0.520" classname="reauthCapabilityDowngradeFullChannel with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with web_socket text protocol" time="0.512" classname="reauthCapabilityDowngradeFullChannel with web_socket text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with comet binary protocol" time="0.476" classname="reauthCapabilityDowngradeFullChannel with comet binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with comet text protocol" time="0.472" classname="reauthCapabilityDowngradeFullChannel with comet text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with binary protocol" time="0.515" classname="reauthCapabilityDowngradeFullChannel with binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradeFullChannel with text protocol" time="0.512" classname="reauthCapabilityDowngradeFullChannel with text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with web_socket binary protocol" time="0.892" classname="reauthCapabilityUpgradeAddPublish with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with web_socket text protocol" time="0.894" classname="reauthCapabilityUpgradeAddPublish with web_socket text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with comet binary protocol" time="0.790" classname="reauthCapabilityUpgradeAddPublish with comet binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with comet text protocol" time="0.786" classname="reauthCapabilityUpgradeAddPublish with comet text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with binary protocol" time="0.887" classname="reauthCapabilityUpgradeAddPublish with binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityUpgradeAddPublish with text protocol" time="0.881" classname="reauthCapabilityUpgradeAddPublish with text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with web_socket binary protocol" time="0.574" classname="reauthCapabilityDowngradePublish with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with web_socket text protocol" time="0.576" classname="reauthCapabilityDowngradePublish with web_socket text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with comet binary protocol" time="0.611" classname="reauthCapabilityDowngradePublish with comet binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with comet text protocol" time="0.611" classname="reauthCapabilityDowngradePublish with comet text protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with binary protocol" time="0.585" classname="reauthCapabilityDowngradePublish with binary protocol">
    </testcase>
    <testcase name="realtime/reauth reauthCapabilityDowngradePublish with text protocol" time="0.576" classname="reauthCapabilityDowngradePublish with text protocol">
    </testcase>
  </testsuite>
  <testsuite name="realtime/resume" timestamp="2026-03-03T13:45:47" tests="35" file="/home/runner/work/ably-js/ably-js/test/realtime/resume.test.js" time="156.176" failures="2">
    <testcase name="realtime/resume resume_inactive with web_socket binary protocol" time="12.783" classname="resume_inactive with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_inactive with web_socket text protocol" time="12.595" classname="resume_inactive with web_socket text protocol">
      <failure message="Error response received from server: 502 body was: &lt;Buffer 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e 30 31 20 54 72 61 6e 73 ... 887 more bytes&gt;" type="Error"><![CDATA[Error: Error response received from server: 502 body was: <Buffer 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e 30 31 20 54 72 61 6e 73 ... 887 more bytes>
    at _a._handler (src/platform/nodejs/lib/util/http.ts:168:11)
    at _a.doUri (src/platform/nodejs/lib/util/http.ts:101:21)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Http.doUri (src/common/types/http.ts:257:22)
    at doRequest (src/common/lib/client/resource.ts:341:26)
    at Function.do (src/common/lib/client/resource.ts:359:18)
    at RestChannel._publish (src/common/lib/client/restchannel.ts:147:32)]]></failure>
    </testcase>
    <testcase name="realtime/resume resume_inactive with web_socket text protocol" time="12.595" classname="resume_inactive with web_socket text protocol">
      <failure message="done() called multiple times in test &lt;realtime/resume resume_inactive with web_socket text protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/resume.test.js" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/resume resume_inactive with web_socket text protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/resume.test.js
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at Object.<anonymous> (test/common/modules/shared_helper.js:298:9)
    at callListener (src/common/lib/util/eventemitter.ts:8:14)
    at /home/runner/work/ably-js/ably-js/src/common/lib/util/eventemitter.ts:220:7
    at Array.forEach (<anonymous>)
    at WebSocketTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at WebSocketTransport.onWsClose (src/common/lib/transport/websockettransport.ts:186:10)
    at WebSocket.wsConnection.onclose (src/common/lib/transport/websockettransport.ts:83:18)
    at callListener (node_modules/ws/lib/event-target.js:290:14)
    at WebSocket.onClose (node_modules/ws/lib/event-target.js:220:9)
    at WebSocket.emit (node:events:517:28)
    at WebSocket.emitClose (node_modules/ws/lib/websocket.js:265:10)
    at TLSSocket.socketOnClose (node_modules/ws/lib/websocket.js:1291:15)
    at TLSSocket.emit (node:events:529:35)
    at node:net:350:12
    at TCP.done (node:_tls_wrap:657:7)]]></failure>
    </testcase>
    <testcase name="realtime/resume resume_inactive with comet binary protocol" time="12.574" classname="resume_inactive with comet binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_inactive with comet text protocol" time="12.538" classname="resume_inactive with comet text protocol">
    </testcase>
    <testcase name="realtime/resume resume_inactive with binary protocol" time="12.622" classname="resume_inactive with binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_inactive with text protocol" time="12.676" classname="resume_inactive with text protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with web_socket binary protocol" time="11.905" classname="resume_active with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with web_socket text protocol" time="11.883" classname="resume_active with web_socket text protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with comet binary protocol" time="11.576" classname="resume_active with comet binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with comet text protocol" time="11.646" classname="resume_active with comet text protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with binary protocol" time="11.876" classname="resume_active with binary protocol">
    </testcase>
    <testcase name="realtime/resume resume_active with text protocol" time="11.854" classname="resume_active with text protocol">
    </testcase>
    <testcase name="realtime/resume channel_resumed_flag" time="0.584" classname="channel_resumed_flag">
    </testcase>
    <testcase name="realtime/resume no_resume_once_suspended" time="0.198" classname="no_resume_once_suspended">
    </testcase>
    <testcase name="realtime/resume no_resume_last_activity" time="0.192" classname="no_resume_last_activity">
    </testcase>
    <testcase name="realtime/resume resume_rewind_1" time="7.609" classname="resume_rewind_1">
    </testcase>
    <testcase name="realtime/resume recover multiple channels" time="1.053" classname="recover multiple channels">
    </testcase>
  </testsuite>
  <testsuite name="realtime/sync" timestamp="2026-03-03T13:48:23" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/sync.test.js" time="1.023" failures="0">
    <testcase name="realtime/sync sync_existing_set" time="0.001" classname="sync_existing_set">
    </testcase>
    <testcase name="realtime/sync sync_member_arrives_in_middle" time="0.000" classname="sync_member_arrives_in_middle">
    </testcase>
    <testcase name="realtime/sync sync_member_arrives_normally_after_came_in_sync" time="0.000" classname="sync_member_arrives_normally_after_came_in_sync">
    </testcase>
    <testcase name="realtime/sync sync_member_arrives_normally_before_comes_in_sync" time="0.001" classname="sync_member_arrives_normally_before_comes_in_sync">
    </testcase>
    <testcase name="realtime/sync presence_ordering" time="0.001" classname="presence_ordering">
    </testcase>
    <testcase name="realtime/sync presence_sync_interruptus" time="1.017" classname="presence_sync_interruptus">
    </testcase>
  </testsuite>
  <testsuite name="realtime/transports" timestamp="2026-03-03T13:48:24" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/transports.test.js" time="22.085" failures="0">
    <testcase name="realtime/transports websocket_is_default" time="0.262" classname="websocket_is_default">
    </testcase>
    <testcase name="realtime/transports no_ws_connectivity" time="3.077" classname="no_ws_connectivity">
    </testcase>
    <testcase name="realtime/transports ws_primary_host_fails" time="0.268" classname="ws_primary_host_fails">
    </testcase>
    <testcase name="realtime/transports no_internet_connectivity" time="1.424" classname="no_internet_connectivity">
    </testcase>
    <testcase name="realtime/transports no_websocket_or_base_transport" time="3.001" classname="no_websocket_or_base_transport">
    </testcase>
    <testcase name="realtime/transports ws_can_reconnect_after_ws_connectivity_fail" time="14.051" classname="ws_can_reconnect_after_ws_connectivity_fail">
    </testcase>
  </testsuite>
  <testsuite name="realtime/message-operations" timestamp="2026-03-03T13:48:46" tests="6" file="/home/runner/work/ably-js/ably-js/test/realtime/updates-deletes.test.js" time="3.612" failures="0">
    <testcase name="realtime/message-operations Should return serials from publish" time="0.337" classname="Should return serials from publish">
    </testcase>
    <testcase name="realtime/message-operations Should return multiple serials for batch publish" time="0.340" classname="Should return multiple serials for batch publish">
    </testcase>
    <testcase name="realtime/message-operations Should update a message over realtime" time="0.836" classname="Should update a message over realtime">
    </testcase>
    <testcase name="realtime/message-operations Should delete a message over realtime" time="0.849" classname="Should delete a message over realtime">
    </testcase>
    <testcase name="realtime/message-operations Should error when called without serial" time="0.267" classname="Should error when called without serial">
    </testcase>
    <testcase name="realtime/message-operations Should append to a message over realtime" time="0.980" classname="Should append to a message over realtime">
    </testcase>
  </testsuite>
  <testsuite name="incremental backoff and jitter" timestamp="2026-03-03T13:48:50" tests="1" file="/home/runner/work/ably-js/ably-js/test/realtime/utils.test.js" time="0.002" failures="0">
    <testcase name="incremental backoff and jitter should calculate retry timeouts using incremental backoff and jitter" time="0.002" classname="should calculate retry timeouts using incremental backoff and jitter">
    </testcase>
  </testsuite>
  <testsuite name="rest/api" timestamp="2026-03-03T13:48:50" tests="5" file="/home/runner/work/ably-js/ably-js/test/rest/api.test.js" time="0.002" failures="0">
    <testcase name="rest/api Client constructors" time="0.000" classname="Client constructors">
    </testcase>
    <testcase name="rest/api constructor without any arguments" time="0.000" classname="constructor without any arguments">
    </testcase>
    <testcase name="rest/api Crypto" time="0.000" classname="Crypto">
    </testcase>
    <testcase name="rest/api Message" time="0.000" classname="Message">
    </testcase>
    <testcase name="rest/api PresenceMessage" time="0.000" classname="PresenceMessage">
    </testcase>
  </testsuite>
  <testsuite name="rest/auth" timestamp="2026-03-03T13:48:50" tests="32" file="/home/runner/work/ably-js/ably-js/test/rest/auth.test.js" time="4.377" failures="0">
    <testcase name="rest/auth Base token generation case" time="0.073" classname="Base token generation case">
    </testcase>
    <testcase name="rest/auth Base token generation with options" time="0.073" classname="Base token generation with options">
    </testcase>
    <testcase name="rest/auth Generate token and init library with it" time="0.076" classname="Generate token and init library with it">
    </testcase>
    <testcase name="rest/auth Token generation with explicit timestamp" time="0.130" classname="Token generation with explicit timestamp">
    </testcase>
    <testcase name="rest/auth Token generation with invalid timestamp" time="0.065" classname="Token generation with invalid timestamp">
    </testcase>
    <testcase name="rest/auth Token generation with system timestamp" time="0.065" classname="Token generation with system timestamp">
    </testcase>
    <testcase name="rest/auth Token generation with duplicate nonce" time="0.204" classname="Token generation with duplicate nonce">
    </testcase>
    <testcase name="rest/auth Token generation with clientId" time="0.075" classname="Token generation with clientId">
    </testcase>
    <testcase name="rest/auth Token generation with empty string clientId should error" time="0.000" classname="Token generation with empty string clientId should error">
    </testcase>
    <testcase name="rest/auth Token generation with capability that subsets key capability" time="0.067" classname="Token generation with capability that subsets key capability">
    </testcase>
    <testcase name="rest/auth Token generation with specified key" time="0.156" classname="Token generation with specified key">
    </testcase>
    <testcase name="rest/auth Token generation with explicit auth" time="0.067" classname="Token generation with explicit auth">
    </testcase>
    <testcase name="rest/auth Token generation with explicit auth, different key" time="0.151" classname="Token generation with explicit auth, different key">
    </testcase>
    <testcase name="rest/auth Token generation with invalid mac" time="0.069" classname="Token generation with invalid mac">
    </testcase>
    <testcase name="rest/auth Token generation with defaultTokenParams set and no tokenParams passed in" time="0.066" classname="Token generation with defaultTokenParams set and no tokenParams passed in">
    </testcase>
    <testcase name="rest/auth Token generation: if tokenParams passed in, defaultTokenParams should be ignored altogether, not merged" time="0.067" classname="Token generation: if tokenParams passed in, defaultTokenParams should be ignored altogether, not merged">
    </testcase>
    <testcase name="rest/auth Authorize with different args" time="0.069" classname="Authorize with different args">
    </testcase>
    <testcase name="rest/auth Specify non-default ttl" time="0.067" classname="Specify non-default ttl">
    </testcase>
    <testcase name="rest/auth Should error with excessive ttl" time="0.065" classname="Should error with excessive ttl">
    </testcase>
    <testcase name="rest/auth Should error with negative ttl" time="0.067" classname="Should error with negative ttl">
    </testcase>
    <testcase name="rest/auth Should error with invalid ttl" time="0.068" classname="Should error with invalid ttl">
    </testcase>
    <testcase name="rest/auth createTokenRequest without authOptions" time="0.000" classname="createTokenRequest without authOptions">
    </testcase>
    <testcase name="rest/auth createTokenRequest uses the key it was initialized with if authOptions does not have a &quot;key&quot; key" time="0.000" classname="createTokenRequest uses the key it was initialized with if authOptions does not have a &quot;key&quot; key">
    </testcase>
    <testcase name="rest/auth createTokenRequest should serialise capability object as JSON" time="0.000" classname="createTokenRequest should serialise capability object as JSON">
    </testcase>
    <testcase name="rest/auth Basic rest JWT" time="0.343" classname="Basic rest JWT">
    </testcase>
    <testcase name="rest/auth Rest JWT with return type " time="0.226" classname="Rest JWT with return type ">
    </testcase>
    <testcase name="rest/auth Rest embedded JWT" time="0.416" classname="Rest embedded JWT">
    </testcase>
    <testcase name="rest/auth Rest embedded JWT with encryption" time="0.397" classname="Rest embedded JWT with encryption">
    </testcase>
    <testcase name="rest/auth JWT request with invalid key" time="0.331" classname="JWT request with invalid key">
    </testcase>
    <testcase name="rest/auth Rest JWT with authCallback" time="0.339" classname="Rest JWT with authCallback">
    </testcase>
    <testcase name="rest/auth Rest JWT with authCallback and invalid keys" time="0.282" classname="Rest JWT with authCallback and invalid keys">
    </testcase>
    <testcase name="rest/auth authCallback is only invoked once on concurrent auth" time="0.223" classname="authCallback is only invoked once on concurrent auth">
    </testcase>
  </testsuite>
  <testsuite name="rest/batchPublish" timestamp="2026-03-03T13:48:54" tests="0" file="/home/runner/work/ably-js/ably-js/test/rest/batch.test.js" time="0.000" failures="0">
  </testsuite>
  <testsuite name="when invoked with an array of specs" timestamp="2026-03-03T13:48:54" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/batch.test.js" time="0.245" failures="0">
    <testcase name="rest/batchPublish when invoked with an array of specs performs a batch publish and returns an array of results" time="0.245" classname="performs a batch publish and returns an array of results">
    </testcase>
  </testsuite>
  <testsuite name="when invoked with a single spec" timestamp="2026-03-03T13:48:54" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/batch.test.js" time="0.152" failures="0">
    <testcase name="rest/batchPublish when invoked with a single spec performs a batch publish and returns a single result" time="0.151" classname="performs a batch publish and returns a single result">
    </testcase>
  </testsuite>
  <testsuite name="rest/batchPresence" timestamp="2026-03-03T13:48:54" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/batch.test.js" time="0.973" failures="0">
    <testcase name="rest/batchPresence performs a batch presence fetch and returns a result" time="0.973" classname="performs a batch presence fetch and returns a result">
    </testcase>
  </testsuite>
  <testsuite name="rest/revokeTokens" timestamp="2026-03-03T13:48:55" tests="3" file="/home/runner/work/ably-js/ably-js/test/rest/batch.test.js" time="0.554" failures="0">
    <testcase name="rest/revokeTokens revokes tokens matching the given specifiers" time="0.366" classname="revokes tokens matching the given specifiers">
    </testcase>
    <testcase name="rest/revokeTokens accepts optional issuedBefore and allowReauthMargin parameters" time="0.187" classname="accepts optional issuedBefore and allowReauthMargin parameters">
    </testcase>
    <testcase name="rest/revokeTokens throws an error when using token auth" time="0.000" classname="throws an error when using token auth">
    </testcase>
  </testsuite>
  <testsuite name="rest/bufferutils" timestamp="2026-03-03T13:48:56" tests="2" file="/home/runner/work/ably-js/ably-js/test/rest/bufferutils.test.js" time="0.001" failures="0">
    <testcase name="rest/bufferutils Basic encoding and decoding" time="0.000" classname="Basic encoding and decoding">
    </testcase>
    <testcase name="rest/bufferutils BufferUtils return correct types" time="0.000" classname="BufferUtils return correct types">
    </testcase>
  </testsuite>
  <testsuite name="rest/capability" timestamp="2026-03-03T13:48:56" tests="14" file="/home/runner/work/ably-js/ably-js/test/rest/capability.test.js" time="1.204" failures="0">
    <testcase name="rest/capability Blanket intersection with specified key" time="0.161" classname="Blanket intersection with specified key">
    </testcase>
    <testcase name="rest/capability Equal intersection with specified key" time="0.154" classname="Equal intersection with specified key">
    </testcase>
    <testcase name="rest/capability Empty ops intersection" time="0.069" classname="Empty ops intersection">
    </testcase>
    <testcase name="rest/capability Empty paths intersection" time="0.069" classname="Empty paths intersection">
    </testcase>
    <testcase name="rest/capability Ops intersection non-empty" time="0.067" classname="Ops intersection non-empty">
    </testcase>
    <testcase name="rest/capability Paths intersection non-empty" time="0.066" classname="Paths intersection non-empty">
    </testcase>
    <testcase name="rest/capability Wildcard token with publish and subscribe key" time="0.070" classname="Wildcard token with publish and subscribe key">
    </testcase>
    <testcase name="rest/capability Publish and subscribe token with wildcard key" time="0.068" classname="Publish and subscribe token with wildcard key">
    </testcase>
    <testcase name="rest/capability Resources wildcard matching 1" time="0.068" classname="Resources wildcard matching 1">
    </testcase>
    <testcase name="rest/capability Resources wildcard matching 2" time="0.066" classname="Resources wildcard matching 2">
    </testcase>
    <testcase name="rest/capability Resources wildcard matching 3" time="0.069" classname="Resources wildcard matching 3">
    </testcase>
    <testcase name="rest/capability Invalid capabilities 1" time="0.068" classname="Invalid capabilities 1">
    </testcase>
    <testcase name="rest/capability Invalid capabilities 2" time="0.068" classname="Invalid capabilities 2">
    </testcase>
    <testcase name="rest/capability Invalid capabilities 3" time="0.067" classname="Invalid capabilities 3">
    </testcase>
  </testsuite>
  <testsuite name="rest/defaults" timestamp="2026-03-03T13:48:57" tests="12" file="/home/runner/work/ably-js/ably-js/test/rest/defaults.test.js" time="0.000" failures="0">
    <testcase name="rest/defaults Init with no endpoint-related options" time="0.001" classname="Init with no endpoint-related options">
    </testcase>
    <testcase name="rest/defaults Init with given endpoint" time="0.000" classname="Init with given endpoint">
    </testcase>
    <testcase name="rest/defaults Init with given endpoint as FQDN" time="0.000" classname="Init with given endpoint as FQDN">
    </testcase>
    <testcase name="rest/defaults Init with given endpoint as IPv4 address" time="0.000" classname="Init with given endpoint as IPv4 address">
    </testcase>
    <testcase name="rest/defaults Init with given endpoint as IPv6 address" time="0.000" classname="Init with given endpoint as IPv6 address">
    </testcase>
    <testcase name="rest/defaults Init with given endpoint as localhost" time="0.000" classname="Init with given endpoint as localhost">
    </testcase>
    <testcase name="rest/defaults Init with given environment" time="0.000" classname="Init with given environment">
    </testcase>
    <testcase name="rest/defaults Init with local environment and non-default ports" time="0.000" classname="Init with local environment and non-default ports">
    </testcase>
    <testcase name="rest/defaults Init with given host" time="0.000" classname="Init with given host">
    </testcase>
    <testcase name="rest/defaults Init with given restHost and realtimeHost" time="0.000" classname="Init with given restHost and realtimeHost">
    </testcase>
    <testcase name="rest/defaults Init with no endpoint-related options and given default environment" time="0.000" classname="Init with no endpoint-related options and given default environment">
    </testcase>
    <testcase name="rest/defaults closeOnUnload" time="0.000" classname="closeOnUnload">
    </testcase>
  </testsuite>
  <testsuite name="normaliseOptions with useBinaryProtocol == true" timestamp="2026-03-03T13:48:57" tests="0" file="/home/runner/work/ably-js/ably-js/test/rest/defaults.test.js" time="0.000" failures="0">
  </testsuite>
  <testsuite name="given MsgPack implementation" timestamp="2026-03-03T13:48:57" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/defaults.test.js" time="0.000" failures="0">
    <testcase name="rest/defaults normaliseOptions with useBinaryProtocol == true given MsgPack implementation maintains useBinaryProtocol as true" time="0.000" classname="maintains useBinaryProtocol as true">
    </testcase>
  </testsuite>
  <testsuite name="given no MsgPack implementation" timestamp="2026-03-03T13:48:57" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/defaults.test.js" time="0.000" failures="0">
    <testcase name="rest/defaults normaliseOptions with useBinaryProtocol == true given no MsgPack implementation changes useBinaryProtocol to false" time="0.000" classname="changes useBinaryProtocol to false">
    </testcase>
  </testsuite>
  <testsuite name="rest/fallbacks" timestamp="2026-03-03T13:48:57" tests="2" file="/home/runner/work/ably-js/ably-js/test/rest/fallbacks.test.js" time="0.000" failures="0">
    <testcase name="rest/fallbacks Store working fallback" time="6.201" classname="Store working fallback">
    </testcase>
    <testcase name="rest/fallbacks Should use the primary domain as the first attempted for every connection attempt" time="6.131" classname="Should use the primary domain as the first attempted for every connection attempt">
    </testcase>
  </testsuite>
  <testsuite name="Max elapsed time for host retries" timestamp="2026-03-03T13:49:10" tests="2" file="/home/runner/work/ably-js/ably-js/test/rest/fallbacks.test.js" time="3.005" failures="0">
    <testcase name="rest/fallbacks Max elapsed time for host retries can timeout after default host" time="1.002" classname="can timeout after default host">
    </testcase>
    <testcase name="rest/fallbacks Max elapsed time for host retries can timeout after fallback host retries" time="2.002" classname="can timeout after fallback host retries">
    </testcase>
  </testsuite>
  <testsuite name="rest/history" timestamp="2026-03-03T13:49:13" tests="13" file="/home/runner/work/ably-js/ably-js/test/rest/history.test.js" time="16.656" failures="0">
    <testcase name="rest/history history_simple with binary protocol" time="1.082" classname="history_simple with binary protocol">
    </testcase>
    <testcase name="rest/history history_simple with text protocol" time="1.080" classname="history_simple with text protocol">
    </testcase>
    <testcase name="rest/history history_multiple with binary protocol" time="1.077" classname="history_multiple with binary protocol">
    </testcase>
    <testcase name="rest/history history_multiple with text protocol" time="1.077" classname="history_multiple with text protocol">
    </testcase>
    <testcase name="rest/history history_simple_paginated_b with binary protocol" time="1.987" classname="history_simple_paginated_b with binary protocol">
    </testcase>
    <testcase name="rest/history history_simple_paginated_b with text protocol" time="2.009" classname="history_simple_paginated_b with text protocol">
    </testcase>
    <testcase name="rest/history history_simple_paginated_f" time="2.248" classname="history_simple_paginated_f">
    </testcase>
    <testcase name="rest/history history_multiple_paginated_b" time="1.974" classname="history_multiple_paginated_b">
    </testcase>
    <testcase name="rest/history history_multiple_paginated_f" time="1.588" classname="history_multiple_paginated_f">
    </testcase>
    <testcase name="rest/history history_encoding_errors with binary protocol" time="1.113" classname="history_encoding_errors with binary protocol">
    </testcase>
    <testcase name="rest/history history_encoding_errors with text protocol" time="1.078" classname="history_encoding_errors with text protocol">
    </testcase>
    <testcase name="rest/history history_no_next_page with binary protocol" time="0.152" classname="history_no_next_page with binary protocol">
    </testcase>
    <testcase name="rest/history history_no_next_page with text protocol" time="0.187" classname="history_no_next_page with text protocol">
    </testcase>
  </testsuite>
  <testsuite name="rest/http" timestamp="2026-03-03T13:49:29" tests="2" file="/home/runner/work/ably-js/ably-js/test/rest/http.test.js" time="0.513" failures="0">
    <testcase name="rest/http Should send X-Ably-Version and Ably-Agent headers in get/post requests" time="0.512" classname="Should send X-Ably-Version and Ably-Agent headers in get/post requests">
    </testcase>
    <testcase name="rest/http Should handle no content responses" time="0.000" classname="Should handle no content responses">
    </testcase>
  </testsuite>
  <testsuite name="rest/init" timestamp="2026-03-03T13:49:30" tests="6" file="/home/runner/work/ably-js/ably-js/test/rest/init.test.js" time="0.153" failures="0">
    <testcase name="rest/init Init with key string" time="0.000" classname="Init with key string">
    </testcase>
    <testcase name="rest/init Init with token string" time="0.151" classname="Init with token string">
    </testcase>
    <testcase name="rest/init Init with tls: false" time="0.000" classname="Init with tls: false">
    </testcase>
    <testcase name="rest/init Init with tls: true" time="0.001" classname="Init with tls: true">
    </testcase>
    <testcase name="rest/init Init without any tls key should enable tls" time="0.000" classname="Init without any tls key should enable tls">
    </testcase>
    <testcase name="rest/init Init with clientId set to &apos;*&apos; or anything other than a string or null should error" time="0.000" classname="Init with clientId set to &apos;*&apos; or anything other than a string or null should error">
    </testcase>
  </testsuite>
  <testsuite name="rest/message" timestamp="2026-03-03T13:49:30" tests="8" file="/home/runner/work/ably-js/ably-js/test/rest/message.test.js" time="1.807" failures="0">
    <testcase name="rest/message Should implicitly send clientId when authenticated with clientId" time="0.153" classname="Should implicitly send clientId when authenticated with clientId">
    </testcase>
    <testcase name="rest/message Should publish clientId when provided explicitly in message" time="0.188" classname="Should publish clientId when provided explicitly in message">
    </testcase>
    <testcase name="rest/message Should error when clientId sent in message is different than authenticated clientId" time="0.224" classname="Should error when clientId sent in message is different than authenticated clientId">
    </testcase>
    <testcase name="rest/message Should error when publishing message larger than maxMessageSize" time="0.001" classname="Should error when publishing message larger than maxMessageSize">
    </testcase>
    <testcase name="rest/message Should send correct IDs when idempotentRestPublishing set to false" time="0.152" classname="Should send correct IDs when idempotentRestPublishing set to false">
    </testcase>
    <testcase name="rest/message Should add IDs when automatic idempotent rest publishing option enabled" time="0.149" classname="Should add IDs when automatic idempotent rest publishing option enabled">
    </testcase>
    <testcase name="rest/message Rest publish params" time="0.543" classname="Rest publish params">
    </testcase>
    <testcase name="rest/message allows you to publish a message on behalf of a Realtime connection by setting connectionKey on the message" time="0.394" classname="allows you to publish a message on behalf of a Realtime connection by setting connectionKey on the message">
    </testcase>
  </testsuite>
  <testsuite name="rest/presence" timestamp="2026-03-03T13:49:32" tests="4" file="/home/runner/work/ably-js/ably-js/test/rest/presence.test.js" time="0.224" failures="0">
    <testcase name="rest/presence Presence get simple" time="0.072" classname="Presence get simple">
    </testcase>
    <testcase name="rest/presence Presence history simple" time="0.080" classname="Presence history simple">
    </testcase>
    <testcase name="rest/presence Presence message JSON serialisation" time="0.071" classname="Presence message JSON serialisation">
    </testcase>
    <testcase name="rest/presence Presence get limits and filtering" time="0.000" classname="Presence get limits and filtering">
    </testcase>
  </testsuite>
  <testsuite name="rest/push" timestamp="2026-03-03T13:49:32" tests="9" file="/home/runner/work/ably-js/ably-js/test/rest/push.test.js" time="0.000" failures="0">
    <testcase name="rest/push Get subscriptions" time="0.478" classname="Get subscriptions">
    </testcase>
    <testcase name="rest/push Publish" time="0.338" classname="Publish">
    </testcase>
    <testcase name="rest/push deviceRegistrations save" time="0.535" classname="deviceRegistrations save">
    </testcase>
    <testcase name="rest/push deviceRegistrations get and list" time="0.822" classname="deviceRegistrations get and list">
    </testcase>
    <testcase name="rest/push deviceRegistrations remove removeWhere" time="1.044" classname="deviceRegistrations remove removeWhere">
    </testcase>
    <testcase name="rest/push channelSubscriptions save" time="0.434" classname="channelSubscriptions save">
    </testcase>
    <testcase name="rest/push channelSubscriptions get" time="0.587" classname="channelSubscriptions get">
    </testcase>
    <testcase name="rest/push push_channelSubscriptions_remove" time="0.331" classname="push_channelSubscriptions_remove">
    </testcase>
    <testcase name="rest/push channelSubscriptions listChannels" time="0.405" classname="channelSubscriptions listChannels">
    </testcase>
  </testsuite>
  <testsuite name="push activation" timestamp="2026-03-03T13:49:37" tests="13" file="/home/runner/work/ably-js/ably-js/test/rest/push.test.js" time="5.577" failures="0">
    <testcase name="rest/push push activation push_activation_succeeds" time="0.172" classname="push_activation_succeeds">
    </testcase>
    <testcase name="rest/push push activation device_push" time="0.566" classname="device_push">
    </testcase>
    <testcase name="rest/push push activation subscribe_client" time="0.480" classname="subscribe_client">
    </testcase>
    <testcase name="rest/push push activation subscribe_client_without_clientId" time="0.180" classname="subscribe_client_without_clientId">
    </testcase>
    <testcase name="rest/push push activation unsubscribe_client" time="0.774" classname="unsubscribe_client">
    </testcase>
    <testcase name="rest/push push activation direct_publish_client_id" time="0.358" classname="direct_publish_client_id">
    </testcase>
    <testcase name="rest/push push activation subscribe_device" time="0.435" classname="subscribe_device">
    </testcase>
    <testcase name="rest/push push activation unsubscribe_device" time="0.576" classname="unsubscribe_device">
    </testcase>
    <testcase name="rest/push push activation direct_publish_device_id" time="0.342" classname="direct_publish_device_id">
    </testcase>
    <testcase name="rest/push push activation push_channel_subscription_device_id" time="0.681" classname="push_channel_subscription_device_id">
    </testcase>
    <testcase name="rest/push push activation push_channel_subscription_client_id" time="0.858" classname="push_channel_subscription_client_id">
    </testcase>
    <testcase name="rest/push push activation failed_getting_device_details" time="0.001" classname="failed_getting_device_details">
    </testcase>
    <testcase name="rest/push push activation failed_registration" time="0.148" classname="failed_registration">
    </testcase>
  </testsuite>
  <testsuite name="rest/request" timestamp="2026-03-03T13:49:42" tests="16" file="/home/runner/work/ably-js/ably-js/test/rest/request.test.js" time="1.842" failures="0">
    <testcase name="rest/request request_version with binary protocol" time="0.000" classname="request_version with binary protocol">
    </testcase>
    <testcase name="rest/request request_version with text protocol" time="0.001" classname="request_version with text protocol">
    </testcase>
    <testcase name="rest/request request_time with binary protocol" time="0.064" classname="request_time with binary protocol">
    </testcase>
    <testcase name="rest/request request_time with text protocol" time="0.066" classname="request_time with text protocol">
    </testcase>
    <testcase name="rest/request request_404 with binary protocol" time="0.173" classname="request_404 with binary protocol">
    </testcase>
    <testcase name="rest/request request_404 with text protocol" time="0.162" classname="request_404 with text protocol">
    </testcase>
    <testcase name="rest/request request_network_error" time="0.006" classname="request_network_error">
    </testcase>
    <testcase name="rest/request request_post_get_messages with binary protocol" time="0.475" classname="request_post_get_messages with binary protocol">
    </testcase>
    <testcase name="rest/request request_post_get_messages with text protocol" time="0.352" classname="request_post_get_messages with text protocol">
    </testcase>
    <testcase name="rest/request request_batch_api_success with binary protocol" time="0.076" classname="request_batch_api_success with binary protocol">
    </testcase>
    <testcase name="rest/request request_batch_api_success with text protocol" time="0.072" classname="request_batch_api_success with text protocol">
    </testcase>
    <testcase name="rest/request checkput" time="0.131" classname="checkput">
    </testcase>
    <testcase name="rest/request checkpatch" time="0.131" classname="checkpatch">
    </testcase>
    <testcase name="rest/request checkdelete" time="0.130" classname="checkdelete">
    </testcase>
  </testsuite>
  <testsuite name="rest/stats" timestamp="2026-03-03T13:49:44" tests="11" file="/home/runner/work/ably-js/ably-js/test/rest/stats.test.js" time="17.663" failures="0">
    <testcase name="rest/stats contains expected fields" time="10.221" classname="contains expected fields">
    </testcase>
    <testcase name="rest/stats appstats_minute0" time="0.081" classname="appstats_minute0">
    </testcase>
    <testcase name="rest/stats appstats_minute1" time="0.071" classname="appstats_minute1">
    </testcase>
    <testcase name="rest/stats appstats_hour0" time="0.069" classname="appstats_hour0">
    </testcase>
    <testcase name="rest/stats appstats_limit_backwards" time="0.071" classname="appstats_limit_backwards">
    </testcase>
    <testcase name="rest/stats appstats_limit_forwards" time="0.073" classname="appstats_limit_forwards">
    </testcase>
    <testcase name="rest/stats appstats_pagination_backwards" time="0.293" classname="appstats_pagination_backwards">
    </testcase>
    <testcase name="rest/stats appstats_pagination_forwards" time="0.304" classname="appstats_pagination_forwards">
    </testcase>
    <testcase name="rest/stats appstats_pagination_omitted" time="0.287" classname="appstats_pagination_omitted">
    </testcase>
  </testsuite>
  <testsuite name="rest/status" timestamp="2026-03-03T13:50:02" tests="2" file="/home/runner/work/ably-js/ably-js/test/rest/status.test.js" time="0.259" failures="0">
    <testcase name="rest/status status0 with binary protocol" time="0.190" classname="status0 with binary protocol">
    </testcase>
    <testcase name="rest/status status0 with text protocol" time="0.067" classname="status0 with text protocol">
    </testcase>
  </testsuite>
  <testsuite name="rest/time" timestamp="2026-03-03T13:50:02" tests="1" file="/home/runner/work/ably-js/ably-js/test/rest/time.test.js" time="0.065" failures="0">
    <testcase name="rest/time time0" time="0.064" classname="time0">
    </testcase>
  </testsuite>
  <testsuite name="rest/message-operations" timestamp="2026-03-03T13:50:02" tests="13" file="/home/runner/work/ably-js/ably-js/test/rest/updates-deletes.test.js" time="5.606" failures="0">
    <testcase name="rest/message-operations Should return serials from publish" time="0.109" classname="Should return serials from publish">
    </testcase>
    <testcase name="rest/message-operations Should return multiple serials for batch publish" time="0.105" classname="Should return multiple serials for batch publish">
    </testcase>
    <testcase name="rest/message-operations Should retrieve a message by serial" time="0.634" classname="Should retrieve a message by serial">
    </testcase>
    <testcase name="rest/message-operations Should retrieve a message by passing a Message object" time="0.676" classname="Should retrieve a message by passing a Message object">
    </testcase>
    <testcase name="rest/message-operations Should update a message (with operation metadata)" time="0.716" classname="Should update a message (with operation metadata)">
    </testcase>
    <testcase name="rest/message-operations Should delete a message (with operation metadata)" time="0.648" classname="Should delete a message (with operation metadata)">
    </testcase>
    <testcase name="rest/message-operations Should retrieve all versions of a message" time="0.827" classname="Should retrieve all versions of a message">
    </testcase>
    <testcase name="rest/message-operations Should error when getMessage called without serial" time="0.000" classname="Should error when getMessage called without serial">
    </testcase>
    <testcase name="rest/message-operations Should error when updateMessage called without serial" time="0.000" classname="Should error when updateMessage called without serial">
    </testcase>
    <testcase name="rest/message-operations Should error when deleteMessage called without serial" time="0.000" classname="Should error when deleteMessage called without serial">
    </testcase>
    <testcase name="rest/message-operations Should error when getMessageVersions called without serial" time="0.001" classname="Should error when getMessageVersions called without serial">
    </testcase>
    <testcase name="rest/message-operations Should append to a message (with operation metadata)" time="1.886" classname="Should append to a message (with operation metadata)">
    </testcase>
    <testcase name="rest/message-operations Should error when appendMessage called without serial" time="0.000" classname="Should error when appendMessage called without serial">
    </testcase>
  </testsuite>
  <testsuite name="ErrorInfo" timestamp="2026-03-03T13:50:08" tests="0" file="/home/runner/work/ably-js/ably-js/test/unit/errorinfo.test.js" time="0.000" failures="0">
  </testsuite>
  <testsuite name="detail field" timestamp="2026-03-03T13:50:08" tests="7" file="/home/runner/work/ably-js/ably-js/test/unit/errorinfo.test.js" time="0.003" failures="0">
    <testcase name="ErrorInfo detail field should deserialise detail from server response via fromValues" time="0.000" classname="should deserialise detail from server response via fromValues">
    </testcase>
    <testcase name="ErrorInfo detail field should not include detail when absent in server response" time="0.000" classname="should not include detail when absent in server response">
    </testcase>
    <testcase name="ErrorInfo detail field should include detail in toString output when present" time="0.000" classname="should include detail in toString output when present">
    </testcase>
    <testcase name="ErrorInfo detail field should not include detail in toString when absent" time="0.000" classname="should not include detail in toString when absent">
    </testcase>
    <testcase name="ErrorInfo detail field should accept detail as a constructor parameter" time="0.000" classname="should accept detail as a constructor parameter">
    </testcase>
    <testcase name="ErrorInfo detail field should accept both cause and detail as constructor parameters" time="0.000" classname="should accept both cause and detail as constructor parameters">
    </testcase>
    <testcase name="ErrorInfo detail field should leave detail undefined when not passed to constructor" time="0.000" classname="should leave detail undefined when not passed to constructor">
    </testcase>
  </testsuite>
  <testsuite name="msgpack.encode()" timestamp="2026-03-03T13:50:08" tests="4" file="/home/runner/work/ably-js/ably-js/test/unit/msgpack.test.js" time="0.001" failures="0">
    <testcase name="msgpack.encode() should handle emoji in strings" time="0.000" classname="should handle emoji in strings">
    </testcase>
    <testcase name="msgpack.encode() should handle special characters in strings" time="0.000" classname="should handle special characters in strings">
    </testcase>
    <testcase name="msgpack.encode() should encode and then decode emojies in string" time="0.000" classname="should encode and then decode emojies in string">
    </testcase>
    <testcase name="msgpack.encode() should handle sparse encoding mode" time="0.000" classname="should handle sparse encoding mode">
    </testcase>
  </testsuite>
  <testsuite name="PresenceMap" timestamp="2026-03-03T13:50:08" tests="0" file="/home/runner/work/ably-js/ably-js/test/unit/presencemap.test.js" time="0.000" failures="0">
  </testsuite>
  <testsuite name="remove()" timestamp="2026-03-03T13:50:08" tests="3" file="/home/runner/work/ably-js/ably-js/test/unit/presencemap.test.js" time="4.684" failures="0">
    <testcase name="PresenceMap remove() should return false when no matching member present" time="0.000" classname="should return false when no matching member present">
    </testcase>
    <testcase name="PresenceMap remove() should return true when removing an (older) matching member" time="0.000" classname="should return true when removing an (older) matching member">
    </testcase>
    <testcase name="PresenceMap remove() should return false when trying to remove a newer matching member" time="0.000" classname="should return false when trying to remove a newer matching member">
    </testcase>
  </testsuite>
</testsuites>