Commit 9056293
Changed files (2)
cmd
cmd/speedtest.go
@@ -1,7 +1,9 @@
package cmd
import (
+ "context"
"fmt"
+ "time"
"github.com/kahnwong/swissknife/color"
"github.com/rs/zerolog/log"
@@ -13,38 +15,65 @@ var SpeedTestCmd = &cobra.Command{
Use: "speedtest",
Short: "Speedtest",
Run: func(cmd *cobra.Command, args []string) {
- // https://github.com/showwin/speedtest-go#api-usage
+ // ref: <https://github.com/showwin/speedtest-go#api-usage>
var speedtestClient = speedtest.New()
-
serverList, _ := speedtestClient.FetchServers()
targets, _ := serverList.FindServer([]int{})
- for _, s := range targets {
- fmt.Printf("%s: %s\n", color.Green("Server"), s.Name)
+ // start tests
+ var s *speedtest.Server
+ tests := make(chan struct{})
+ ctx, cancel := context.WithCancel(context.Background())
- err := s.PingTest(nil)
- if err != nil {
- log.Fatal().Err(err).Msg("Error pinging server")
- }
+ // -- background progress report -- //
+ go func(ctx context.Context) {
+ for {
+ select {
+ case <-ctx.Done():
+ tests <- struct{}{}
+ return
+ default:
+ fmt.Print(".") // for progress report
+ }
- err = s.DownloadTest()
- if err != nil {
- log.Fatal().Err(err).Msg("Error testing download speed")
+ time.Sleep(500 * time.Millisecond)
}
+ }(ctx)
+
+ // -- actual tests -- //
+ go func() {
+ for _, s = range targets {
+ fmt.Printf("%s: %s\n", color.Green("Server"), s.Name)
- err = s.UploadTest()
- if err != nil {
- log.Fatal().Err(err).Msg("Error testing upload speed")
+ err := s.PingTest(nil)
+ if err != nil {
+ log.Fatal().Err(err).Msg("Error pinging server")
+ }
+
+ err = s.DownloadTest()
+ if err != nil {
+ log.Fatal().Err(err).Msg("Error testing download speed")
+ }
+
+ err = s.UploadTest()
+ if err != nil {
+ log.Fatal().Err(err).Msg("Error testing upload speed")
+ }
}
- fmt.Print(
- fmt.Sprintf("%s: %s\n", color.Green("Latency"), s.Latency) +
- fmt.Sprintf("%s: %s\n", color.Green("Download"), s.DLSpeed) +
- fmt.Sprintf("%s: %s\n", color.Green("Upload"), s.ULSpeed),
- )
+ cancel()
+ }()
+ <-tests
+
+ // print results
+ fmt.Print(
+ "\n" +
+ fmt.Sprintf("%s: %s\n", color.Green("Latency"), s.Latency.Truncate(time.Millisecond)) +
+ fmt.Sprintf("%s: %s\n", color.Green("Download"), s.DLSpeed) +
+ fmt.Sprintf("%s: %s\n", color.Green("Upload"), s.ULSpeed),
+ )
- s.Context.Reset()
- }
+ s.Context.Reset()
},
}
main.go
@@ -1,6 +1,8 @@
package main
-import "github.com/kahnwong/swissknife/cmd"
+import (
+ "github.com/kahnwong/swissknife/cmd"
+)
func main() {
cmd.Execute()