github.com/lovishpuri/go-40569/src@v0.0.0-20230519171745-f8623e7c56cf/testing/testing_test.go (about)

     1  // Copyright 2014 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  
     5  package testing_test
     6  
     7  import (
     8  	"bytes"
     9  	"internal/testenv"
    10  	"os"
    11  	"path/filepath"
    12  	"testing"
    13  )
    14  
    15  // This is exactly what a test would do without a TestMain.
    16  // It's here only so that there is at least one package in the
    17  // standard library with a TestMain, so that code is executed.
    18  
    19  func TestMain(m *testing.M) {
    20  	os.Exit(m.Run())
    21  }
    22  
    23  func TestTempDirInCleanup(t *testing.T) {
    24  	var dir string
    25  
    26  	t.Run("test", func(t *testing.T) {
    27  		t.Cleanup(func() {
    28  			dir = t.TempDir()
    29  		})
    30  		_ = t.TempDir()
    31  	})
    32  
    33  	fi, err := os.Stat(dir)
    34  	if fi != nil {
    35  		t.Fatalf("Directory %q from user Cleanup still exists", dir)
    36  	}
    37  	if !os.IsNotExist(err) {
    38  		t.Fatalf("Unexpected error: %v", err)
    39  	}
    40  }
    41  
    42  func TestTempDirInBenchmark(t *testing.T) {
    43  	testing.Benchmark(func(b *testing.B) {
    44  		if !b.Run("test", func(b *testing.B) {
    45  			// Add a loop so that the test won't fail. See issue 38677.
    46  			for i := 0; i < b.N; i++ {
    47  				_ = b.TempDir()
    48  			}
    49  		}) {
    50  			t.Fatal("Sub test failure in a benchmark")
    51  		}
    52  	})
    53  }
    54  
    55  func TestTempDir(t *testing.T) {
    56  	testTempDir(t)
    57  	t.Run("InSubtest", testTempDir)
    58  	t.Run("test/subtest", testTempDir)
    59  	t.Run("test\\subtest", testTempDir)
    60  	t.Run("test:subtest", testTempDir)
    61  	t.Run("test/..", testTempDir)
    62  	t.Run("../test", testTempDir)
    63  	t.Run("test[]", testTempDir)
    64  	t.Run("test*", testTempDir)
    65  	t.Run("äöüéè", testTempDir)
    66  }
    67  
    68  func testTempDir(t *testing.T) {
    69  	dirCh := make(chan string, 1)
    70  	t.Cleanup(func() {
    71  		// Verify directory has been removed.
    72  		select {
    73  		case dir := <-dirCh:
    74  			fi, err := os.Stat(dir)
    75  			if os.IsNotExist(err) {
    76  				// All good
    77  				return
    78  			}
    79  			if err != nil {
    80  				t.Fatal(err)
    81  			}
    82  			t.Errorf("directory %q still exists: %v, isDir=%v", dir, fi, fi.IsDir())
    83  		default:
    84  			if !t.Failed() {
    85  				t.Fatal("never received dir channel")
    86  			}
    87  		}
    88  	})
    89  
    90  	dir := t.TempDir()
    91  	if dir == "" {
    92  		t.Fatal("expected dir")
    93  	}
    94  	dir2 := t.TempDir()
    95  	if dir == dir2 {
    96  		t.Fatal("subsequent calls to TempDir returned the same directory")
    97  	}
    98  	if filepath.Dir(dir) != filepath.Dir(dir2) {
    99  		t.Fatalf("calls to TempDir do not share a parent; got %q, %q", dir, dir2)
   100  	}
   101  	dirCh <- dir
   102  	fi, err := os.Stat(dir)
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  	if !fi.IsDir() {
   107  		t.Errorf("dir %q is not a dir", dir)
   108  	}
   109  	files, err := os.ReadDir(dir)
   110  	if err != nil {
   111  		t.Fatal(err)
   112  	}
   113  	if len(files) > 0 {
   114  		t.Errorf("unexpected %d files in TempDir: %v", len(files), files)
   115  	}
   116  
   117  	glob := filepath.Join(dir, "*.txt")
   118  	if _, err := filepath.Glob(glob); err != nil {
   119  		t.Error(err)
   120  	}
   121  }
   122  
   123  func TestSetenv(t *testing.T) {
   124  	tests := []struct {
   125  		name               string
   126  		key                string
   127  		initialValueExists bool
   128  		initialValue       string
   129  		newValue           string
   130  	}{
   131  		{
   132  			name:               "initial value exists",
   133  			key:                "GO_TEST_KEY_1",
   134  			initialValueExists: true,
   135  			initialValue:       "111",
   136  			newValue:           "222",
   137  		},
   138  		{
   139  			name:               "initial value exists but empty",
   140  			key:                "GO_TEST_KEY_2",
   141  			initialValueExists: true,
   142  			initialValue:       "",
   143  			newValue:           "222",
   144  		},
   145  		{
   146  			name:               "initial value is not exists",
   147  			key:                "GO_TEST_KEY_3",
   148  			initialValueExists: false,
   149  			initialValue:       "",
   150  			newValue:           "222",
   151  		},
   152  	}
   153  
   154  	for _, test := range tests {
   155  		if test.initialValueExists {
   156  			if err := os.Setenv(test.key, test.initialValue); err != nil {
   157  				t.Fatalf("unable to set env: got %v", err)
   158  			}
   159  		} else {
   160  			os.Unsetenv(test.key)
   161  		}
   162  
   163  		t.Run(test.name, func(t *testing.T) {
   164  			t.Setenv(test.key, test.newValue)
   165  			if os.Getenv(test.key) != test.newValue {
   166  				t.Fatalf("unexpected value after t.Setenv: got %s, want %s", os.Getenv(test.key), test.newValue)
   167  			}
   168  		})
   169  
   170  		got, exists := os.LookupEnv(test.key)
   171  		if got != test.initialValue {
   172  			t.Fatalf("unexpected value after t.Setenv cleanup: got %s, want %s", got, test.initialValue)
   173  		}
   174  		if exists != test.initialValueExists {
   175  			t.Fatalf("unexpected value after t.Setenv cleanup: got %t, want %t", exists, test.initialValueExists)
   176  		}
   177  	}
   178  }
   179  
   180  func TestSetenvWithParallelAfterSetenv(t *testing.T) {
   181  	defer func() {
   182  		want := "testing: t.Parallel called after t.Setenv; cannot set environment variables in parallel tests"
   183  		if got := recover(); got != want {
   184  			t.Fatalf("expected panic; got %#v want %q", got, want)
   185  		}
   186  	}()
   187  
   188  	t.Setenv("GO_TEST_KEY_1", "value")
   189  
   190  	t.Parallel()
   191  }
   192  
   193  func TestSetenvWithParallelBeforeSetenv(t *testing.T) {
   194  	defer func() {
   195  		want := "testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests"
   196  		if got := recover(); got != want {
   197  			t.Fatalf("expected panic; got %#v want %q", got, want)
   198  		}
   199  	}()
   200  
   201  	t.Parallel()
   202  
   203  	t.Setenv("GO_TEST_KEY_1", "value")
   204  }
   205  
   206  func TestSetenvWithParallelParentBeforeSetenv(t *testing.T) {
   207  	t.Parallel()
   208  
   209  	t.Run("child", func(t *testing.T) {
   210  		defer func() {
   211  			want := "testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests"
   212  			if got := recover(); got != want {
   213  				t.Fatalf("expected panic; got %#v want %q", got, want)
   214  			}
   215  		}()
   216  
   217  		t.Setenv("GO_TEST_KEY_1", "value")
   218  	})
   219  }
   220  
   221  func TestSetenvWithParallelGrandParentBeforeSetenv(t *testing.T) {
   222  	t.Parallel()
   223  
   224  	t.Run("child", func(t *testing.T) {
   225  		t.Run("grand-child", func(t *testing.T) {
   226  			defer func() {
   227  				want := "testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests"
   228  				if got := recover(); got != want {
   229  					t.Fatalf("expected panic; got %#v want %q", got, want)
   230  				}
   231  			}()
   232  
   233  			t.Setenv("GO_TEST_KEY_1", "value")
   234  		})
   235  	})
   236  }
   237  
   238  // testingTrueInInit is part of TestTesting.
   239  var testingTrueInInit = false
   240  
   241  // testingTrueInPackageVarInit is part of TestTesting.
   242  var testingTrueInPackageVarInit = testing.Testing()
   243  
   244  // init is part of TestTesting.
   245  func init() {
   246  	if testing.Testing() {
   247  		testingTrueInInit = true
   248  	}
   249  }
   250  
   251  var testingProg = `
   252  package main
   253  
   254  import (
   255  	"fmt"
   256  	"testing"
   257  )
   258  
   259  func main() {
   260  	fmt.Println(testing.Testing())
   261  }
   262  `
   263  
   264  func TestTesting(t *testing.T) {
   265  	if !testing.Testing() {
   266  		t.Errorf("testing.Testing() == %t, want %t", testing.Testing(), true)
   267  	}
   268  	if !testingTrueInInit {
   269  		t.Errorf("testing.Testing() called by init function == %t, want %t", testingTrueInInit, true)
   270  	}
   271  	if !testingTrueInPackageVarInit {
   272  		t.Errorf("testing.Testing() variable initialized as %t, want %t", testingTrueInPackageVarInit, true)
   273  	}
   274  
   275  	if testing.Short() {
   276  		t.Skip("skipping building a binary in short mode")
   277  	}
   278  	testenv.MustHaveGoRun(t)
   279  
   280  	fn := filepath.Join(t.TempDir(), "x.go")
   281  	if err := os.WriteFile(fn, []byte(testingProg), 0644); err != nil {
   282  		t.Fatal(err)
   283  	}
   284  
   285  	cmd := testenv.Command(t, testenv.GoToolPath(t), "run", fn)
   286  	out, err := cmd.CombinedOutput()
   287  	if err != nil {
   288  		t.Fatalf("%v failed: %v\n%s", cmd, err, out)
   289  	}
   290  
   291  	s := string(bytes.TrimSpace(out))
   292  	if s != "false" {
   293  		t.Errorf("in non-test testing.Test() returned %q, want %q", s, "false")
   294  	}
   295  }