Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/reporting/exporters/pdf/pdf_test.go
4538 views
1
package pdf
2
3
import (
4
"os"
5
"path/filepath"
6
"sync"
7
"testing"
8
"time"
9
10
"github.com/projectdiscovery/nuclei/v3/pkg/model"
11
"github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity"
12
"github.com/projectdiscovery/nuclei/v3/pkg/model/types/stringslice"
13
"github.com/projectdiscovery/nuclei/v3/pkg/output"
14
"github.com/stretchr/testify/require"
15
)
16
17
func makeEvent(sev severity.Severity) *output.ResultEvent {
18
return &output.ResultEvent{
19
TemplateID: "test-template",
20
Host: "http://example.com",
21
Matched: "http://example.com/vulnerable",
22
Type: "http",
23
Timestamp: time.Now(),
24
Info: model.Info{
25
Name: "Test Finding",
26
Authors: stringslice.StringSlice{Value: "test"},
27
SeverityHolder: severity.Holder{Severity: sev},
28
Description: "A test vulnerability description.",
29
},
30
Request: "GET / HTTP/1.1\r\nHost: example.com",
31
Response: "HTTP/1.1 200 OK\r\nContent-Type: text/html",
32
}
33
}
34
35
func TestNew_Defaults(t *testing.T) {
36
exp, err := New(&Options{})
37
require.NoError(t, err)
38
require.Equal(t, defaultFile, exp.options.File)
39
}
40
41
func TestNew_CustomFile(t *testing.T) {
42
exp, err := New(&Options{File: "custom.pdf"})
43
require.NoError(t, err)
44
require.Equal(t, "custom.pdf", exp.options.File)
45
}
46
47
func TestExport_NilEvent(t *testing.T) {
48
exp, err := New(&Options{File: "test.pdf"})
49
require.NoError(t, err)
50
require.NoError(t, exp.Export(nil))
51
require.Empty(t, exp.results)
52
}
53
54
func TestClose_EmptyResults(t *testing.T) {
55
dir := t.TempDir()
56
out := filepath.Join(dir, "report.pdf")
57
exp, err := New(&Options{File: out})
58
require.NoError(t, err)
59
require.NoError(t, exp.Close())
60
_, statErr := os.Stat(out)
61
require.True(t, os.IsNotExist(statErr))
62
}
63
64
func TestClose_WritesFile(t *testing.T) {
65
dir := t.TempDir()
66
out := filepath.Join(dir, "report.pdf")
67
exp, err := New(&Options{File: out})
68
require.NoError(t, err)
69
require.NoError(t, exp.Export(makeEvent(severity.High)))
70
require.NoError(t, exp.Close())
71
72
info, err := os.Stat(out)
73
require.NoError(t, err)
74
require.Greater(t, info.Size(), int64(0))
75
}
76
77
func TestExport_OmitRaw(t *testing.T) {
78
exp, err := New(&Options{File: "test.pdf", OmitRaw: true})
79
require.NoError(t, err)
80
event := makeEvent(severity.High)
81
require.NoError(t, exp.Export(event))
82
83
require.Len(t, exp.results, 1)
84
require.Empty(t, exp.results[0].Request)
85
require.Empty(t, exp.results[0].Response)
86
require.NotEmpty(t, event.Request)
87
require.NotEmpty(t, event.Response)
88
}
89
90
func TestExport_Concurrency(t *testing.T) {
91
exp, err := New(&Options{File: filepath.Join(t.TempDir(), "report.pdf")})
92
require.NoError(t, err)
93
94
const workers = 50
95
var wg sync.WaitGroup
96
errs := make(chan error, workers)
97
wg.Add(workers)
98
for i := 0; i < workers; i++ {
99
go func() {
100
defer wg.Done()
101
errs <- exp.Export(makeEvent(severity.Medium))
102
}()
103
}
104
wg.Wait()
105
close(errs)
106
for e := range errs {
107
require.NoError(t, e)
108
}
109
require.Len(t, exp.results, workers)
110
}
111
112
func TestSafeStr_ReplacesNonLatin1(t *testing.T) {
113
result := safeStr("hello 世界")
114
require.Equal(t, "hello ??", result)
115
}
116
117