From c79c32f5256af1faebd88b89542b6231de40f3ac Mon Sep 17 00:00:00 2001 From: Alex Bezzubov Date: Sat, 3 Dec 2022 09:49:09 +0100 Subject: [PATCH 1/2] gen-test: add readable text diff output test plan: * go test -run '^Test_GeneratorTestSuite$' \ -testify.m '^(TestGenerationFiles)$' \ github.com/go-enry/go-enry/v2/internal/code-generator/generator --- .../code-generator/generator/diff/diff.go | 58 +++++++++++++++++++ .../generator/generator_test.go | 16 +++-- 2 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 internal/code-generator/generator/diff/diff.go diff --git a/internal/code-generator/generator/diff/diff.go b/internal/code-generator/generator/diff/diff.go new file mode 100644 index 0000000..4fcbd55 --- /dev/null +++ b/internal/code-generator/generator/diff/diff.go @@ -0,0 +1,58 @@ +package diff + +import ( + "bytes" + "fmt" + "os" + "os/exec" +) + +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 +} + +// Diff returns a human-readable description of the differences between s1 and s2. +func 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 +} diff --git a/internal/code-generator/generator/generator_test.go b/internal/code-generator/generator/generator_test.go index 8710eb8..f36d053 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" @@ -9,6 +10,7 @@ import ( "strings" "testing" + "github.com/go-enry/go-enry/v2/internal/code-generator/generator/diff" "github.com/go-enry/go-enry/v2/internal/tokenizer" "github.com/stretchr/testify/assert" @@ -321,11 +323,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 := diff.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) } } From c0176b04e7a8493762e0d08fe43c2be85ae886c5 Mon Sep 17 00:00:00 2001 From: Alex Bezzubov Date: Mon, 12 Dec 2022 20:48:35 +0100 Subject: [PATCH 2/2] gen-test: don't expose diff + attributions --- .../generator/generator_test.go | 3 +- .../{diff/diff.go => generator_test_util.go} | 48 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) rename internal/code-generator/generator/{diff/diff.go => generator_test_util.go} (62%) diff --git a/internal/code-generator/generator/generator_test.go b/internal/code-generator/generator/generator_test.go index f36d053..ec8c809 100644 --- a/internal/code-generator/generator/generator_test.go +++ b/internal/code-generator/generator/generator_test.go @@ -10,7 +10,6 @@ import ( "strings" "testing" - "github.com/go-enry/go-enry/v2/internal/code-generator/generator/diff" "github.com/go-enry/go-enry/v2/internal/tokenizer" "github.com/stretchr/testify/assert" @@ -327,7 +326,7 @@ func (s *GeneratorTestSuite) TestGenerationFiles() { // assert.Equal(s.T(), expected, actual, "Test %s", test.name) if expected != actual { assert.Fail(s.T(), fmt.Sprintf("%s output is different from %q", test.name, test.wantOut)) - diff, err := diff.Diff(gold, out) + 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]) diff --git a/internal/code-generator/generator/diff/diff.go b/internal/code-generator/generator/generator_test_util.go similarity index 62% rename from internal/code-generator/generator/diff/diff.go rename to internal/code-generator/generator/generator_test_util.go index 4fcbd55..552d90b 100644 --- a/internal/code-generator/generator/diff/diff.go +++ b/internal/code-generator/generator/generator_test_util.go @@ -1,4 +1,9 @@ -package diff +// 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" @@ -7,25 +12,11 @@ import ( "os/exec" ) -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 -} - -// Diff returns a human-readable description of the differences between s1 and s2. -func Diff(b1, b2 []byte) (string, error) { +// 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 } @@ -56,3 +47,20 @@ func Diff(b1, b2 []byte) (string, error) { } 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 +}