From 0d822984e4b3abcd6382ea1c30359a187680f2ce Mon Sep 17 00:00:00 2001 From: Jitendra Date: Tue, 18 Oct 2022 21:09:10 +0700 Subject: [PATCH] feat: support fallback browser paths with brave --- internal/fast/fast.go | 78 ++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/internal/fast/fast.go b/internal/fast/fast.go index 626cb0f..d1c38c1 100644 --- a/internal/fast/fast.go +++ b/internal/fast/fast.go @@ -2,15 +2,29 @@ package fast import ( "context" + "errors" "fmt" "log" "os" + "os/exec" + "runtime" + "strings" "time" "github.com/chromedp/cdproto/emulation" "github.com/chromedp/chromedp" ) +// Browsers is list of non default browsers by OS +var Browsers = map[string][]string{ + "windows": {"", `C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe`}, + "darwin": {"", `/Applications/Brave Browser.app/Contents/MacOS/BraveBrowser`}, + "*": {"", `brave`, `brave-browser`}, +} + +// NoColor tells if color should be used +var NoColor = os.Getenv("NO_COLOR") != "" || os.Getenv("TERM") == "dumb" + // Fast represents measurement structure type Fast struct { Up string @@ -22,18 +36,9 @@ type Fast struct { // Measure does the main job. // It returns *Fast and error func Measure(noUp bool) (*Fast, error) { - ctx, cancel := chromedp.NewContext( - context.Background(), - chromedp.WithLogf(log.Printf), - ) - defer cancel() - - ctx, cancel = context.WithTimeout(ctx, 180*time.Second) - defer cancel() - fast := new(Fast) cmds := []chromedp.Action{ - emulation.SetUserAgentOverride(`chromedp/chromedp v0.6.10`), + emulation.SetUserAgentOverride(`chromedp/chromedp v0.8.6`), chromedp.Navigate(`https://fast.com`), chromedp.ScrollIntoView(`footer`), chromedp.WaitVisible(`#speed-value.succeeded`), @@ -49,11 +54,38 @@ func Measure(noUp bool) (*Fast, error) { ) } - err := chromedp.Run(ctx, cmds...) + browsers := Browsers["*"] + if paths, ok := Browsers[runtime.GOOS]; ok { + browsers = paths + } + + var err error + for _, browser := range browsers { + err = doMeasure(browser, fast, cmds...) + if err == nil || !errors.Is(err, exec.ErrNotFound) { + break + } + } return fast, err } +func doMeasure(browser string, fast *Fast, cmds ...chromedp.Action) error { + opts := chromedp.DefaultExecAllocatorOptions[:] + if browser != "" { + opts = append(opts, chromedp.ExecPath(browser)) + } + + allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...) + defer cancel() + ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf)) + defer cancel() + ctx, cancel = context.WithTimeout(ctx, 180*time.Second) + defer cancel() + + return chromedp.Run(ctx, cmds...) +} + // Run is the ready to use API. // For customization call Measure(). func Run(noUp bool) { @@ -71,22 +103,16 @@ func Run(noUp bool) { func Out(fast *Fast, start time.Time) { hasUp := fast.Up != "" && fast.UpUnit != "" - // No color for windows - if os.PathSeparator == '\\' { - fmt.Printf("download speed: %s %s\n", fast.Down, fast.DownUnit) - if hasUp { - fmt.Printf("upload speed: %s %s\n", fast.Up, fast.UpUnit) - } - fmt.Printf("\n") - fmt.Printf("> took: %f secs\n", time.Since(start).Seconds()) - - return + out := fmt.Sprintf("\033[36mdownload speed:\033[m \033[32m%s\033[m %s\n", fast.Down, fast.DownUnit) + if hasUp { + out += fmt.Sprintf("\033[36mupload speed: \033[m \033[31m%s\033[m %s\n", fast.Up, fast.UpUnit) } + out += fmt.Sprintf("\n\033[36m> took: \033[33m%f\033[m secs\n", time.Since(start).Seconds()) - fmt.Printf("\033[36mdownload speed:\033[m \033[32m%s\033[m %s\n", fast.Down, fast.DownUnit) - if hasUp { - fmt.Printf("\033[36mupload speed:\033[m \033[31m%s\033[m %s\n", fast.Up, fast.UpUnit) + if NoColor { + out = strings.ReplaceAll(strings.ReplaceAll(out, "\033[36m", ""), "\033[m", "") + out = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(out, "\033[33m", ""), "\033[32m", ""), "\033[31m", "") } - fmt.Printf("\n") - fmt.Printf("\033[36m> took: \033[33m%f\033[m secs\n", time.Since(start).Seconds()) + + fmt.Print(out) }