shithub: hugo

Download patch

ref: 82a0888995dc9745a9e1c68a4f9d68a7f448c000
parent: c2e29138728ffbae19b4b0a3e59503c47dd986a5
author: Anthony Fok <[email protected]>
date: Mon Feb 16 22:35:23 EST 2015

Revert "Expansion of unit tests for utils/utils.go"

Rationale: Test failing on Windows with errors like this:

    utils_test.go:177: Error: Could not remove file "f".
    Error: remove C:\Users\appveyor\AppData\Local\Temp\utils_test_747965610:
    The process cannot access the file because it is being used by another
    process.

This reverts commit 6b28e38cea0dec3e3f045ab8ec833608b91a946f.

Sorry for my premature merge of Pull Request #818.

--- a/utils/utils.go
+++ b/utils/utils.go
@@ -22,39 +22,36 @@
 
 func StopOnErr(err error, s ...string) {
 	if err != nil {
-		doStopOnErr(err, s...)
-		os.Exit(-1)
-	}
-}
+		if len(s) == 0 {
+			newMessage := cutUsageMessage(err.Error())
 
-func doStopOnErr(err error, s ...string) {
-	if len(s) == 0 {
-		newMessage := cutUsageMessage(err.Error())
-		// Printing an empty string results in a error with
-		// no message, no bueno.
-		if newMessage != "" {
-			jww.CRITICAL.Println(newMessage)
-		}
-	} else {
-		for _, message := range s {
-			message := cutUsageMessage(message)
+			// Printing an empty string results in a error with
+			// no message, no bueno.
+			if newMessage != "" {
+				jww.CRITICAL.Println(newMessage)
+			}
+		} else {
+			for _, message := range s {
+				message := cutUsageMessage(message)
 
-			if message != "" {
-				jww.CRITICAL.Println(message)
+				if message != "" {
+					jww.CRITICAL.Println(message)
+				}
 			}
 		}
+		os.Exit(-1)
 	}
 }
 
 // cutUsageMessage splits the incoming string on the beginning of the usage
 // message text. Anything in the first element of the returned slice, trimmed
-// of its Unicode defined spaces, should be returned. The 2nd element of the
+// of its Unicode defined spaces, should be returned. The 2nd element of the 
 // slice will have the usage message  that we wish to elide.
 //
 // This is done because Cobra already prints Hugo's usage message; not eliding
-// would result in the usage output being printed twice, which leads to bug
+// would result in the usage output being printed twice, which leads to bug 
 // reports, more specifically: https://github.com/spf13/hugo/issues/374
 func cutUsageMessage(s string) string {
-	pieces := strings.Split(s, "Usage of")
+	pieces :=  strings.Split(s, "Usage of") 
 	return strings.TrimSpace(pieces[0])
 }
--- a/utils/utils_test.go
+++ b/utils/utils_test.go
@@ -1,35 +1,22 @@
 package utils
 
 import (
-	"bufio"
-	"bytes"
-	"errors"
-	"io/ioutil"
-	"os"
-	"regexp"
 	"testing"
+	)
 
-	jww "github.com/spf13/jwalterweatherman"
-)
 
-type testData struct {
-	logLevel        string
-	logError        string
-	logStr          []string
-	logFileExpected bool
-}
 
 func TestCutUsageMessage(t *testing.T) {
-	tests := []struct {
-		message    string
+	tests := []struct{
+		message string
 		cutMessage string
 	}{
 		{"", ""},
-		{" Usage of hugo: \n  -b, --baseUrl=...", ""},
-		{"Some error Usage of hugo: \n", "Some error"},
-		{"Usage of hugo: \n -b --baseU", ""},
-		{"CRITICAL error for usage of hugo ", "CRITICAL error for usage of hugo"},
-		{"Invalid short flag a in -abcde", "Invalid short flag a in -abcde"},
+                {" Usage of hugo: \n  -b, --baseUrl=...", ""},
+                {"Some error Usage of hugo: \n", "Some error"},
+                {"Usage of hugo: \n -b --baseU", ""},
+                {"CRITICAL error for usage of hugo ", "CRITICAL error for usage of hugo"},
+                {"Invalid short flag a in -abcde", "Invalid short flag a in -abcde"},
 	}
 
 	for _, test := range tests {
@@ -37,143 +24,5 @@
 		if message != test.cutMessage {
 			t.Errorf("Expected %#v, got %#v", test.cutMessage, message)
 		}
-	}
-}
-
-func TestCheckErr(t *testing.T) {
-	tests := []testData{
-		{"ERROR", "first test case", []string{""}, true},
-		{"ERROR", "second test case", []string{"banana", "man"}, true},
-		{"ERROR", "third test case", []string{"multi-word string"}, true},
-		{"ERROR", "fourth test case", []string{"multiple", "multi-word strings"}, true},
-		{"CRITICAL", "Oops no array of strings", []string{}, true},
-	}
-	for _, test := range tests {
-		filename := setup(t)
-		defer teardown(t, filename)
-		CheckErr(errors.New(test.logError), test.logStr...) // converts the array of strings in test.logStr to a varadic - cool!
-		checkLogFile(t, filename, &test)
-	}
-}
-
-func TestDoStopOnErr(t *testing.T) {
-	tests := []struct {
-		message    string
-		cutMessage string
-		t          testData
-	}{
-		{"", "", testData{"", "", []string{}, false}},
-		{" Usage of hugo: \n  -b, --baseUrl=...", "", testData{"", "", []string{}, false}},
-		{"Some error Usage of hugo: \n", "Some error", testData{"CRITICAL", "Some error", []string{}, true}},
-		// sould get the same output if we pass any array of strings and not via the error
-		{"Some error Usage of hugo: \n", "Some error", testData{"CRITICAL", "", []string{"Some error"}, true}},
-		{"Usage of hugo: \n -b --baseU", "", testData{"", "", []string{""}, false}},
-		{"CRITICAL error for usage of hugo ", "CRITICAL error for usage of hugo", testData{"CRITICAL", "CRITICAL error for usage of hugo", []string{""}, false}},
-		{"CRITICAL error for usage of hugo ", "CRITICAL error for usage of hugo", testData{"CRITICAL", "", []string{"CRITICAL error for usage of hugo"}, true}},
-		{"Invalid short flag a in -abcde", "Invalid short flag a in -abcde", testData{"CRITICAL", "Invalid short flag a in -abcde", []string{""}, false}},
-		{"Invalid short flag a in -abcde", "Invalid short flag a in -abcde", testData{"CRITICAL", "", []string{"Invalid short flag a in -abcde"}, true}},
-	}
-
-	for _, test := range tests {
-		filename := setup(t)
-		defer teardown(t, filename)
-		doStopOnErr(errors.New(test.t.logError), test.t.logStr...) // converts the array of strings in test.logStr to a varadic - cool!
-		checkLogFile(t, filename, &test.t)
-	}
-
-}
-
-func checkLogFile(t *testing.T, filename string, test *testData) {
-	contents, err := ioutil.ReadFile(filename)
-	if err != nil {
-		t.Fatalf("Could not open the log file \"%s\". Failed with %v\n", filename, err)
-	}
-	// does the test expect to have a log file. If so, it must also have contents.
-	if !logFileIsExpectedAndValid(t, filename, test, &contents) {
-		return
-	}
-	r := bytes.NewReader(contents)
-	scanner := bufio.NewScanner(r)
-	errorMessageMatches := false
-	for scanner.Scan() {
-		line := scanner.Text()
-		// lines in the log file are of the form:
-		// <log level>: yyyy/mm/dd <string|error message>
-		// we pase this format left to right in three sections
-		checkForExpectedLogLevelOrFail(t, line, test)
-		errorMessageMatches = checkForExpectedErrorMsg(t, line, test)
-		// There was no match against the error message. So see if it matchs one of the error strings
-		if !errorMessageMatches {
-			checkForExpectedStingOrFail(t, line, test)
-		}
-	}
-	if err = scanner.Err(); err != nil {
-		t.Fatalf("Could not scan the next token in the log file. Failed with: %v\n", err)
-	}
-}
-
-func logFileIsExpectedAndValid(t *testing.T, filename string, test *testData, contents *[]byte) bool {
-	if test.logFileExpected {
-		// yup, so then the file cannot be empty.
-		if len(*contents) == 0 {
-			t.Fatalf("Unexpected empty log file! Filename:\"%s\"\n", filename)
-		}
-		return true
-	}
-	// we don't expect a log file for this test so bail here.
-	return false
-}
-
-func checkForExpectedLogLevelOrFail(t *testing.T, line string, test *testData) {
-	regexpErrorLabel := "^" + test.logLevel
-	validErrorLevel := regexp.MustCompile(regexpErrorLabel)
-	if !validErrorLevel.MatchString(line) {
-		// can't find the expected start of line string. So fail
-		t.Fatalf("Did not find the expected log level \"%s\" at the start of the line \"%s\"\n", test.logLevel, line)
-	}
-}
-
-func checkForExpectedErrorMsg(t *testing.T, line string, test *testData) bool {
-	regexpValidErrorMsg := test.logError + "$"
-	validErrorMsg := regexp.MustCompile(regexpValidErrorMsg)
-	return validErrorMsg.MatchString(line)
-}
-
-func checkForExpectedStingOrFail(t *testing.T, line string, test *testData) {
-	for _, s := range test.logStr {
-		regexpstr := s + "$"
-		validLineEnd := regexp.MustCompile(regexpstr)
-		if validLineEnd.MatchString(line) {
-			return
-		}
-	}
-	// if we reach here there was no match.
-	// Note: It's not possibe for this to be called with test.logStr as an empty array.
-	// The proceeding call to checkForExpectedErrorMsg
-	// in checkLogFile guarentees this. i.e. checkForExpecedErrorMsg will return true in this case.
-	t.Fatalf("Did not find any of the strings \"%v\" in \"%s\"\n", test.logStr, line)
-}
-
-func setup(t *testing.T) string {
-	// first set the logger
-	// we can't use jww.UseLogTempFile for this, becase we need the file name
-	// so we can delete the file in teardown function.
-	// We should really fix jww.UseLogTempFile so we can access the temp file, or
-	// better yet provide a "DeleteTempLogFile" function
-	const logfilename = "utils_test_"
-	f, err := ioutil.TempFile(os.TempDir(), logfilename)
-	if err != nil {
-		t.Errorf("Error: Could not create temporary file for the logger. Error: %#v\n", err)
-	}
-	jww.SetStdoutThreshold(jww.LevelFatal)
-	// jww.SetLogFile generates the "Logging to .... " line on stdout.
-	// Maybe we should update jww to remove the fmt.PrintF calls?
-	jww.SetLogFile(f.Name())
-	return f.Name()
-}
-
-func teardown(t *testing.T, f string) {
-	if err := os.Remove(f); err != nil {
-		t.Errorf("Error: Could not remove file \"f\". Error: %v\n", err)
 	}
 }