diff options
| author | Taras Madan <tarasmadan@google.com> | 2024-02-21 15:57:39 +0100 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2024-02-26 13:40:58 +0000 |
| commit | 34642b76bd94b7e7600efd0aaeba1c09f65926fe (patch) | |
| tree | b1ee129f8ff0ef0e23af48fa9ba37f32a0191e45 | |
| parent | edd6a5e964598ffc78ee22374d8e0dd3326fb6a2 (diff) | |
html.go: refactor httpCoverCover
| -rw-r--r-- | pkg/cover/html.go | 20 | ||||
| -rw-r--r-- | syz-manager/html.go | 50 |
2 files changed, 29 insertions, 41 deletions
diff --git a/pkg/cover/html.go b/pkg/cover/html.go index 8cb9e7511..956a9bc24 100644 --- a/pkg/cover/html.go +++ b/pkg/cover/html.go @@ -13,7 +13,6 @@ import ( "html/template" "io" "math" - "net/http" "os" "path/filepath" "sort" @@ -185,8 +184,8 @@ func fileLineContents(file *file, lines [][]byte) lineCoverExport { return lce } -func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) error { - progs = fixUpPCs(rg.target.Arch, progs, coverFilter) +func (rg *ReportGenerator) DoRawCoverFiles(w io.Writer, params CoverHandlerParams) error { + progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter) if err := rg.lazySymbolize(progs); err != nil { return err } @@ -201,7 +200,6 @@ func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog, return fl.PC < fr.PC }) - w.Header().Set("Content-Type", "text/plain; charset=utf-8") buf := bufio.NewWriter(w) fmt.Fprintf(buf, "PC,Module,Offset,Filename,Inline,StartLine,EndLine\n") for _, frame := range resFrames { @@ -213,8 +211,8 @@ func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog, return nil } -func (rg *ReportGenerator) DoRawCover(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) { - progs = fixUpPCs(rg.target.Arch, progs, coverFilter) +func (rg *ReportGenerator) DoRawCover(w io.Writer, params CoverHandlerParams) error { + progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter) var pcs []uint64 if len(progs) == 1 && rg.rawCoverEnabled { pcs = append([]uint64{}, progs[0].PCs...) @@ -234,16 +232,16 @@ func (rg *ReportGenerator) DoRawCover(w http.ResponseWriter, progs []Prog, cover }) } - w.Header().Set("Content-Type", "text/plain; charset=utf-8") buf := bufio.NewWriter(w) for _, pc := range pcs { fmt.Fprintf(buf, "0x%x\n", pc) } buf.Flush() + return nil } -func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) { - progs = fixUpPCs(rg.target.Arch, progs, coverFilter) +func (rg *ReportGenerator) DoFilterPCs(w io.Writer, params CoverHandlerParams) error { + progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter) var pcs []uint64 uniquePCs := make(map[uint64]bool) for _, prog := range progs { @@ -252,7 +250,7 @@ func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, cove continue } uniquePCs[pc] = true - if coverFilter[uint32(pc)] != 0 { + if params.CoverFilter[uint32(pc)] != 0 { pcs = append(pcs, pc) } } @@ -261,12 +259,12 @@ func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, cove return pcs[i] < pcs[j] }) - w.Header().Set("Content-Type", "text/plain; charset=utf-8") buf := bufio.NewWriter(w) for _, pc := range pcs { fmt.Fprintf(buf, "0x%x\n", pc) } buf.Flush() + return nil } type fileStats struct { diff --git a/syz-manager/html.go b/syz-manager/html.go index 11b21817d..04c23b459 100644 --- a/syz-manager/html.go +++ b/syz-manager/html.go @@ -335,42 +335,32 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, funcF coverFilter = mgr.coverFilter } - if funcFlag == DoRawCoverFiles { - if err := rg.DoRawCoverFiles(w, progs, coverFilter); err != nil { - http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError) - return - } - runtime.GC() - return - } else if funcFlag == DoRawCover { - rg.DoRawCover(w, progs, coverFilter) - return - } else if funcFlag == DoFilterPCs { - rg.DoFilterPCs(w, progs, coverFilter) - return + params := cover.CoverHandlerParams{ + Progs: progs, + CoverFilter: coverFilter, + Debug: r.FormValue("debug") != "", } - do := rg.DoHTML - - if funcFlag == DoHTMLTable { - do = rg.DoHTMLTable - } else if funcFlag == DoModuleCover { - do = rg.DoModuleCover - } else if funcFlag == DoCSV { - do = rg.DoCSV - } else if funcFlag == DoCSVFiles { - do = rg.DoCSVFiles + type handlerFuncType func(w io.Writer, params cover.CoverHandlerParams) error + flagToFunc := map[int]struct { + Do handlerFuncType + isPlainText bool + }{ + DoHTML: {rg.DoHTML, false}, + DoHTMLTable: {rg.DoHTMLTable, false}, + DoModuleCover: {rg.DoModuleCover, false}, + DoCSV: {rg.DoCSV, false}, + DoCSVFiles: {rg.DoCSVFiles, true}, + DoRawCoverFiles: {rg.DoRawCoverFiles, true}, + DoRawCover: {rg.DoRawCover, true}, + DoFilterPCs: {rg.DoFilterPCs, true}, } - debug := r.FormValue("debug") != "" - - params := cover.CoverHandlerParams{ - Progs: progs, - CoverFilter: coverFilter, - Debug: debug, + if flagToFunc[funcFlag].isPlainText { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") } - if err := do(w, params); err != nil { + if err := flagToFunc[funcFlag].Do(w, params); err != nil { http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError) return } |
