<testsuites name="Mocha Tests" time="294.436" tests="216" failures="19" skipped="12">
  <testsuite name="Root Suite" timestamp="2026-03-11T11:24:55" tests="0" time="0.000" failures="0">
  </testsuite>
  <testsuite name="realtime/annotations" timestamp="2026-03-11T11:24:55" tests="2" file="/home/runner/work/ably-js/ably-js/test/realtime/annotations.test.js" time="6.179" failures="0">
    <testcase name="realtime/annotations publish and subscribe annotations" time="1.483" classname="publish and subscribe annotations">
    </testcase>
    <testcase name="realtime/annotations get all annotations rest request" time="3.402" classname="get all annotations rest request">
    </testcase>
  </testsuite>
  <testsuite name="realtime/api" timestamp="2026-03-11T11:25:01" 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.000" 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.001" classname="Message">
    </testcase>
    <testcase name="realtime/api PresenceMessage" time="0.000" classname="PresenceMessage">
    </testcase>
  </testsuite>
  <testsuite name="realtime/auth" timestamp="2026-03-11T11:25:01" tests="84" file="/home/runner/work/ably-js/ably-js/test/realtime/auth.test.js" time="118.849" failures="4">
    <testcase name="realtime/auth authbase0" time="0.030" classname="authbase0">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_json" time="0.479" classname="auth_useAuthUrl_json">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_post_json" time="0.222" classname="auth_useAuthUrl_post_json">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_plainText" time="0.106" classname="auth_useAuthUrl_plainText">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenRequestResponse" time="0.293" classname="auth_useAuthCallback_tokenRequestResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenDetailsResponse" time="0.063" classname="auth_useAuthCallback_tokenDetailsResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthCallback_tokenStringResponse" time="0.117" classname="auth_useAuthCallback_tokenStringResponse">
    </testcase>
    <testcase name="realtime/auth auth_useAuthUrl_mixed_authParams_qsParams" time="0.186" classname="auth_useAuthUrl_mixed_authParams_qsParams">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance" time="0.091" classname="auth_clientid_inheritance">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance2" time="0.011" classname="auth_clientid_inheritance2">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance3" time="0.077" classname="auth_clientid_inheritance3">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance4" time="0.074" classname="auth_clientid_inheritance4">
    </testcase>
    <testcase name="realtime/auth auth_clientid_inheritance5" time="0.124" 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.102" classname="authCallback_timeout">
    </testcase>
    <testcase name="realtime/auth authCallback_nothing" time="0.001" classname="authCallback_nothing">
    </testcase>
    <testcase name="realtime/auth authCallback_malformed" time="0.001" classname="authCallback_malformed">
    </testcase>
    <testcase name="realtime/auth authCallback_too_long_string" time="0.013" classname="authCallback_too_long_string">
    </testcase>
    <testcase name="realtime/auth authCallback_empty_string" time="0.000" classname="authCallback_empty_string">
    </testcase>
    <testcase name="realtime/auth authUrl_timeout" time="0.100" classname="authUrl_timeout">
    </testcase>
    <testcase name="realtime/auth authUrl_404" time="0.026" classname="authUrl_404">
    </testcase>
    <testcase name="realtime/auth authUrl_wrong_content_type" time="0.019" classname="authUrl_wrong_content_type">
    </testcase>
    <testcase name="realtime/auth authUrl_401" time="0.073" classname="authUrl_401">
    </testcase>
    <testcase name="realtime/auth authUrl_double_encoded" time="0.073" classname="authUrl_double_encoded">
    </testcase>
    <testcase name="realtime/auth authUrl_403" time="0.072" classname="authUrl_403">
    </testcase>
    <testcase name="realtime/auth authUrl_403_custom_error" time="0.073" classname="authUrl_403_custom_error">
    </testcase>
    <testcase name="realtime/auth authUrl_403_previously_active" time="0.268" classname="authUrl_403_previously_active">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with web_socket binary protocol" time="5.003" classname="auth_token_expires with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with web_socket text protocol" time="5.005" classname="auth_token_expires with web_socket text protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with comet binary protocol" time="0.043" classname="auth_token_expires with comet binary protocol">
      <failure message="Verify correct disconnect statusCode: expected 410 to equal 401" type="AssertionError"><![CDATA[AssertionError: Verify correct disconnect statusCode: expected 410 to equal 401
    at Object.<anonymous> (test/realtime/auth.test.js:800:58)
    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 Connection.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/client/connection.ts:30:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

      + expected - actual

      -410
      +401
      ]]></failure>
    </testcase>
    <testcase name="realtime/auth auth_token_expires with comet text protocol" time="0.167" classname="auth_token_expires with comet text protocol">
      <failure message="Verify correct disconnect statusCode: expected 410 to equal 401" type="AssertionError"><![CDATA[AssertionError: Verify correct disconnect statusCode: expected 410 to equal 401
    at Object.<anonymous> (test/realtime/auth.test.js:800:58)
    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 Connection.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/client/connection.ts:30:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

      + expected - actual

      -410
      +401
      ]]></failure>
    </testcase>
    <testcase name="realtime/auth auth_token_expires with binary protocol" time="5.004" classname="auth_token_expires with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_token_expires with text protocol" time="5.004" classname="auth_token_expires with text protocol">
    </testcase>
    <testcase name="realtime/auth auth_query_time_once" time="0.009" classname="auth_query_time_once">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with web_socket binary protocol" time="5.035" 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.032" 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="0.036" classname="auth_tokenDetails_expiry_with_authcallback with comet binary protocol">
      <failure message="Verify correct disconnect code: expected 80016 to equal 40142" type="AssertionError"><![CDATA[AssertionError: Verify correct disconnect code: expected 80016 to equal 40142
    at Object.<anonymous> (test/realtime/auth.test.js:907:50)
    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 Connection.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/client/connection.ts:30:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

      + expected - actual

      -80016
      +40142
      ]]></failure>
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with comet text protocol" time="5.044" 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.120" classname="auth_tokenDetails_expiry_with_authcallback with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_tokenDetails_expiry_with_authcallback with text protocol" time="5.033" 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.072" 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.062" 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.036" 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="0.157" classname="auth_token_string_expiry_with_authcallback with comet text protocol">
      <failure message="Verify correct disconnect code: expected 80016 to equal 40142" type="AssertionError"><![CDATA[AssertionError: Verify correct disconnect code: expected 80016 to equal 40142
    at Object.<anonymous> (test/realtime/auth.test.js:956:50)
    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 Connection.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/client/connection.ts:30:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

      + expected - actual

      -80016
      +40142
      ]]></failure>
    </testcase>
    <testcase name="realtime/auth auth_token_string_expiry_with_authcallback with binary protocol" time="5.035" 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.033" 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.004" 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.005" 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.006" 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.004" 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.005" 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.004" 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.300" 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.132" 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.227" classname="auth_expired_token_string with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with comet text protocol" time="0.134" classname="auth_expired_token_string with comet text protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with binary protocol" time="0.133" classname="auth_expired_token_string with binary protocol">
    </testcase>
    <testcase name="realtime/auth auth_expired_token_string with text protocol" time="0.134" 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.047" classname="mocked_reauth">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_clientid" time="0.267" classname="auth_jwt_with_clientid">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_clientid_application_jwt" time="0.093" classname="auth_jwt_with_clientid_application_jwt">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_subscribe_only_capability" time="0.111" classname="auth_jwt_with_subscribe_only_capability">
    </testcase>
    <testcase name="realtime/auth realtime client mirrors the auth clientId" time="0.093" classname="realtime client mirrors the auth clientId">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_publish_capability" time="0.102" classname="auth_jwt_with_publish_capability">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_token_that_expires" time="4.435" classname="auth_jwt_with_token_that_expires">
    </testcase>
    <testcase name="realtime/auth auth_jwt_with_token_that_renews" time="5.075" classname="auth_jwt_with_token_that_renews">
    </testcase>
    <testcase name="realtime/auth init_client_with_simple_jwt_token" time="0.092" classname="init_client_with_simple_jwt_token">
    </testcase>
    <testcase name="realtime/auth reauth_consistently_expired_token" time="3.115" classname="reauth_consistently_expired_token">
    </testcase>
    <testcase name="realtime/auth expired_token_no_autoremove_when_dont_have_servertime" time="0.035" classname="expired_token_no_autoremove_when_dont_have_servertime">
    </testcase>
    <testcase name="realtime/auth expired_token_autoremove_when_have_servertime" time="0.040" classname="expired_token_autoremove_when_have_servertime">
    </testcase>
    <testcase name="realtime/auth multiple_concurrent_authorize" time="0.072" classname="multiple_concurrent_authorize">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with web_socket binary protocol" time="0.136" 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.107" 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.040" classname="authorize_immediately_after_init with comet binary protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with comet text protocol" time="0.037" classname="authorize_immediately_after_init with comet text protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with binary protocol" time="0.036" classname="authorize_immediately_after_init with binary protocol">
    </testcase>
    <testcase name="realtime/auth authorize_immediately_after_init with text protocol" time="0.035" classname="authorize_immediately_after_init with text protocol">
    </testcase>
  </testsuite>
  <testsuite name="realtime/channel" timestamp="2026-03-11T11:27:00" tests="124" file="/home/runner/work/ably-js/ably-js/test/realtime/channel.test.js" time="169.392" failures="15">
    <testcase name="realtime/channel channelinit0 with web_socket binary protocol" time="0.024" classname="channelinit0 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with web_socket text protocol" time="0.023" classname="channelinit0 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with comet binary protocol" time="0.049" classname="channelinit0 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with comet text protocol" time="0.018" classname="channelinit0 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with binary protocol" time="0.024" classname="channelinit0 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelinit0 with text protocol" time="0.024" classname="channelinit0 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with web_socket binary protocol" time="0.033" classname="channelattach0 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with web_socket text protocol" time="0.027" classname="channelattach0 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with comet binary protocol" time="6.074" classname="channelattach0 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with comet binary protocol" time="6.074" classname="channelattach0 with comet binary protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel channelattach0 with comet binary protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel channelattach0 with comet binary protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.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 NodeCometTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/transport/comettransport.ts:203:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel channelattach0 with comet text protocol" time="0.039" classname="channelattach0 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with binary protocol" time="0.024" classname="channelattach0 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach0 with text protocol" time="0.028" classname="channelattach0 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with web_socket binary protocol" time="0.032" classname="channelattach2 with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with web_socket text protocol" time="0.027" classname="channelattach2 with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with comet binary protocol" time="0.065" classname="channelattach2 with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with comet text protocol" time="0.073" classname="channelattach2 with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with binary protocol" time="0.032" classname="channelattach2 with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach2 with text protocol" time="0.029" classname="channelattach2 with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with web_socket binary protocol" time="1.029" classname="channelattachempty with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with web_socket text protocol" time="1.031" classname="channelattachempty with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with comet binary protocol" time="1.035" classname="channelattachempty with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with comet text protocol" time="2.071" classname="channelattachempty with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with binary protocol" time="1.030" classname="channelattachempty with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachempty with text protocol" time="1.046" classname="channelattachempty with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with web_socket binary protocol" time="1.030" classname="channelattachinvalid with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with web_socket text protocol" time="1.034" classname="channelattachinvalid with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with comet binary protocol" time="1.042" classname="channelattachinvalid with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with comet text protocol" time="1.039" classname="channelattachinvalid with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with binary protocol" time="1.029" classname="channelattachinvalid with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattachinvalid with text protocol" time="1.028" classname="channelattachinvalid with text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with web_socket binary protocol" time="0.038" classname="publish_no_attach with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with web_socket text protocol" time="0.032" classname="publish_no_attach with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with comet binary protocol" time="3.195" classname="publish_no_attach with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with comet text protocol" time="0.038" classname="publish_no_attach with comet text protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with binary protocol" time="0.034" classname="publish_no_attach with binary protocol">
    </testcase>
    <testcase name="realtime/channel publish_no_attach with text protocol" time="0.034" classname="publish_no_attach with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with web_socket binary protocol" time="0.029" classname="channelattach_publish_invalid with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with web_socket text protocol" time="0.029" classname="channelattach_publish_invalid with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with comet binary protocol" time="7.090" classname="channelattach_publish_invalid with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with comet text protocol" time="1.087" classname="channelattach_publish_invalid with comet text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with binary protocol" time="0.026" classname="channelattach_publish_invalid with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_publish_invalid with text protocol" time="0.028" classname="channelattach_publish_invalid with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with web_socket binary protocol" time="1.047" classname="channelattach_invalid_twice with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with web_socket text protocol" time="1.039" classname="channelattach_invalid_twice with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with comet binary protocol" time="1.075" classname="channelattach_invalid_twice with comet binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with comet text protocol" time="2.069" classname="channelattach_invalid_twice with comet text protocol">
      <failure message="Client should still be connected: expected false to be truthy" type="AssertionError"><![CDATA[AssertionError: Client should still be connected: expected false to be truthy
    at Timeout._onTimeout (test/realtime/channel.test.js:459:116)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)]]></failure>
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with binary protocol" time="1.032" classname="channelattach_invalid_twice with binary protocol">
    </testcase>
    <testcase name="realtime/channel channelattach_invalid_twice with text protocol" time="1.038" classname="channelattach_invalid_twice with text protocol">
    </testcase>
    <testcase name="realtime/channel channelattachWhenState" time="0.061" classname="channelattachWhenState">
    </testcase>
    <testcase name="realtime/channel channelattachOnceOrIfBefore" time="0.032" classname="channelattachOnceOrIfBefore">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with web_socket binary protocol" time="1.063" classname="attachWithChannelParamsBasicChannelsGet with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with web_socket text protocol" time="1.055" classname="attachWithChannelParamsBasicChannelsGet with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet binary protocol" time="5.102" classname="attachWithChannelParamsBasicChannelsGet with comet binary protocol">
      <failure message="done() invoked with non-Error: checkCanSubscribe: message not received within 5s" type="Error"><![CDATA[Error: done() invoked with non-Error: checkCanSubscribe: message not received within 5s
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:291:11
    at processTicksAndRejections (node:internal/process/task_queues:78:11)
    at runNextTicks (node:internal/process/task_queues:65:3)
    at listOnTimeout (node:internal/timers:528:9)
    at processTimers (node:internal/timers:502:7)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet binary protocol" time="5.102" classname="attachWithChannelParamsBasicChannelsGet with comet binary protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel attachWithChannelParamsBasicChannelsGet with comet binary protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel attachWithChannelParamsBasicChannelsGet with comet binary protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:291:11
    at processTicksAndRejections (node:internal/process/task_queues:78:11)
    at runNextTicks (node:internal/process/task_queues:65:3)
    at listOnTimeout (node:internal/timers:528:9)
    at processTimers (node:internal/timers:502:7)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet text protocol" time="5.078" classname="attachWithChannelParamsBasicChannelsGet with comet text protocol">
      <failure message="done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish" type="Error"><![CDATA[Error: done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish
    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 NodeCometTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/transport/comettransport.ts:203:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with comet text protocol" time="5.078" classname="attachWithChannelParamsBasicChannelsGet with comet text protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel attachWithChannelParamsBasicChannelsGet with comet text protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel attachWithChannelParamsBasicChannelsGet with comet text protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:291:11
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with binary protocol" time="1.063" classname="attachWithChannelParamsBasicChannelsGet with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicChannelsGet with text protocol" time="1.053" classname="attachWithChannelParamsBasicChannelsGet with text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with web_socket binary protocol" time="1.064" classname="attachWithChannelParamsBasicSetOptions with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with web_socket text protocol" time="1.057" classname="attachWithChannelParamsBasicSetOptions with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet binary protocol" time="0.121" classname="attachWithChannelParamsBasicSetOptions with comet binary protocol">
      <failure message="done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish" type="Error"><![CDATA[Error: done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish
    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 NodeCometTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/transport/comettransport.ts:203:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet binary protocol" time="0.121" classname="attachWithChannelParamsBasicSetOptions with comet binary protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel attachWithChannelParamsBasicSetOptions with comet binary protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel attachWithChannelParamsBasicSetOptions with comet binary protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:291:11
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet text protocol" time="6.093" classname="attachWithChannelParamsBasicSetOptions with comet text protocol">
      <failure message="done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish" type="Error"><![CDATA[Error: done() invoked with non-Error: checkCantPublish: unexpectedly allowed to publish
    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 NodeCometTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/transport/comettransport.ts:203:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with comet text protocol" time="6.093" classname="attachWithChannelParamsBasicSetOptions with comet text protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel attachWithChannelParamsBasicSetOptions with comet text protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel attachWithChannelParamsBasicSetOptions with comet text protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js; in addition, done() received error: [_ErrorInfo: Connection closed; statusCode=400; code=80017; see https://help.ably.io/error/80017 ]
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:212:9
    at /home/runner/work/ably-js/ably-js/test/common/modules/shared_helper.js:291:11
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with binary protocol" time="1.053" classname="attachWithChannelParamsBasicSetOptions with binary protocol">
    </testcase>
    <testcase name="realtime/channel attachWithChannelParamsBasicSetOptions with text protocol" time="1.055" classname="attachWithChannelParamsBasicSetOptions with text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with web_socket binary protocol" time="0.036" classname="subscribeAfterSetOptions with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with web_socket text protocol" time="0.029" classname="subscribeAfterSetOptions with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with comet binary protocol" time="60.000" classname="subscribeAfterSetOptions with comet binary protocol">
      <failure message="Timeout of 60000ms exceeded. For async tests and hooks, ensure &quot;done()&quot; is called; if returning a Promise, ensure it resolves. (/home/runner/work/ably-js/ably-js/test/realtime/channel.test.js)" type="Error"><![CDATA[Error: Timeout of 60000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/runner/work/ably-js/ably-js/test/realtime/channel.test.js)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)]]></failure>
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with comet text protocol" time="40.126" classname="subscribeAfterSetOptions with comet text protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with comet text protocol" time="40.126" classname="subscribeAfterSetOptions with comet text protocol">
      <failure message="done() called multiple times in test &lt;realtime/channel subscribeAfterSetOptions with comet text protocol&gt; of file /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js" type="Error"><![CDATA[Error: done() called multiple times in test <realtime/channel subscribeAfterSetOptions with comet text protocol> of file /home/runner/work/ably-js/ably-js/test/realtime/channel.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 NodeCometTransport.emit (src/common/lib/util/eventemitter.ts:219:15)
    at /home/runner/work/ably-js/ably-js/src/common/lib/transport/comettransport.ts:203:14
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with binary protocol" time="0.036" classname="subscribeAfterSetOptions with binary protocol">
    </testcase>
    <testcase name="realtime/channel subscribeAfterSetOptions with text protocol" time="0.033" classname="subscribeAfterSetOptions with text protocol">
    </testcase>
    <testcase name="realtime/channel channelGetShouldThrowWhenWouldCauseReattach" time="0.054" classname="channelGetShouldThrowWhenWouldCauseReattach">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with web_socket binary protocol" time="0.056" classname="setOptionsCallbackBehaviour with web_socket binary protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with web_socket text protocol" time="0.039" classname="setOptionsCallbackBehaviour with web_socket text protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with comet binary protocol" time="0.087" classname="setOptionsCallbackBehaviour with comet binary protocol">
      <failure message="Check channel went to the server to update the channel params: expected false to be truthy" type="AssertionError"><![CDATA[AssertionError: Check channel went to the server to update the channel params: expected false to be truthy
    at /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js:773:27
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
    <testcase name="&quot;after each&quot; hook in &quot;{root}&quot;" time="0.000" classname="&quot;after each&quot; hook in &quot;{root}&quot;">
      <failure message="done() called multiple times in hook &lt;&quot;after each&quot; hook in &quot;{root}&quot;&gt; (of root suite); in addition, done() received error: AssertionError: Check channel went to the server to update the channel mode: expected false to be truthy
    at /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js:793:116
    at processTicksAndRejections (node:internal/process/task_queues:78:11) {
  showDiff: false,
  actual: false,
  expected: undefined,
  operator: &apos;strictEqual&apos;,
  uncaught: true
}" type="Error"><![CDATA[Error: done() called multiple times in hook <"after each" hook in "{root}"> (of root suite); in addition, done() received error: AssertionError: Check channel went to the server to update the channel mode: expected false to be truthy
    at /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js:793:116
    at processTicksAndRejections (node:internal/process/task_queues:78:11) {
  showDiff: false,
  actual: false,
  expected: undefined,
  operator: 'strictEqual',
  uncaught: true
}
    at process.emit (node:events:525:35)
    at process.emit (node_modules/source-map-support/source-map-support.js:516:21)
    at process._fatalException (node:internal/process/execution:149:25)]]></failure>
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with comet text protocol" time="0.086" classname="setOptionsCallbackBehaviour with comet text protocol">
    </testcase>
    <testcase name="realtime/channel setOptionsCallbackBehaviour with comet text protocol" time="0.086" classname="setOptionsCallbackBehaviour with comet text protocol">
      <failure message="Check channel went to the server to update the channel params: expected false to be truthy" type="AssertionError"><![CDATA[AssertionError: Check channel went to the server to update the channel params: expected false to be truthy
    at /home/runner/work/ably-js/ably-js/test/realtime/channel.test.js:773:27
    at processTicksAndRejections (node:internal/process/task_queues:78:11)]]></failure>
    </testcase>
  </testsuite>
</testsuites>