2021-03-12 15:00:02 -05:00
|
|
|
package httpcaddyfile
|
|
|
|
|
|
|
|
|
|
import (
|
2025-10-09 19:26:38 +02:00
|
|
|
"encoding/json"
|
2021-03-12 15:00:02 -05:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
|
2025-10-09 19:26:38 +02:00
|
|
|
"github.com/caddyserver/caddy/v2/modules/caddytls"
|
2021-03-12 15:00:02 -05:00
|
|
|
_ "github.com/caddyserver/caddy/v2/modules/logging"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestGlobalLogOptionSyntax(t *testing.T) {
|
|
|
|
|
for i, tc := range []struct {
|
|
|
|
|
input string
|
|
|
|
|
output string
|
|
|
|
|
expectError bool
|
|
|
|
|
}{
|
|
|
|
|
// NOTE: Additional test cases of successful Caddyfile parsing
|
|
|
|
|
// are present in: caddytest/integration/caddyfile_adapt/
|
|
|
|
|
{
|
|
|
|
|
input: `{
|
|
|
|
|
log default
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
output: `{}`,
|
|
|
|
|
expectError: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
input: `{
|
|
|
|
|
log example {
|
|
|
|
|
output file foo.log
|
|
|
|
|
}
|
|
|
|
|
log example {
|
|
|
|
|
format json
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
expectError: true,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
input: `{
|
|
|
|
|
log example /foo {
|
|
|
|
|
output file foo.log
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
expectError: true,
|
|
|
|
|
},
|
|
|
|
|
} {
|
|
|
|
|
|
|
|
|
|
adapter := caddyfile.Adapter{
|
|
|
|
|
ServerType: ServerType{},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out, _, err := adapter.Adapt([]byte(tc.input), nil)
|
|
|
|
|
|
|
|
|
|
if err != nil != tc.expectError {
|
|
|
|
|
t.Errorf("Test %d error expectation failed Expected: %v, got %v", i, tc.expectError, err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if string(out) != tc.output {
|
|
|
|
|
t.Errorf("Test %d error output mismatch Expected: %s, got %s", i, tc.output, out)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-10-09 19:26:38 +02:00
|
|
|
|
|
|
|
|
func TestGlobalResolversOption(t *testing.T) {
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
input string
|
|
|
|
|
expectResolvers []string
|
|
|
|
|
expectError bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "single resolver",
|
|
|
|
|
input: `{
|
2025-11-21 19:07:02 +01:00
|
|
|
tls_resolvers 1.1.1.1
|
2025-10-09 19:26:38 +02:00
|
|
|
}
|
|
|
|
|
example.com {
|
|
|
|
|
}`,
|
|
|
|
|
expectResolvers: []string{"1.1.1.1"},
|
|
|
|
|
expectError: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "two resolvers",
|
|
|
|
|
input: `{
|
2025-11-21 19:07:02 +01:00
|
|
|
tls_resolvers 1.1.1.1 8.8.8.8
|
2025-10-09 19:26:38 +02:00
|
|
|
}
|
|
|
|
|
example.com {
|
|
|
|
|
}`,
|
|
|
|
|
expectResolvers: []string{"1.1.1.1", "8.8.8.8"},
|
|
|
|
|
expectError: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple resolvers",
|
|
|
|
|
input: `{
|
2025-11-21 19:07:02 +01:00
|
|
|
tls_resolvers 1.1.1.1 8.8.8.8 9.9.9.9
|
2025-10-09 19:26:38 +02:00
|
|
|
}
|
|
|
|
|
example.com {
|
|
|
|
|
}`,
|
|
|
|
|
expectResolvers: []string{"1.1.1.1", "8.8.8.8", "9.9.9.9"},
|
|
|
|
|
expectError: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "no resolvers specified",
|
|
|
|
|
input: `{
|
|
|
|
|
}
|
|
|
|
|
example.com {
|
|
|
|
|
}`,
|
|
|
|
|
expectResolvers: nil,
|
|
|
|
|
expectError: false,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, tc := range tests {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
adapter := caddyfile.Adapter{
|
|
|
|
|
ServerType: ServerType{},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out, _, err := adapter.Adapt([]byte(tc.input), nil)
|
|
|
|
|
|
|
|
|
|
if (err != nil) != tc.expectError {
|
|
|
|
|
t.Errorf("error expectation failed. Expected error: %v, got: %v", tc.expectError, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if tc.expectError {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Parse the output JSON to check resolvers
|
|
|
|
|
var config struct {
|
|
|
|
|
Apps struct {
|
|
|
|
|
TLS *caddytls.TLS `json:"tls"`
|
|
|
|
|
} `json:"apps"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := json.Unmarshal(out, &config); err != nil {
|
|
|
|
|
t.Errorf("failed to unmarshal output: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if resolvers match expected
|
|
|
|
|
if config.Apps.TLS == nil {
|
|
|
|
|
if tc.expectResolvers != nil {
|
|
|
|
|
t.Errorf("Expected TLS config with resolvers %v, but TLS config is nil", tc.expectResolvers)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
actualResolvers := config.Apps.TLS.Resolvers
|
|
|
|
|
if len(tc.expectResolvers) == 0 && len(actualResolvers) == 0 {
|
|
|
|
|
return // Both empty, ok
|
|
|
|
|
}
|
|
|
|
|
if len(actualResolvers) != len(tc.expectResolvers) {
|
|
|
|
|
t.Errorf("Expected %d resolvers, got %d. Expected: %v, got: %v", len(tc.expectResolvers), len(actualResolvers), tc.expectResolvers, actualResolvers)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
for j, expected := range tc.expectResolvers {
|
|
|
|
|
if actualResolvers[j] != expected {
|
|
|
|
|
t.Errorf("Resolver %d mismatch. Expected: %s, got: %s", j, expected, actualResolvers[j])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|