diff --git a/internal/code-generator/generator/generator_test.go b/internal/code-generator/generator/generator_test.go index 8710eb8..ec8c809 100644 --- a/internal/code-generator/generator/generator_test.go +++ b/internal/code-generator/generator/generator_test.go @@ -2,6 +2,7 @@ package generator import ( "flag" + "fmt" "io/ioutil" "os" "os/exec" @@ -321,11 +322,17 @@ func (s *GeneratorTestSuite) TestGenerationFiles() { expected := normalizeSpaces(string(gold)) actual := normalizeSpaces(string(out)) - assert.Equal(s.T(), expected, actual, "Test %s", test.name) + // this produces large unreadable output, so we do it 'manually' instead + // assert.Equal(s.T(), expected, actual, "Test %s", test.name) if expected != actual { - s.T().Logf("%s generated is different from %q", test.name, test.wantOut) - s.T().Logf("Expected %q", expected[:400]) - s.T().Logf("Actual %q", actual[:400]) + assert.Fail(s.T(), fmt.Sprintf("%s output is different from %q", test.name, test.wantOut)) + diff, err := text_diff(gold, out) + if err != nil { + s.T().Logf("Failed produce a diff between expected and actual: %s", err.Error()) + s.T().Logf("Expected %q", expected[:400]) + s.T().Logf("Actual %q", actual[:400]) + } + s.T().Logf("\n%s", diff) } } diff --git a/internal/code-generator/generator/generator_test_util.go b/internal/code-generator/generator/generator_test_util.go new file mode 100644 index 0000000..552d90b --- /dev/null +++ b/internal/code-generator/generator/generator_test_util.go @@ -0,0 +1,66 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// https://cs.opensource.google/go/x/perf/+/e8d778a6:LICENSE + +package generator + +import ( + "bytes" + "fmt" + "os" + "os/exec" +) + +// text_diff returns a human-readable description of the differences between s1 and s2. +// It essentially is https://cs.opensource.google/go/x/perf/+/e8d778a6:internal/diff/diff.go +// Used only in code generator tests, as a debugging aid. +// It is not part of any release artifact and is not distibuted with enry. +func text_diff(b1, b2 []byte) (string, error) { + if bytes.Equal(b1, b2) { + return "", nil + } + + cmd := "diff" + if _, err := exec.LookPath(cmd); err != nil { + return "", fmt.Errorf("diff command unavailable\nold: %q\nnew: %q", b1, b2) + } + + f1, err := writeTempFile("", "gen_test", b1) + if err != nil { + return "", err + } + defer os.Remove(f1) + + f2, err := writeTempFile("", "gen_test", b2) + if err != nil { + return "", err + } + defer os.Remove(f2) + + data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput() + if len(data) > 0 { // diff exits with a non-zero status when the files don't match + err = nil + } + if err != nil { + return "", err + } + return string(data), nil +} + +func writeTempFile(dir, prefix string, data []byte) (string, error) { + file, err := os.CreateTemp(dir, prefix) + if err != nil { + return "", err + } + + _, err = file.Write(data) + if err1 := file.Close(); err == nil { + err = err1 + } + if err != nil { + os.Remove(file.Name()) + return "", err + } + return file.Name(), nil +}