• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package life_test
6
7import (
8	"bytes"
9	"cmd/cgo/internal/cgotest"
10	"internal/testenv"
11	"log"
12	"os"
13	"os/exec"
14	"path/filepath"
15	"testing"
16)
17
18func TestMain(m *testing.M) {
19	log.SetFlags(log.Lshortfile)
20	os.Exit(testMain(m))
21}
22
23func testMain(m *testing.M) int {
24	GOPATH, err := os.MkdirTemp("", "cgolife")
25	if err != nil {
26		log.Panic(err)
27	}
28	defer os.RemoveAll(GOPATH)
29	os.Setenv("GOPATH", GOPATH)
30
31	// Copy testdata into GOPATH/src/cgolife, along with a go.mod file
32	// declaring the same path.
33	modRoot := filepath.Join(GOPATH, "src", "cgolife")
34	if err := cgotest.OverlayDir(modRoot, "testdata"); err != nil {
35		log.Panic(err)
36	}
37	if err := os.Chdir(modRoot); err != nil {
38		log.Panic(err)
39	}
40	os.Setenv("PWD", modRoot)
41	if err := os.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
42		log.Panic(err)
43	}
44
45	return m.Run()
46}
47
48// TestTestRun runs a test case for cgo //export.
49func TestTestRun(t *testing.T) {
50	testenv.MustHaveGoRun(t)
51	testenv.MustHaveCGO(t)
52
53	cmd := exec.Command("go", "run", "main.go")
54	got, err := cmd.CombinedOutput()
55	if err != nil {
56		t.Fatalf("%v: %s\n%s", cmd, err, got)
57	}
58	want, err := os.ReadFile("main.out")
59	if err != nil {
60		t.Fatal("reading golden output:", err)
61	}
62	if !bytes.Equal(got, want) {
63		t.Errorf("'%v' output does not match expected in main.out. Instead saw:\n%s", cmd, got)
64	}
65}
66