Skip to content

Commit

Permalink
tests: improves test code.
Browse files Browse the repository at this point in the history
  • Loading branch information
jcchavezs committed Jan 8, 2025
1 parent c29c4b5 commit f7b06c0
Showing 1 changed file with 31 additions and 56 deletions.
87 changes: 31 additions & 56 deletions coraza_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,22 @@ import (
"os"
"strings"
"testing"
"time"

"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
"github.com/caddyserver/caddy/v2/caddytest"
"github.com/stretchr/testify/require"
)

const baseURL = "http://127.0.0.1:8080"

func TestPlugin(t *testing.T) {
tester, err := newTester("test.init.config", t)
if err != nil {
t.Fatal(err)
}
tester := newTester("test.init.config", t)

res, _ := tester.AssertGetResponse(baseURL+"/test", 200, "test123")
// Comes from https://github.com/corazawaf/coraza-caddy/blob/5e8337/test.init.config#L17
if len(res.Header.Get("x-request-id")) == 0 {
t.Fatal("X-Request-Id header is not set")
}

time.Sleep(1 * time.Second)
}

func TestPluginReload(t *testing.T) {
Expand All @@ -47,106 +43,85 @@ func TestPluginReload(t *testing.T) {

tester.InitServer(rawConfig, "caddyfile")
tester.AssertGetResponse(baseURL+"/test", 200, "test456")

time.Sleep(1 * time.Second)
}

func TestSimpleRule(t *testing.T) {
tester, err := newTester("test.init.config", t)
if err != nil {
t.Fatal(err)
}
tester := newTester("test.init.config", t)

req, _ := http.NewRequest("GET", baseURL+"/test5", nil)
tester.AssertResponseCode(req, 403)

time.Sleep(1 * time.Second)

req, _ = http.NewRequest("GET", baseURL+"/test_include1", nil)
tester.AssertResponseCode(req, 403)

time.Sleep(1 * time.Second)

req, _ = http.NewRequest("GET", baseURL+"/test_include2", nil)
tester.AssertResponseCode(req, 403)

time.Sleep(1 * time.Second)
}

func TestPhase3Disruption(t *testing.T) {
tester, err := newTester("test.init.config", t)
if err != nil {
t.Fatal(err)
}
tester := newTester("test.init.config", t)

req, _ := http.NewRequest("GET", baseURL+"/test6", nil)
tester.AssertResponseCode(req, 403)

time.Sleep(1 * time.Second)
}

func TestPostUrlEncoded(t *testing.T) {
tester, err := newTester("test.init.config", t)
if err != nil {
t.Fatal(err)
}
tester := newTester("test.init.config", t)

b := strings.NewReader("adsf=qwer" + strings.Repeat("a", 1000))
req, _ := http.NewRequest("POST", baseURL+"/test", b)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
tester.AssertResponseCode(req, 200)

time.Sleep(1 * time.Second)
}

func TestPostMultipart(t *testing.T) {
tester, err := newTester("test.init.config", t)
if err != nil {
t.Fatal(err)
}
tester := newTester("test.init.config", t)

req, _ := http.NewRequest("POST", baseURL+"/", nil)
if err := multipartRequest(req); err != nil {
t.Fatal(err)
}

err := multipartRequest(t, req)
require.NoError(t, err)
tester.AssertResponseCode(req, 200)
time.Sleep(1 * time.Second)
}

func multipartRequest(req *http.Request) error {
func multipartRequest(t *testing.T, req *http.Request) error {
t.Helper()

var b bytes.Buffer
w := multipart.NewWriter(&b)
tempfile, err := os.CreateTemp("/tmp", "tmpfile*")
tempfile, err := os.CreateTemp(t.TempDir(), "tmpfile*")
if err != nil {
return err
return fmt.Errorf("creating multipart file: %w", err)
}
defer os.Remove(tempfile.Name())

for i := 0; i < 1024*5; i++ {
// this should create a 5mb file
if _, err := tempfile.Write([]byte(strings.Repeat("A", 1024))); err != nil {
return err
return fmt.Errorf("writing to multipart file: %w", err)
}
}
var fw io.Writer
if fw, err = w.CreateFormFile("fupload", tempfile.Name()); err != nil {
return err
return fmt.Errorf("creating form file: %w", err)
}
if _, err := tempfile.Seek(0, 0); err != nil {
return err
return fmt.Errorf("seeking to start of file: %w", err)
}
if _, err = io.Copy(fw, tempfile); err != nil {
return err
return fmt.Errorf("copying file to form file: %w", err)
}
req.Body = io.NopCloser(&b)
req.Header.Set("Content-Type", w.FormDataContentType())
req.Method = "POST"
return nil
}

func newTester(caddyfile string, t *testing.T) (*caddytest.Tester, error) {
func newTester(caddyfile string, t *testing.T) *caddytest.Tester {
tester := caddytest.NewTester(t)
configContent, err := os.ReadFile(caddyfile)
if err != nil {
return nil, fmt.Errorf("failed to load configuration file %q: %s", caddyfile, err)
}
require.NoError(t, err)
tester.InitServer(string(configContent), "caddyfile")
return tester, nil
return tester
}

func TestUnmarshalCaddyfile(t *testing.T) {
Expand Down Expand Up @@ -195,12 +170,12 @@ func TestUnmarshalCaddyfile(t *testing.T) {
dispenser := caddyfile.NewTestDispenser(test.config)
m := &corazaModule{}
err := m.UnmarshalCaddyfile(dispenser)
if test.shouldErr && err == nil {
t.Fatal("Expected error but got nil")
if test.shouldErr {
require.Error(t, err)
}

if !test.shouldErr && err != nil {
t.Fatalf("Expected no error but got: %v", err)
if !test.shouldErr {
require.NoError(t, err)
}
})
}
Expand Down

0 comments on commit f7b06c0

Please sign in to comment.