From cf588c846656664df7ca59247b41b13c4fdaa087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Filast=C3=B2?= Date: Thu, 28 Jun 2018 13:51:43 +0200 Subject: [PATCH] Move summary related code into it's own package --- internal/database/models.go | 13 ++----- internal/log/handlers/cli/results.go | 35 +++-------------- nettests/groups/groups.go | 56 +++++----------------------- nettests/summary/summary.go | 44 ++++++++++++++++++++++ 4 files changed, 63 insertions(+), 85 deletions(-) create mode 100644 nettests/summary/summary.go diff --git a/internal/database/models.go b/internal/database/models.go index 3bc2539..689d806 100644 --- a/internal/database/models.go +++ b/internal/database/models.go @@ -7,16 +7,11 @@ import ( "github.com/apex/log" "github.com/jmoiron/sqlx" + "github.com/ooni/probe-cli/nettests/summary" "github.com/ooni/probe-cli/utils" "github.com/pkg/errors" ) -// ResultSummaryFunc is the function used to generate result summaries -type ResultSummaryFunc func(SummaryMap) (string, error) - -// SummaryMap contains a mapping from test name to serialized summary for it -type SummaryMap map[string][]string - // UpdateOne will run the specified update query and check that it only affected one row func UpdateOne(db *sqlx.DB, query string, arg interface{}) error { res, err := db.NamedExec(query, arg) @@ -298,8 +293,8 @@ func ListResults(db *sqlx.DB) ([]*Result, []*Result, error) { // MakeSummaryMap return a mapping of test names to summaries for the given // result -func MakeSummaryMap(db *sqlx.DB, r *Result) (SummaryMap, error) { - summaryMap := SummaryMap{} +func MakeSummaryMap(db *sqlx.DB, r *Result) (summary.SummaryMap, error) { + summaryMap := summary.SummaryMap{} msmts := []Measurement{} // XXX maybe we only want to select some of the columns @@ -319,7 +314,7 @@ func MakeSummaryMap(db *sqlx.DB, r *Result) (SummaryMap, error) { } // Finished marks the result as done and sets the runtime -func (r *Result) Finished(db *sqlx.DB, makeSummary ResultSummaryFunc) error { +func (r *Result) Finished(db *sqlx.DB, makeSummary summary.ResultSummaryFunc) error { if r.Done == true || r.Runtime != 0 { return errors.New("Result is already finished") } diff --git a/internal/log/handlers/cli/results.go b/internal/log/handlers/cli/results.go index 5c11720..630145b 100644 --- a/internal/log/handlers/cli/results.go +++ b/internal/log/handlers/cli/results.go @@ -9,34 +9,9 @@ import ( "github.com/apex/log" "github.com/ooni/probe-cli/internal/util" + "github.com/ooni/probe-cli/nettests/summary" ) -// XXX Copy-pasta from nettest/groups -// PerformanceSummary is the result summary for a performance test -type PerformanceSummary struct { - Upload int64 - Download int64 - Ping float64 - Bitrate int64 -} - -// MiddleboxSummary is the summary for the middlebox tests -type MiddleboxSummary struct { - Detected bool -} - -// IMSummary is the summary for the im tests -type IMSummary struct { - Tested uint - Blocked uint -} - -// WebsitesSummary is the summary for the websites test -type WebsitesSummary struct { - Tested uint - Blocked uint -} - func formatSpeed(speed int64) string { if speed < 1000 { return fmt.Sprintf("%d Kbit/s", speed) @@ -51,7 +26,7 @@ func formatSpeed(speed int64) string { var summarizers = map[string]func(string) []string{ "websites": func(ss string) []string { - var summary WebsitesSummary + var summary summary.WebsitesSummary if err := json.Unmarshal([]byte(ss), &summary); err != nil { return nil } @@ -62,7 +37,7 @@ var summarizers = map[string]func(string) []string{ } }, "performance": func(ss string) []string { - var summary PerformanceSummary + var summary summary.PerformanceSummary if err := json.Unmarshal([]byte(ss), &summary); err != nil { return nil } @@ -73,7 +48,7 @@ var summarizers = map[string]func(string) []string{ } }, "im": func(ss string) []string { - var summary IMSummary + var summary summary.IMSummary if err := json.Unmarshal([]byte(ss), &summary); err != nil { return nil } @@ -84,7 +59,7 @@ var summarizers = map[string]func(string) []string{ } }, "middlebox": func(ss string) []string { - var summary MiddleboxSummary + var summary summary.MiddleboxSummary if err := json.Unmarshal([]byte(ss), &summary); err != nil { return nil } diff --git a/nettests/groups/groups.go b/nettests/groups/groups.go index b35e04d..06d6e67 100644 --- a/nettests/groups/groups.go +++ b/nettests/groups/groups.go @@ -2,14 +2,13 @@ package groups import ( "encoding/json" - "fmt" "github.com/apex/log" - "github.com/ooni/probe-cli/internal/database" "github.com/ooni/probe-cli/nettests" "github.com/ooni/probe-cli/nettests/im" "github.com/ooni/probe-cli/nettests/middlebox" "github.com/ooni/probe-cli/nettests/performance" + "github.com/ooni/probe-cli/nettests/summary" "github.com/ooni/probe-cli/nettests/websites" ) @@ -17,42 +16,7 @@ import ( type NettestGroup struct { Label string Nettests []nettests.Nettest - Summary database.ResultSummaryFunc -} - -// PerformanceSummary is the result summary for a performance test -type PerformanceSummary struct { - Upload int64 - Download int64 - Ping float64 - Bitrate int64 -} - -// MiddleboxSummary is the summary for the middlebox tests -type MiddleboxSummary struct { - Detected bool -} - -// IMSummary is the summary for the im tests -type IMSummary struct { - Tested uint - Blocked uint -} - -// WebsitesSummary is the summary for the websites test -type WebsitesSummary struct { - Tested uint - Blocked uint -} - -func checkRequiredKeys(rk []string, m database.SummaryMap) error { - for _, key := range rk { - if _, ok := m[key]; ok { - continue - } - return fmt.Errorf("missing SummaryMap key '%s'", key) - } - return nil + Summary summary.ResultSummaryFunc } // NettestGroups that can be run by the user @@ -62,14 +26,14 @@ var NettestGroups = map[string]NettestGroup{ Nettests: []nettests.Nettest{ websites.WebConnectivity{}, }, - Summary: func(m database.SummaryMap) (string, error) { + Summary: func(m summary.SummaryMap) (string, error) { if err := checkRequiredKeys([]string{"WebConnectivity"}, m); err != nil { log.WithError(err).Error("missing keys") return "", err } // XXX to generate this I need to create the summary map as a list - var summary WebsitesSummary + var summary summary.WebsitesSummary summary.Tested = 0 summary.Blocked = 0 for _, msmtSummaryStr := range m["WebConnectivity"] { @@ -98,7 +62,7 @@ var NettestGroups = map[string]NettestGroup{ performance.Dash{}, performance.NDT{}, }, - Summary: func(m database.SummaryMap) (string, error) { + Summary: func(m summary.SummaryMap) (string, error) { if err := checkRequiredKeys([]string{"Dash", "Ndt"}, m); err != nil { log.WithError(err).Error("missing keys") return "", err @@ -108,7 +72,7 @@ var NettestGroups = map[string]NettestGroup{ err error ndtSummary performance.NDTSummary dashSummary performance.DashSummary - summary PerformanceSummary + summary summary.PerformanceSummary ) err = json.Unmarshal([]byte(m["Dash"][0]), &dashSummary) if err != nil { @@ -137,7 +101,7 @@ var NettestGroups = map[string]NettestGroup{ middlebox.HTTPInvalidRequestLine{}, middlebox.HTTPHeaderFieldManipulation{}, }, - Summary: func(m database.SummaryMap) (string, error) { + Summary: func(m summary.SummaryMap) (string, error) { if err := checkRequiredKeys([]string{"WebConnectivity"}, m); err != nil { log.WithError(err).Error("missing keys") return "", err @@ -147,7 +111,7 @@ var NettestGroups = map[string]NettestGroup{ err error hhfmSummary middlebox.HTTPHeaderFieldManipulationSummary hirlSummary middlebox.HTTPInvalidRequestLineSummary - summary MiddleboxSummary + summary summary.MiddleboxSummary ) err = json.Unmarshal([]byte(m["HttpHeaderFieldManipulation"][0]), &hhfmSummary) if err != nil { @@ -174,7 +138,7 @@ var NettestGroups = map[string]NettestGroup{ im.Telegram{}, im.WhatsApp{}, }, - Summary: func(m database.SummaryMap) (string, error) { + Summary: func(m summary.SummaryMap) (string, error) { if err := checkRequiredKeys([]string{"Whatsapp", "Telegram", "FacebookMessenger"}, m); err != nil { log.WithError(err).Error("missing keys") return "", err @@ -184,7 +148,7 @@ var NettestGroups = map[string]NettestGroup{ waSummary im.WhatsAppSummary tgSummary im.TelegramSummary fbSummary im.FacebookMessengerSummary - summary IMSummary + summary summary.IMSummary ) err = json.Unmarshal([]byte(m["Whatsapp"][0]), &waSummary) if err != nil { diff --git a/nettests/summary/summary.go b/nettests/summary/summary.go new file mode 100644 index 0000000..a7dabfe --- /dev/null +++ b/nettests/summary/summary.go @@ -0,0 +1,44 @@ +package summary + +import "fmt" + +// ResultSummaryFunc is the function used to generate result summaries +type ResultSummaryFunc func(SummaryMap) (string, error) + +// SummaryMap contains a mapping from test name to serialized summary for it +type SummaryMap map[string][]string + +// PerformanceSummary is the result summary for a performance test +type PerformanceSummary struct { + Upload int64 + Download int64 + Ping float64 + Bitrate int64 +} + +// MiddleboxSummary is the summary for the middlebox tests +type MiddleboxSummary struct { + Detected bool +} + +// IMSummary is the summary for the im tests +type IMSummary struct { + Tested uint + Blocked uint +} + +// WebsitesSummary is the summary for the websites test +type WebsitesSummary struct { + Tested uint + Blocked uint +} + +func checkRequiredKeys(rk []string, m SummaryMap) error { + for _, key := range rk { + if _, ok := m[key]; ok { + continue + } + return fmt.Errorf("missing SummaryMap key '%s'", key) + } + return nil +}