From 240de5a5dd20caba4560b9463d532dc629aaab4c Mon Sep 17 00:00:00 2001
From: Billie Cleek <bhcleek@users.noreply.github.com>
Date: Sat, 16 May 2020 10:14:03 -0700
Subject: [PATCH] v1: Allow empty files to be imported (#3421)

* add tests for an empty file

* return nil from lexer.load when the file is empty
---
 caddyfile/lexer.go      |  3 +++
 caddyfile/parse_test.go | 52 ++++++++++++++++++++++++++++++-----------
 2 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/caddyfile/lexer.go b/caddyfile/lexer.go
index 2b38627be..f928772e1 100644
--- a/caddyfile/lexer.go
+++ b/caddyfile/lexer.go
@@ -48,6 +48,9 @@ func (l *lexer) load(input io.Reader) error {
 	// discard byte order mark, if present
 	firstCh, _, err := l.reader.ReadRune()
 	if err != nil {
+		if err == io.EOF {
+			return nil
+		}
 		return err
 	}
 	if firstCh != 0xFEFF {
diff --git a/caddyfile/parse_test.go b/caddyfile/parse_test.go
index 10beb5b56..2b1409192 100644
--- a/caddyfile/parse_test.go
+++ b/caddyfile/parse_test.go
@@ -23,21 +23,47 @@ import (
 )
 
 func TestAllTokens(t *testing.T) {
-	input := strings.NewReader("a b c\nd e")
-	expected := []string{"a", "b", "c", "d", "e"}
-	tokens, err := allTokens(input)
-
-	if err != nil {
-		t.Fatalf("Expected no error, got %v", err)
-	}
-	if len(tokens) != len(expected) {
-		t.Fatalf("Expected %d tokens, got %d", len(expected), len(tokens))
+	tests := []struct {
+		name     string
+		input    string
+		expected []string
+	}{
+		{
+			name:     "not-empty",
+			input:    "a b c\nd e",
+			expected: []string{"a", "b", "c", "d", "e"},
+		}, {
+			name:  "empty",
+			input: "",
+		}, {
+			name:  "newline",
+			input: "\n",
+		}, {
+			name:  "space",
+			input: " ",
+		}, {
+			name:  "tab and newline",
+			input: "\t\n",
+		},
 	}
 
-	for i, val := range expected {
-		if tokens[i].Text != val {
-			t.Errorf("Token %d should be '%s' but was '%s'", i, val, tokens[i].Text)
-		}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			tokens, err := allTokens(strings.NewReader(tt.input))
+
+			if err != nil {
+				t.Fatalf("Expected no error, got %v", err)
+			}
+			if len(tokens) != len(tt.expected) {
+				t.Fatalf("Expected %d tokens, got %d", len(tt.expected), len(tokens))
+			}
+
+			for i, val := range tt.expected {
+				if tokens[i].Text != val {
+					t.Errorf("Token %d should be '%s' but was '%s'", i, val, tokens[i].Text)
+				}
+			}
+		})
 	}
 }