@@ -17,6 +17,7 @@ import (
1717 "github.com/google/syzkaller/pkg/coveragedb"
1818 "github.com/google/syzkaller/pkg/coveragedb/spannerclient"
1919 "github.com/google/syzkaller/pkg/covermerger"
20+ "github.com/google/syzkaller/pkg/html/urlutil"
2021 "github.com/google/syzkaller/pkg/validator"
2122 "google.golang.org/appengine/v2"
2223)
@@ -71,6 +72,59 @@ func handleSubsystemsCoverageHeatmap(c context.Context, w http.ResponseWriter, r
7172 return handleHeatmap (c , w , r , cover .DoSubsystemsHeatMapStyleBodyJS )
7273}
7374
75+ type covPageParam int
76+
77+ const (
78+ // keep-sorted start
79+ CommitHash covPageParam = iota
80+ DateTo
81+ FilePath
82+ ManagerName
83+ MinCoverLinesDrop
84+ OrderByCoverDrop
85+ PeriodCount
86+ PeriodType
87+ SubsystemName
88+ UniqueOnly
89+ // keep-sorted end
90+ )
91+
92+ var covPageParams = map [covPageParam ]string {
93+ // keep-sorted start
94+ CommitHash : "commit" ,
95+ DateTo : "dateto" ,
96+ FilePath : "filepath" ,
97+ ManagerName : "manager" ,
98+ MinCoverLinesDrop : "min-cover-lines-drop" ,
99+ OrderByCoverDrop : "order-by-cover-lines-drop" ,
100+ PeriodCount : "period_count" ,
101+ PeriodType : "period" ,
102+ SubsystemName : "subsystem" ,
103+ UniqueOnly : "unique-only" ,
104+ // keep-sorted end
105+ }
106+
107+ func coveragePageLink (ns , periodType , dateTo string , minDrop , periodCount int , orderByCoverDrop bool ) string {
108+ if periodType == "" {
109+ periodType = coveragedb .MonthPeriod
110+ }
111+ url := "/" + ns + "/coverage"
112+ url = urlutil .SetParam (url , covPageParams [PeriodType ], periodType )
113+ if periodCount != 0 {
114+ url = urlutil .SetParam (url , covPageParams [PeriodCount ], strconv .Itoa (periodCount ))
115+ }
116+ if dateTo != "" {
117+ url = urlutil .SetParam (url , covPageParams [DateTo ], dateTo )
118+ }
119+ if minDrop > 0 {
120+ url = urlutil .SetParam (url , covPageParams [MinCoverLinesDrop ], strconv .Itoa (minDrop ))
121+ }
122+ if orderByCoverDrop {
123+ url = urlutil .SetParam (url , covPageParams [OrderByCoverDrop ], "1" )
124+ }
125+ return url
126+ }
127+
74128func handleHeatmap (c context.Context , w http.ResponseWriter , r * http.Request , f funcStyleBodyJS ) error {
75129 hdr , err := commonHeader (c , r , w , "" )
76130 if err != nil {
@@ -80,10 +134,10 @@ func handleHeatmap(c context.Context, w http.ResponseWriter, r *http.Request, f
80134 if nsConfig .Coverage == nil {
81135 return ErrClientNotFound
82136 }
83- ss := r .FormValue ("subsystem" )
84- manager := r .FormValue ("manager" )
137+ ss := r .FormValue (covPageParams [ SubsystemName ] )
138+ manager := r .FormValue (covPageParams [ ManagerName ] )
85139
86- periodType := r .FormValue ("period" )
140+ periodType := r .FormValue (covPageParams [ PeriodType ] )
87141 if periodType == "" {
88142 periodType = coveragedb .DayPeriod
89143 }
@@ -94,7 +148,7 @@ func handleHeatmap(c context.Context, w http.ResponseWriter, r *http.Request, f
94148 periodType , ErrClientBadRequest )
95149 }
96150
97- periodCount := r .FormValue ("period_count" )
151+ periodCount := r .FormValue (covPageParams [ PeriodCount ] )
98152 if periodCount == "" {
99153 periodCount = "4"
100154 }
@@ -104,7 +158,7 @@ func handleHeatmap(c context.Context, w http.ResponseWriter, r *http.Request, f
104158 }
105159
106160 dateTo := civil .DateOf (timeNow (c ))
107- if customDate := r .FormValue ("dateto" ); customDate != "" {
161+ if customDate := r .FormValue (covPageParams [ DateTo ] ); customDate != "" {
108162 if dateTo , err = civil .ParseDate (customDate ); err != nil {
109163 return fmt .Errorf ("civil.ParseDate(%s): %w" , customDate , err )
110164 }
@@ -126,12 +180,12 @@ func handleHeatmap(c context.Context, w http.ResponseWriter, r *http.Request, f
126180 slices .Sort (managers )
127181 slices .Sort (subsystems )
128182
129- onlyUnique := r .FormValue ("unique-only" ) == "1"
130- orderByCoverLinesDrop := r .FormValue ("order-by-cover-lines-drop" ) == "1"
183+ onlyUnique := r .FormValue (covPageParams [ UniqueOnly ] ) == "1"
184+ orderByCoverLinesDrop := r .FormValue (covPageParams [ OrderByCoverDrop ] ) == "1"
131185 // Prefixing "0" we don't fail on empty string.
132- minCoverLinesDrop , err := strconv .Atoi ("0" + r .FormValue ("min-cover-lines-drop" ))
186+ minCoverLinesDrop , err := strconv .Atoi ("0" + r .FormValue (covPageParams [ MinCoverLinesDrop ] ))
133187 if err != nil {
134- return fmt .Errorf ("min-cover-lines-drop should be integer" )
188+ return fmt .Errorf (covPageParams [ MinCoverLinesDrop ] + " should be integer" )
135189 }
136190
137191 var style template.CSS
@@ -182,18 +236,18 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
182236 if nsConfig .Coverage == nil || nsConfig .Coverage .WebGitURI == "" {
183237 return ErrClientNotFound
184238 }
185- dateToStr := r .FormValue ("dateto" )
186- periodType := r .FormValue ("period" )
187- targetCommit := r .FormValue ("commit" )
188- kernelFilePath := r .FormValue ("filepath" )
189- manager := r .FormValue ("manager" )
239+ dateToStr := r .FormValue (covPageParams [ DateTo ] )
240+ periodType := r .FormValue (covPageParams [ PeriodType ] )
241+ targetCommit := r .FormValue (covPageParams [ CommitHash ] )
242+ kernelFilePath := r .FormValue (covPageParams [ FilePath ] )
243+ manager := r .FormValue (covPageParams [ ManagerName ] )
190244 if err := validator .AnyError ("input validation failed" ,
191- validator .TimePeriodType (periodType , "period" ),
192- validator .CommitHash (targetCommit , "commit" ),
193- validator .KernelFilePath (kernelFilePath , "filepath" ),
245+ validator .TimePeriodType (periodType , covPageParams [ PeriodType ] ),
246+ validator .CommitHash (targetCommit , covPageParams [ CommitHash ] ),
247+ validator .KernelFilePath (kernelFilePath , covPageParams [ FilePath ] ),
194248 validator .AnyOk (
195- validator .Allowlisted (manager , []string {"" , "*" }, "manager" ),
196- validator .ManagerName (manager , "manager" )),
249+ validator .Allowlisted (manager , []string {"" , "*" }, covPageParams [ ManagerName ] ),
250+ validator .ManagerName (manager , covPageParams [ ManagerName ] )),
197251 ); err != nil {
198252 return fmt .Errorf ("%w: %w" , err , ErrClientBadRequest )
199253 }
@@ -205,7 +259,7 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
205259 if err != nil {
206260 return fmt .Errorf ("coveragedb.MakeTimePeriod: %w" , err )
207261 }
208- onlyUnique := r .FormValue ("unique-only" ) == "1"
262+ onlyUnique := r .FormValue (covPageParams [ UniqueOnly ] ) == "1"
209263 mainNsRepo , _ := nsConfig .mainRepoBranch ()
210264 client := GetCoverageDBClient (c )
211265 if client == nil {
@@ -268,7 +322,7 @@ func handleCoverageGraph(c context.Context, w http.ResponseWriter, r *http.Reque
268322 if nsConfig .Coverage == nil {
269323 return ErrClientNotFound
270324 }
271- periodType := r .FormValue ("period" )
325+ periodType := r .FormValue (covPageParams [ PeriodType ] )
272326 if periodType == "" {
273327 periodType = coveragedb .QuarterPeriod
274328 }
0 commit comments