Path: blob/dev/pkg/protocols/common/generators/load_test.go
2843 views
package generators12import (3"io"4"strings"5"testing"67"github.com/pkg/errors"8"github.com/projectdiscovery/nuclei/v3/pkg/catalog"9"github.com/projectdiscovery/nuclei/v3/pkg/types"10)1112type fakeCatalog struct{ catalog.Catalog }1314func (f *fakeCatalog) OpenFile(filename string) (io.ReadCloser, error) {15return nil, errors.New("not used")16}17func (f *fakeCatalog) GetTemplatePath(target string) ([]string, error) { return nil, nil }18func (f *fakeCatalog) GetTemplatesPath(definitions []string) ([]string, map[string]error) {19return nil, nil20}21func (f *fakeCatalog) ResolvePath(templateName, second string) (string, error) {22return templateName, nil23}2425func newTestGenerator() *PayloadGenerator {26opts := types.DefaultOptions()27// inject helper loader function28opts.LoadHelperFileFunction = func(path, templatePath string, _ catalog.Catalog) (io.ReadCloser, error) {29switch path {30case "fileA.txt":31return io.NopCloser(strings.NewReader("one\n two\n\nthree\n")), nil32default:33return io.NopCloser(strings.NewReader("x\ny\nz\n")), nil34}35}36return &PayloadGenerator{options: opts, catalog: &fakeCatalog{}}37}3839func TestLoadPayloads_FastPathFile(t *testing.T) {40g := newTestGenerator()41out, err := g.loadPayloads(map[string]interface{}{"A": "fileA.txt"}, "")42if err != nil {43t.Fatalf("err: %v", err)44}45got := out["A"]46if len(got) != 3 || got[0] != "one" || got[1] != " two" || got[2] != "three" {47t.Fatalf("unexpected: %#v", got)48}49}5051func TestLoadPayloads_InlineMultiline(t *testing.T) {52g := newTestGenerator()53inline := "a\nb\n"54out, err := g.loadPayloads(map[string]interface{}{"B": inline}, "")55if err != nil {56t.Fatalf("err: %v", err)57}58got := out["B"]59if len(got) != 3 || got[0] != "a" || got[1] != "b" || got[2] != "" {60t.Fatalf("unexpected: %#v", got)61}62}6364func TestLoadPayloads_SingleLineFallsBackToFile(t *testing.T) {65g := newTestGenerator()66inline := "fileA.txt" // single line, should be treated as file path67out, err := g.loadPayloads(map[string]interface{}{"C": inline}, "")68if err != nil {69t.Fatalf("err: %v", err)70}71got := out["C"]72if len(got) != 3 {73t.Fatalf("unexpected len: %d", len(got))74}75}7677func TestLoadPayloads_InterfaceSlice(t *testing.T) {78g := newTestGenerator()79out, err := g.loadPayloads(map[string]interface{}{"D": []interface{}{"p", "q"}}, "")80if err != nil {81t.Fatalf("err: %v", err)82}83got := out["D"]84if len(got) != 2 || got[0] != "p" || got[1] != "q" {85t.Fatalf("unexpected: %#v", got)86}87}8889func TestLoadPayloadsFromFile_SkipsEmpty(t *testing.T) {90g := newTestGenerator()91rc := io.NopCloser(strings.NewReader("a\n\n\n b \n"))92lines, err := g.loadPayloadsFromFile(rc)93if err != nil {94t.Fatalf("err: %v", err)95}96if len(lines) != 2 || lines[0] != "a" || lines[1] != " b " {97t.Fatalf("unexpected: %#v", lines)98}99}100101func TestValidate_AllowsInlineMultiline(t *testing.T) {102g := newTestGenerator()103inline := "x\ny\n"104if err := g.validate(map[string]interface{}{"E": inline}, ""); err != nil {105t.Fatalf("validate rejected inline multiline: %v", err)106}107}108109110