Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/cmd/integration-test/exporters.go
2070 views
1
package main
2
3
import (
4
"context"
5
"fmt"
6
"log"
7
"time"
8
9
"github.com/projectdiscovery/nuclei/v3/pkg/output"
10
"github.com/projectdiscovery/nuclei/v3/pkg/reporting/exporters/mongo"
11
"github.com/testcontainers/testcontainers-go"
12
mongocontainer "github.com/testcontainers/testcontainers-go/modules/mongodb"
13
14
osutil "github.com/projectdiscovery/utils/os"
15
mongoclient "go.mongodb.org/mongo-driver/mongo"
16
mongooptions "go.mongodb.org/mongo-driver/mongo/options"
17
)
18
19
const (
20
dbName = "test"
21
dbImage = "mongo:8"
22
)
23
24
var exportersTestCases = []TestCaseInfo{
25
{Path: "exporters/mongo", TestCase: &mongoExporter{}, DisableOn: func() bool {
26
return osutil.IsWindows() || osutil.IsOSX()
27
}},
28
}
29
30
type mongoExporter struct{}
31
32
func (m *mongoExporter) Execute(filepath string) error {
33
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
34
defer cancel()
35
36
// Start a MongoDB container
37
mongodbContainer, err := mongocontainer.Run(ctx, dbImage)
38
defer func() {
39
if err := testcontainers.TerminateContainer(mongodbContainer); err != nil {
40
log.Printf("failed to terminate container: %s", err)
41
}
42
}()
43
if err != nil {
44
return fmt.Errorf("failed to start container: %w", err)
45
}
46
47
connString, err := mongodbContainer.ConnectionString(ctx)
48
if err != nil {
49
return fmt.Errorf("failed to get connection string for MongoDB container: %s", err)
50
}
51
connString = connString + dbName
52
53
// Create a MongoDB exporter and write a test result to the database
54
opts := mongo.Options{
55
ConnectionString: connString,
56
CollectionName: "test",
57
BatchSize: 1, // Ensure we write the result immediately
58
}
59
60
exporter, err := mongo.New(&opts)
61
if err != nil {
62
return fmt.Errorf("failed to create MongoDB exporter: %s", err)
63
}
64
defer func() {
65
if err := exporter.Close(); err != nil {
66
fmt.Printf("failed to close exporter: %s\n", err)
67
}
68
}()
69
70
res := &output.ResultEvent{
71
Request: "test request",
72
Response: "test response",
73
}
74
75
err = exporter.Export(res)
76
if err != nil {
77
return fmt.Errorf("failed to export result event to MongoDB: %s", err)
78
}
79
80
// Verify that the result was written to the database
81
clientOptions := mongooptions.Client().ApplyURI(connString)
82
client, err := mongoclient.Connect(ctx, clientOptions)
83
if err != nil {
84
return fmt.Errorf("error creating MongoDB client: %s", err)
85
}
86
defer func() {
87
if err := client.Disconnect(ctx); err != nil {
88
fmt.Printf("failed to disconnect from MongoDB: %s\n", err)
89
}
90
}()
91
92
collection := client.Database(dbName).Collection(opts.CollectionName)
93
var actualRes output.ResultEvent
94
err = collection.FindOne(ctx, map[string]interface{}{"request": res.Request}).Decode(&actualRes)
95
if err != nil {
96
return fmt.Errorf("failed to find document in MongoDB: %s", err)
97
}
98
99
if actualRes.Request != res.Request || actualRes.Response != res.Response {
100
return fmt.Errorf("exported result does not match expected result: got %v, want %v", actualRes, res)
101
}
102
103
return nil
104
}
105
106