Path: blob/dev/pkg/catalog/loader/loader_bench_test.go
2843 views
package loader_test12import (3"testing"45"github.com/projectdiscovery/gologger"6"github.com/projectdiscovery/nuclei/v3/pkg/catalog/config"7"github.com/projectdiscovery/nuclei/v3/pkg/catalog/disk"8"github.com/projectdiscovery/nuclei/v3/pkg/catalog/loader"9"github.com/projectdiscovery/nuclei/v3/pkg/loader/workflow"10"github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity"11"github.com/projectdiscovery/nuclei/v3/pkg/templates"12templateTypes "github.com/projectdiscovery/nuclei/v3/pkg/templates/types"13"github.com/projectdiscovery/nuclei/v3/pkg/testutils"14)1516func BenchmarkStoreValidateTemplates(b *testing.B) {17options := testutils.DefaultOptions.Copy()18options.Logger = &gologger.Logger{}19testutils.Init(options)2021catalog := disk.NewCatalog(config.DefaultConfig.TemplatesDirectory)22executerOpts := testutils.NewMockExecuterOptions(options, nil)23executerOpts.Parser = templates.NewParser()2425workflowLoader, err := workflow.NewLoader(executerOpts)26if err != nil {27b.Fatalf("could not create workflow loader: %s", err)28}29executerOpts.WorkflowLoader = workflowLoader3031loaderCfg := loader.NewConfig(options, catalog, executerOpts)3233store, err := loader.New(loaderCfg)34if err != nil {35b.Fatalf("could not create store: %s", err)36}3738b.ResetTimer()39b.ReportAllocs()4041for b.Loop() {42_ = store.ValidateTemplates()43}44}4546func BenchmarkLoadTemplates(b *testing.B) {47options := testutils.DefaultOptions.Copy()48options.Logger = &gologger.Logger{}49options.ExecutionId = "bench-load-templates"50testutils.Init(options)5152catalog := disk.NewCatalog(config.DefaultConfig.TemplatesDirectory)53executerOpts := testutils.NewMockExecuterOptions(options, nil)54executerOpts.Parser = templates.NewParser()5556workflowLoader, err := workflow.NewLoader(executerOpts)57if err != nil {58b.Fatalf("could not create workflow loader: %s", err)59}60executerOpts.WorkflowLoader = workflowLoader6162b.Run("NoFilter", func(b *testing.B) {63loaderCfg := loader.NewConfig(options, catalog, executerOpts)64store, err := loader.New(loaderCfg)65if err != nil {66b.Fatalf("could not create store: %s", err)67}6869b.ResetTimer()70b.ReportAllocs()7172for b.Loop() {73_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})74}75})7677b.Run("FilterBySeverityCritical", func(b *testing.B) {78opts := options.Copy()79opts.Severities = severity.Severities{severity.Critical}80loaderCfg := loader.NewConfig(opts, catalog, executerOpts)8182store, err := loader.New(loaderCfg)83if err != nil {84b.Fatalf("could not create store: %s", err)85}8687b.ResetTimer()88b.ReportAllocs()8990for b.Loop() {91_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})92}93})9495b.Run("FilterBySeverityHighCritical", func(b *testing.B) {96opts := options.Copy()97opts.Severities = severity.Severities{severity.High, severity.Critical}98loaderCfg := loader.NewConfig(opts, catalog, executerOpts)99100store, err := loader.New(loaderCfg)101if err != nil {102b.Fatalf("could not create store: %s", err)103}104105b.ResetTimer()106b.ReportAllocs()107108for b.Loop() {109_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})110}111})112113b.Run("FilterByAuthor", func(b *testing.B) {114opts := options.Copy()115opts.Authors = []string{"pdteam"}116loaderCfg := loader.NewConfig(opts, catalog, executerOpts)117118store, err := loader.New(loaderCfg)119if err != nil {120b.Fatalf("could not create store: %s", err)121}122123b.ResetTimer()124b.ReportAllocs()125126for b.Loop() {127_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})128}129})130131b.Run("FilterByTags", func(b *testing.B) {132opts := options.Copy()133opts.Tags = []string{"cve", "rce"}134loaderCfg := loader.NewConfig(opts, catalog, executerOpts)135136store, err := loader.New(loaderCfg)137if err != nil {138b.Fatalf("could not create store: %s", err)139}140141b.ResetTimer()142b.ReportAllocs()143144for b.Loop() {145_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})146}147})148149b.Run("FilterByProtocol", func(b *testing.B) {150opts := options.Copy()151opts.Protocols = templateTypes.ProtocolTypes{templateTypes.HTTPProtocol}152loaderCfg := loader.NewConfig(opts, catalog, executerOpts)153154store, err := loader.New(loaderCfg)155if err != nil {156b.Fatalf("could not create store: %s", err)157}158159b.ResetTimer()160b.ReportAllocs()161162for b.Loop() {163_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})164}165})166167b.Run("ComplexFilter", func(b *testing.B) {168opts := options.Copy()169opts.Severities = severity.Severities{severity.High, severity.Critical}170opts.Authors = []string{"pdteam"}171opts.Tags = []string{"cve"}172loaderCfg := loader.NewConfig(opts, catalog, executerOpts)173174store, err := loader.New(loaderCfg)175if err != nil {176b.Fatalf("could not create store: %s", err)177}178179b.ResetTimer()180b.ReportAllocs()181182for b.Loop() {183_ = store.LoadTemplates([]string{config.DefaultConfig.TemplatesDirectory})184}185})186}187188func BenchmarkLoadTemplatesOnlyMetadata(b *testing.B) {189options := testutils.DefaultOptions.Copy()190options.Logger = &gologger.Logger{}191options.ExecutionId = "bench-metadata"192testutils.Init(options)193194catalog := disk.NewCatalog(config.DefaultConfig.TemplatesDirectory)195executerOpts := testutils.NewMockExecuterOptions(options, nil)196executerOpts.Parser = templates.NewParser()197198workflowLoader, err := workflow.NewLoader(executerOpts)199if err != nil {200b.Fatalf("could not create workflow loader: %s", err)201}202executerOpts.WorkflowLoader = workflowLoader203204b.Run("WithoutFilter", func(b *testing.B) {205loaderCfg := loader.NewConfig(options, catalog, executerOpts)206store, err := loader.New(loaderCfg)207if err != nil {208b.Fatalf("could not create store: %s", err)209}210211// Pre-warm the cache212_ = store.LoadTemplatesOnlyMetadata()213214b.ResetTimer()215b.ReportAllocs()216217for b.Loop() {218_ = store.LoadTemplatesOnlyMetadata()219}220})221222b.Run("WithSeverityFilter", func(b *testing.B) {223opts := options.Copy()224opts.Severities = severity.Severities{severity.Critical}225loaderCfg := loader.NewConfig(opts, catalog, executerOpts)226227store, err := loader.New(loaderCfg)228if err != nil {229b.Fatalf("could not create store: %s", err)230}231232// Pre-warm the cache233_ = store.LoadTemplatesOnlyMetadata()234235b.ResetTimer()236b.ReportAllocs()237238for b.Loop() {239_ = store.LoadTemplatesOnlyMetadata()240}241})242}243244245