| package utils |
| |
| import ( |
| "io/ioutil" |
| "os" |
| "os/exec" |
| "path/filepath" |
| "testing" |
| "time" |
| |
| "github.com/google/go-cmp/cmp" |
| ) |
| |
| func TestLock(t *testing.T) { |
| if os.Getenv("TEST_LOCK") == "1" { |
| origLockFile := lockFile |
| lockFile = os.Getenv("TEST_DIR") |
| defer func(origLockFile string) { lockFile = origLockFile }(origLockFile) |
| Flock() |
| // forever so that the filelock won't be released. |
| for { |
| } |
| } |
| |
| tmpfile, err := ioutil.TempFile("", "testing") |
| if err != nil { |
| t.Fatalf("Failed to create tempfile: %v", err) |
| } |
| defer os.Remove(tmpfile.Name()) |
| |
| // First time to call Lock(), expect to wait forever |
| cmd1 := exec.Command(os.Args[0], "-test.run=TestLock") |
| cmd1.Env = append(os.Environ(), "TEST_LOCK=1", "TEST_DIR="+tmpfile.Name()) |
| if err := cmd1.Start(); err != nil { |
| t.Fatalf("Failed to start command: %v", err) |
| } |
| |
| // Wait 1 sec for the first process to lock file. |
| time.Sleep(time.Second) |
| |
| // Second time to call Lock(), expect to exit with status 1 |
| cmd2 := exec.Command(os.Args[0], "-test.run=TestLock") |
| cmd2.Env = append(os.Environ(), "TEST_LOCK=1", "TEST_DIR="+tmpfile.Name()) |
| if err := cmd2.Start(); err != nil { |
| t.Fatalf("Failed to start command: %v", err) |
| } |
| |
| waitWithTimeout(t, cmd1, 3, false) |
| waitWithTimeout(t, cmd2, 3, true) |
| } |
| |
| func waitWithTimeout(t *testing.T, cmd *exec.Cmd, timeout int, expectError bool) { |
| done := make(chan error, 1) |
| go func() { |
| done <- cmd.Wait() |
| }() |
| |
| select { |
| case <-time.After(time.Duration(timeout) * time.Second): |
| if err := cmd.Process.Kill(); err != nil { |
| t.Fatalf("Failed to kill process: %v", err) |
| } |
| if expectError { |
| t.Errorf("Process %s didn't exit while expecting to exit with error", cmd.Path) |
| } |
| case err := <-done: |
| e, ok := err.(*exec.ExitError) |
| if !ok { |
| t.Fatal("Failed to convert error to exec.ExitError") |
| } |
| if e.Success() == expectError { |
| t.Errorf("Process %s exited with unexpected status, want error: %v, got error: %v", |
| cmd.Path, expectError, !e.Success()) |
| } |
| } |
| } |
| |
| func TestParseVMToken(t *testing.T) { |
| token, err := parseVMToken( |
| `{"access_token":"ya29.c.Kmi8B89nrn2Esf2e4WEk2MlZp7G8EpMatfxD36UuG3QJpwqePPxLAMvlb-WEi-nnZ7WmFsxyTAhzFMlxBV4AEYfs1tdJqolDay_3BXkwv0cwFe6OO86_dSUWDbiK9gIYQ6bAE_oR9SdVdw","expires_in":3248,"token_type":"Bearer"}`) |
| if err != nil { |
| t.Fatalf("Failed to run parseVMToken: %v", err) |
| } |
| expectedToken := serviceAccountToken{ |
| Token: "ya29.c.Kmi8B89nrn2Esf2e4WEk2MlZp7G8EpMatfxD36UuG3QJpwqePPxLAMvlb-WEi-nnZ7WmFsxyTAhzFMlxBV4AEYfs1tdJqolDay_3BXkwv0cwFe6OO86_dSUWDbiK9gIYQ6bAE_oR9SdVdw", |
| Expire: 3248, |
| TokenType: "Bearer", |
| } |
| if diff := cmp.Diff(*token, expectedToken); diff != "" { |
| t.Errorf("Unexpected return\nwant: %v\ngot: %v\ndiff: %v", expectedToken, *token, diff) |
| } |
| } |
| |
| func TestIsDirEmpty(t *testing.T) { |
| emptyDir, err := ioutil.TempDir("", "testing") |
| if err != nil { |
| t.Fatalf("Failed to create tmp dir: %v", err) |
| } |
| defer os.RemoveAll(emptyDir) |
| |
| nonEmptyDir, err := ioutil.TempDir("", "testing") |
| if err != nil { |
| t.Fatalf("Failed to create tmp dir: %v", err) |
| } |
| defer os.RemoveAll(nonEmptyDir) |
| |
| tmpfile, err := ioutil.TempFile(nonEmptyDir, "testing") |
| if err != nil { |
| t.Fatalf("Failed to create tmp file: %v", err) |
| } |
| |
| defer os.Remove(tmpfile.Name()) |
| |
| for _, tc := range []struct { |
| testName string |
| dir string |
| expectEmpty bool |
| }{ |
| {"EmptyDir", emptyDir, true}, |
| {"NonEmptyDir", nonEmptyDir, false}, |
| } { |
| ret, _ := IsDirEmpty(tc.dir) |
| if ret != tc.expectEmpty { |
| t.Errorf("%v: Unexpected return, want: %v, got: %v", tc.testName, tc.expectEmpty, ret) |
| } |
| } |
| } |
| |
| func TestLoadEnvFromFile(t *testing.T) { |
| testDir, err := ioutil.TempDir("", "testing") |
| if err != nil { |
| t.Fatalf("Failed to create test dir: %v", err) |
| } |
| defer os.RemoveAll(testDir) |
| envStr := `key1=value1 |
| key2=value2` |
| if err := ioutil.WriteFile(filepath.Join(testDir, "env"), []byte(envStr), 0644); err != nil { |
| t.Fatalf("Failed to write to env file: %v", err) |
| } |
| |
| envs, err := LoadEnvFromFile(testDir, "env") |
| if err != nil { |
| t.Fatalf("Failed to read from env file: %v", err) |
| } |
| |
| expectedEnvs := map[string]string{ |
| "key1": "value1", |
| "key2": "value2", |
| } |
| if diff := cmp.Diff(envs, expectedEnvs); diff != "" { |
| t.Errorf("Unexpected envs, want: %v, got: %v, diff: %v", expectedEnvs, envs, diff) |
| } |
| } |