blob: 05d2b9f6c27de0c3076a0e590a99578b8d0c8be7 [file] [log] [blame]
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)
}
}