Open Bug 1987944 Opened 1 year ago Updated 24 days ago

Verizon speedtest never starts

Categories

(Web Compatibility :: Site Reports, defect, P2)

Tracking

(Webcompat Priority:P2, Webcompat Score:5)

Webcompat Priority P2
Webcompat Score 5

People

(Reporter: jesup, Unassigned, NeedInfo)

References

(Blocks 1 open bug, )

Details

(Keywords: webcompat:needs-diagnosis, webcompat:site-report, Whiteboard: [webcompat:sightline][webcompat:core][autowebcompat:processed][autowebcompat:repro-failed])

User Story

user-impact-score:180
platform:windows,mac,linux,android
impact:feature-broken
configuration:general
affects:some
branch:release
diagnosis-team:networking
autowebcompat-repro-status:failed
autowebcompat-repro-reason:not_reproducible
autowebcompat-repro-report-os:all

https://verizon.com/speedtest rarely actually starts measuring in firefox for me. Two machines (both windows).

STR: go to the URL. Click on Get Started under the Mbps image. You get three throbbing dots, then it puts up a test info page with a completion and up and down numbers, with an animation. It should start measuring. It never actually gets past 0% or shows numbers other than 0Mbps

Jeff and Holger also tried; it failed for them, though both were able to somehow get it to work by playing around in devtools (pause and resume for Holger). These tricks didn't work for me

Jeff sees network requests to sites I don't see in my profile: https://share.firefox.dev/488zApo

Perhaps this is an order-of-settimeout-firings issue; jeff indicated that the load of the relevant scripts is kicked off from a settimeout

Whiteboard: [webcompat:sightline]

I think the relevant setTimeout is here:

      Object(o.useEffect) (
        (
          function () {
            setTimeout((function () {
              v(0),
              Fr = setInterval(S, 4000)
            }), 1000)
          }
        ),
        []
      ),

And that seemed triggered by this setTimeout:

                    setTimeout((function () {
                      m(!0)
                    }), 5800) : g != e.data.OneClickInitializedFieldsData.exceededAttempt &&

And that is triggered by the load event on: https://www.verizon.com/SpeedTest/SpeedTestHandler.ashx?oneclickservicename=loadAllConfig&lobtype=null&LanIPAddress=undefined&isCustomerLoggedin=N&cusLoggedInVz=undefined&sessionid=null&rapsessionid=null&dnmstate=null&flow=SEOFIOSDIGITAL

In the triage meeting this seemed to work the same in Chrome and Firefox for people on macOS and Linux. If it's still reproducible on Windows, could someone diagnosing the bug set the triage flags?

User Story: (updated)
Webcompat Score: --- → 1
Flags: needinfo?(rjesup)

It seems random if it will start the test or just sit there; I've seen it fail or work randomly on one Windows machine; on a linux machine it seems to permafail, but windows seemed to be permafail before for me two. A different profile (running a local opt build) worked for me the only time I tried it on linux, so as I said it appears to be flaky (i.e. likely there's a race condition in their code).

Flags: needinfo?(rjesup)
Severity: -- → S4
User Story: (updated)
Webcompat Priority: --- → P2
Webcompat Score: 1 → 5
Priority: -- → P2

I can repro on 143 on Fedora and nightly on Windows.

Looking at this more I see the download test initiated here:

 downloadTest
https://www.verizon.com/speedtest/src/Ndt/ndt7-download-worker.js:82:12
workerMain
https://www.verizon.com/speedtest/src/Ndt/ndt7-download-worker.js:34:25

It's open a websocket: wss://nwrknjmd-0354336e-inet.vzbi.com:4443/ndt/v7/download?vpimTestUUID=253ca89c-4649-484b-b4c8-f9345dec63c1&vpimTestThreadNumber=7&vpimTestThreadIndex=2

Randal is seeing the code from comment 2 being hit but not seeing ndt7-download-worker.js

The workers are created in https://www.verizon.com/speedtest/ak-cached/1w/js/bundle.js here:

                        case 0:
                          if (
                            !0 === t.userAcceptedDataPolicy ||
                            !0 === t.mlabDataPolicyInapplicable
                          ) {
                            e.next = 3;
                            break
                          }
                          return n.error(
                            'The M-Lab data policy is applicable and the user has not explicitly accepted that data policy.'
                          ),
                          e.abrupt('return', 1);
                        case 3:
                          return s = new Worker(r),
                          f = new Promise(

https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js

        var xP = e => {
            let t = "WebSocket"
              , o = e[t];
            if (o) {
                let n = function(...r) {
                    if (W())
                        return new o(...r);
                    let[i] = r
                      , a = new Q({
                        type: "websocket",
                        url: typeof i == "string" ? i : i.href
                    })
                      , c = a.serialize()
                      , p = "[native";
                    if (oe(a))
                        return `${c}` != `${i}` && (r[0] = c),
                        new o(...r);
                    throw io(t, c)
                };
                n.prototype = o.prototype,
                n.prototype.constructor = n,
                b(["CONNECTING", "OPEN", "CLOSING", "CLOSED"], r => {
                    let i = zt(o, r);
                    i && ge(n, r, i)
                }
                ),
                e[t] = n
            }
        }
        ;

This function is called with the following call stack:

xP (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#10594)
GP (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#10893)
Ir (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#10935)
TN (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#15687)
Yh (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#15553)
<anonymous> (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#15794)
<anonymous> (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#15796)
(global) (https://scache-ws.vzw.com/vendor/transcend/vcg/airgap.js:formatted#15798)

But the inner function n() is only called on Chrome but not on Firefox. The call stack for n in Chrome is:

n (airgap.js:10)
(anonymous) (bundle.js:2)
S (bundle.js:2)
(anonymous) (bundle.js:2)
Promise.then
(anonymous) (bundle.js:2)
E (bundle.js:2)
(anonymous) (bundle.js:2)
d (bundle.js:2)
(anonymous) (bundle.js:2)
(anonymous) (bundle.js:2)
n (bundle.js:2)
l (bundle.js:2)
(anonymous) (bundle.js:2)
(anonymous) (bundle.js:2)
(anonymous) (bundle.js:2)
T (bundle.js:2)
(anonymous) (bundle.js:311)
setTimeout
(anonymous) (bundle.js:311)
fl (bundle.js:2)
Au (bundle.js:2)
t.unstable_runWithPriority (bundle.js:2)
Yo (bundle.js:2)
Iu (bundle.js:2)
(anonymous) (bundle.js:2)
z (bundle.js:2)
S.port1.onmessage (bundle.js:2)
postMessage
r (bundle.js:2)
t.unstable_scheduleCallback (bundle.js:2)
Qo (bundle.js:2)
hu (bundle.js:2)
fu (bundle.js:2)
Ei (bundle.js:2)
(anonymous) (bundle.js:311)
setTimeout
(anonymous) (bundle.js:311)

The Chrome call stack includes: https://www.verizon.com/speedtest/ak-cached/1w/js/bundle.js

                            E = function (e, t) {
                              return console.log('entered fetchServerList', t),
                              new Promise(
                                (
                                  function (e, t) {
                                    var r = n.oneclickInitialiseFieldsData.regionCode.toUpperCase();
                                    console.log('regionCode', r, '-');
                                    var o = '';
                                    o = 'https://www.verizon.com'.includes('www.verizon.com') ? fetch(
                                      'https://WASKDCFN-0222304B-INET.vzbi.com:8081/api/ndtServers'
                                    ) : fetch(
                                      'https://WASKDCFN-0222304B-INET.vzbi.com:8081/api/ndtServers',
                                      {
                                        method: 'GET',
                                        headers: {
                                          'Content-Type': 'application/json'
                                        },
                                        proxy: 'https://proxy.ebiz.verizon.com:9290'
                                      }
                                    ),
                                    console.log('fetchApiURL:', o),
                                    o.then((function (e) {
                                      return e.json()
                                    })).then((function (e) {
                                      return _(r, e)
                                    })).then(
                                      (
                                        function (t) {
                                          return Promise.allSettled(t.map(S)).then(
                                            (
                                              function (t) {
                                                var n = t.filter((function (e) {
                                                  return 'fulfilled' === e.status
                                                })).map((function (e) {
                                                  return e.value
                                                }));
                                                e(n),
                                                console.log('End of fetchServerList :' + n)
                                              }
                                            )
                                          )
                                        }
                                      )
                                    ).catch(
                                      (
                                        function (e) {
                                          console.log('test failed', e),
                                          k(
                                            'SET_IS_ERRORED',
                                            {
                                              isErrored: !0,
                                              whoInvoked: '',
                                              reqID: '',
                                              error: 'connection error'
                                            }
                                          )
                                        }
                                      )
                                    )
                                  }
                                )
                              )
                            },

The call to WebSocket is done via Promise.allSettled(t.map(S)). Interestingly I found that the promise from fetch('https://WASKDCFN-0222304B-INET.vzbi.com:8081/api/ndtServers') never resolves, nor it shows up in the network log in devtools. This blocks S being called, and thus passing it to networking.

User Story: (updated)
Whiteboard: [webcompat:sightline] → [webcompat:sightline][webcompat:core]

I tested this with a new profile, and it worked.

83
Mbps
UPLOAD
72
Mbps
Current upload speed is 00 Mbps.
Better matters. Find out why
IP : 169.150.254.133
Latency : 135 ms
Server Location : Dallas, TX

Whiteboard: [webcompat:sightline][webcompat:core] → [webcompat:sightline][webcompat:core][autowebcompat:processed]
User Story: (updated)
Whiteboard: [webcompat:sightline][webcompat:core][autowebcompat:processed] → [webcompat:sightline][webcompat:core][autowebcompat:processed][autowebcompat:repro-failed]

Randell, can you still reproduce this?

User Story: (updated)
Flags: needinfo?(rjesup)
You need to log in before you can comment on or make changes to this bug.