mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			243 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package quic
 | ||
|  | 
 | ||
|  | import (
 | ||
|  | 	"fmt"
 | ||
|  | 	"strings"
 | ||
|  | 	"testing"
 | ||
|  | 
 | ||
|  | 	"github.com/coredns/caddy"
 | ||
|  | 	"github.com/coredns/coredns/core/dnsserver"
 | ||
|  | )
 | ||
|  | 
 | ||
|  | func TestQuicSetup(t *testing.T) {
 | ||
|  | 	tests := []struct {
 | ||
|  | 		input                  string
 | ||
|  | 		shouldErr              bool
 | ||
|  | 		expectedMaxStreams     *int
 | ||
|  | 		expectedWorkerPoolSize *int
 | ||
|  | 		expectedErrContent     string
 | ||
|  | 	}{
 | ||
|  | 		// Valid configurations
 | ||
|  | 		{
 | ||
|  | 			input:                  `quic`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     nil,
 | ||
|  | 			expectedWorkerPoolSize: nil,
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     nil,
 | ||
|  | 			expectedWorkerPoolSize: nil,
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams 100
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     pint(100),
 | ||
|  | 			expectedWorkerPoolSize: nil,
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size 1000
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     nil,
 | ||
|  | 			expectedWorkerPoolSize: pint(1000),
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams 100
 | ||
|  | 				worker_pool_size 1000
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     pint(100),
 | ||
|  | 			expectedWorkerPoolSize: pint(1000),
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				# Comment
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              false,
 | ||
|  | 			expectedMaxStreams:     nil,
 | ||
|  | 			expectedWorkerPoolSize: nil,
 | ||
|  | 		},
 | ||
|  | 		// Invalid configurations
 | ||
|  | 		{
 | ||
|  | 			input:              `quic arg`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "Wrong argument count",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "Wrong argument count",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams abc
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "invalid max_streams value",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams 0
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "positive integer",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams -10
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "positive integer",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "Wrong argument count",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size abc
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "invalid worker_pool_size value",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size 0
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "positive integer",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size -10
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "positive integer",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams 100
 | ||
|  | 				max_streams 200
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "already defined",
 | ||
|  | 			expectedMaxStreams: pint(100),
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size 1000
 | ||
|  | 				worker_pool_size 2000
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:              true,
 | ||
|  | 			expectedErrContent:     "already defined",
 | ||
|  | 			expectedWorkerPoolSize: pint(1000),
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				unknown_directive
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "unknown property",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				max_streams 100 200
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "Wrong argument count",
 | ||
|  | 		},
 | ||
|  | 		{
 | ||
|  | 			input: `quic {
 | ||
|  | 				worker_pool_size 1000 2000
 | ||
|  | 			}`,
 | ||
|  | 			shouldErr:          true,
 | ||
|  | 			expectedErrContent: "Wrong argument count",
 | ||
|  | 		},
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	for i, test := range tests {
 | ||
|  | 		c := caddy.NewTestController("dns", test.input)
 | ||
|  | 		err := setup(c)
 | ||
|  | 
 | ||
|  | 		if test.shouldErr && err == nil {
 | ||
|  | 			t.Errorf("Test %d (%s): Expected error but found none", i, test.input)
 | ||
|  | 			continue
 | ||
|  | 		}
 | ||
|  | 		if !test.shouldErr && err != nil {
 | ||
|  | 			t.Errorf("Test %d (%s): Expected no error but found: %v", i, test.input, err)
 | ||
|  | 			continue
 | ||
|  | 		}
 | ||
|  | 
 | ||
|  | 		if test.shouldErr && !strings.Contains(err.Error(), test.expectedErrContent) {
 | ||
|  | 			t.Errorf("Test %d (%s): Expected error containing '%s', but got: %v",
 | ||
|  | 				i, test.input, test.expectedErrContent, err)
 | ||
|  | 			continue
 | ||
|  | 		}
 | ||
|  | 
 | ||
|  | 		if !test.shouldErr || (test.shouldErr && strings.Contains(test.expectedErrContent, "already defined")) {
 | ||
|  | 			config := dnsserver.GetConfig(c)
 | ||
|  | 			assertMaxStreamsValue(t, i, test.input, config.MaxQUICStreams, test.expectedMaxStreams)
 | ||
|  | 			assertWorkerPoolSizeValue(t, i, test.input, config.MaxQUICWorkerPoolSize, test.expectedWorkerPoolSize)
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // assertMaxStreamsValue compares the actual MaxQUICStreams value with the expected one
 | ||
|  | func assertMaxStreamsValue(t *testing.T, testIndex int, testInput string, actual, expected *int) {
 | ||
|  | 	if actual == nil && expected == nil {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if (actual == nil) != (expected == nil) {
 | ||
|  | 		t.Errorf("Test %d (%s): Expected MaxQUICStreams to be %v, but got %v",
 | ||
|  | 			testIndex, testInput, formatNilableInt(expected), formatNilableInt(actual))
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if *actual != *expected {
 | ||
|  | 		t.Errorf("Test %d (%s): Expected MaxQUICStreams to be %d, but got %d",
 | ||
|  | 			testIndex, testInput, *expected, *actual)
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // assertWorkerPoolSizeValue compares the actual MaxQUICWorkerPoolSize value with the expected one
 | ||
|  | func assertWorkerPoolSizeValue(t *testing.T, testIndex int, testInput string, actual, expected *int) {
 | ||
|  | 	if actual == nil && expected == nil {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if (actual == nil) != (expected == nil) {
 | ||
|  | 		t.Errorf("Test %d (%s): Expected MaxQUICWorkerPoolSize to be %v, but got %v",
 | ||
|  | 			testIndex, testInput, formatNilableInt(expected), formatNilableInt(actual))
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if *actual != *expected {
 | ||
|  | 		t.Errorf("Test %d (%s): Expected MaxQUICWorkerPoolSize to be %d, but got %d",
 | ||
|  | 			testIndex, testInput, *expected, *actual)
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | func formatNilableInt(v *int) string {
 | ||
|  | 	if v == nil {
 | ||
|  | 		return "nil"
 | ||
|  | 	}
 | ||
|  | 	return fmt.Sprintf("%d", *v)
 | ||
|  | }
 | ||
|  | 
 | ||
|  | func pint(i int) *int {
 | ||
|  | 	return &i
 | ||
|  | }
 |