From 5fdacfa89f871888d6f8fde726b8f95f11e674d6 Mon Sep 17 00:00:00 2001
From: Rob Pike <r@golang.org>
Date: Thu, 14 Jun 2018 11:09:28 +1000
Subject: [PATCH] cmd/cover: remove use of diff in cover_test.go

It's non-portable, and the test isn't hard to write without diff.
It still produces helpful output in case of trouble:

--- FAIL: TestCoverHTML (0.75s)
    cover_test.go:325: line 4 differs: got:
        	case &lt;-ch:<span class="cov0" title="0"></span>
        want:
        	case &lt;-ch:<span class="cov0" xitle="0"></span>

This makes the test operating-system independent.

Change-Id: Iff35f00cb76ba89bc1b93db01c6f994e74341f4a
Reviewed-on: https://go-review.googlesource.com/118795
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
---
 src/cmd/cover/cover_test.go | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go
index ec80f94e59d..23a609996bb 100644
--- a/src/cmd/cover/cover_test.go
+++ b/src/cmd/cover/cover_test.go
@@ -18,7 +18,6 @@ import (
 	"os/exec"
 	"path/filepath"
 	"regexp"
-	"runtime"
 	"strings"
 	"testing"
 )
@@ -267,9 +266,6 @@ func TestCoverFunc(t *testing.T) {
 // Check that cover produces correct HTML.
 // Issue #25767.
 func TestCoverHTML(t *testing.T) {
-	if _, err := exec.LookPath("diff"); err != nil {
-		t.Skipf("skip test on %s: diff command is required", runtime.GOOS)
-	}
 	testenv.MustHaveGoBuild(t)
 	if !*debug {
 		defer os.Remove(testcover)
@@ -307,16 +303,30 @@ func TestCoverHTML(t *testing.T) {
 			in = false
 		}
 	}
-	if err := ioutil.WriteFile(htmlHTML, out.Bytes(), 0644); err != nil {
-		t.Fatal(err)
+	golden, err := ioutil.ReadFile(htmlGolden)
+	if err != nil {
+		t.Fatalf("reading golden file: %v", err)
 	}
-	diff := "diff"
-	if runtime.GOOS == "plan9" {
-		diff = "/bin/ape/diff"
+	// Ignore white space differences.
+	// Break into lines, then compare by breaking into words.
+	goldenLines := strings.Split(string(golden), "\n")
+	outLines := strings.Split(out.String(), "\n")
+	// Compare at the line level, stopping at first different line so
+	// we don't generate tons of output if there's an inserted or deleted line.
+	for i, goldenLine := range goldenLines {
+		if i > len(outLines) {
+			t.Fatalf("output shorter than golden; stops before line %d: %s\n", i+1, goldenLine)
+		}
+		// Convert all white space to simple spaces, for easy comparison.
+		goldenLine = strings.Join(strings.Fields(goldenLine), " ")
+		outLine := strings.Join(strings.Fields(outLines[i]), " ")
+		if outLine != goldenLine {
+			t.Fatalf("line %d differs: got:\n\t%s\nwant:\n\t%s", i+1, outLine, goldenLine)
+		}
+	}
+	if len(goldenLines) != len(outLines) {
+		t.Fatalf("output longer than golden; first extra output line %d: %q\n", len(goldenLines), outLines[len(goldenLines)])
 	}
-	// diff -uw testdata/html/html.html testdata/html/html.golden
-	cmd = exec.Command(diff, "-u", "-w", htmlHTML, htmlGolden)
-	run(cmd, t)
 }
 
 func run(c *exec.Cmd, t *testing.T) {
-- 
GitLab