summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Van Doorn <vandoorn.nick@gmail.com>2018-11-25 23:46:40 -0800
committerNick Van Doorn <vandoorn.nick@gmail.com>2018-11-25 23:46:44 -0800
commit21e6d7f4d024fd7cc637c7dc0c6ad80eee0bc1c0 (patch)
treec47b34b488f4ed14f82b1e558a953128235948ac
parent796dc5d7e37ca897eac82cc1b42e33238c243a0e (diff)
Implement fast.com download testing
-rw-r--r--src/test-services/fast/fast.ts54
1 files changed, 51 insertions, 3 deletions
diff --git a/src/test-services/fast/fast.ts b/src/test-services/fast/fast.ts
index ae5956d..2092a60 100644
--- a/src/test-services/fast/fast.ts
+++ b/src/test-services/fast/fast.ts
@@ -1,6 +1,45 @@
import { TestService } from '../../models/test-service.model'
import { Context } from '../../models/context.model'
-import fastTest from 'fast-speedtest-api'
+import puppeteer from 'puppeteer'
+import Observable from 'zen-observable'
+
+// lifted from here: https://github.com/sindresorhus/fast-cli
+// MIT License
+// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+async function init(browser, page, observer, prevSpeed?) {
+ const result = await page.evaluate(() => {
+ const $ = document.querySelector.bind(document)
+
+ return {
+ speed: Number($('#speed-value').textContent),
+ unit: $('#speed-units').textContent.trim(),
+ isDone: Boolean($('#speed-value.succeeded'))
+ }
+ })
+
+ if (result.speed > 0 && result.speed !== prevSpeed) {
+ observer.next(result)
+ }
+
+ if (result.isDone) {
+ browser.close()
+ observer.complete()
+ } else {
+ setTimeout(init, 100, browser, page, observer, result.speed)
+ }
+}
+
+const makeFastObservable = () =>
+ new Observable(observer => {
+ // Wrapped in async IIFE as `new Observable` can't handle async function
+ ;(async () => {
+ const browser = await puppeteer.launch({ args: ['--no-sandbox'] })
+ const page = await browser.newPage()
+
+ await page.goto('https://fast.com')
+ await init(browser, page, observer)
+ })().catch(observer.error.bind(observer))
+ })
// TODO looks like none of the pre-implemented fast.com
// modules do not support upload speed ;-;
@@ -8,10 +47,19 @@ export class Fast implements TestService {
name = 'Fast.com Speed Test'
constructor(private ctx: Context) {}
testDownload = async (): Promise<number> => {
- return 5
+ const readings = []
+ await makeFastObservable().forEach((result, i: number) => {
+ if (i > this.ctx.config.nTestSamples) {
+ return
+ } else {
+ readings.push(result.speed)
+ }
+ })
+ return readings.reduce((a, b) => a + b) / readings.length
}
+ // TODO implement
testUpload = async (): Promise<number> => {
- return 5
+ return -1
}
serverLocation = async (): Promise<string> => {
return 'Victoria, BC'