github.com/tomnomnom/symwatch@v0.0.3-0.20160428234651-7fc5743ee889/symlink_test.go (about) 1 package main 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 "time" 9 ) 10 11 func TestGetTargetAbsolute(t *testing.T) { 12 _, symlink, cleanup := makeDirAndSymlink(t) 13 defer cleanup() 14 15 target, err := getTarget(symlink) 16 if err != nil { 17 t.Errorf("Error from getTarget should be nil but was: %s", err) 18 } 19 if !filepath.IsAbs(target) { 20 t.Errorf("Target returned by getTarget should be absolute but was [%s]", target) 21 } 22 } 23 24 func TestGetTargetRelative(t *testing.T) { 25 tmpdir, symlink, cleanup := makeDirAndSymlink(t) 26 defer cleanup() 27 28 // Get the current working directory 29 cwd, err := os.Getwd() 30 if err != nil { 31 t.Errorf("Failed to get current working directory: %s", err) 32 } 33 34 // Switch to the directory containing the tmpdir 35 err = os.Chdir(filepath.Dir(tmpdir)) 36 if err != nil { 37 t.Errorf("Failed to change directory: %s", err) 38 } 39 40 target, err := getTarget(filepath.Base(symlink)) 41 if err != nil { 42 t.Errorf("Error from getTarget should be nil but was: %s", err) 43 } 44 if !filepath.IsAbs(target) { 45 t.Errorf("Target returned by getTarget should be absolute but was [%s]", target) 46 } 47 48 // Switch back to the original working directory 49 err = os.Chdir(cwd) 50 if err != nil { 51 t.Errorf("Failed to get current working directory: %s", err) 52 } 53 54 } 55 56 func TestGetTargetNoFile(t *testing.T) { 57 _, err := getTarget("/almost/certainly/not/a/real/path") 58 if err == nil { 59 t.Errorf("Was expecting getTarget on a non-existant path to return an error but got nil") 60 } 61 } 62 63 func TestGetTargetNotSymlink(t *testing.T) { 64 tmpdir, cleanup := makeTestDir(t) 65 defer cleanup() 66 67 _, err := getTarget(tmpdir) 68 if err == nil { 69 t.Errorf("Was expecting getTarget on a non-symlink path to return an error but got nil") 70 } 71 } 72 73 func TestIsSymlink(t *testing.T) { 74 symlink, cleanup := makeSymlink(t, "thepathdoesnotmatter") 75 defer cleanup() 76 77 if !isSymlink(symlink) { 78 t.Errorf("isSymlink returned false for a symlink") 79 } 80 81 notASymlink, cleanup := makeTestDir(t) 82 defer cleanup() 83 84 if isSymlink(notASymlink) { 85 t.Errorf("isSymlink returned true for a regular directory") 86 } 87 } 88 89 func TestWaitForChange(t *testing.T) { 90 tmpdir, symlink, cleanup := makeDirAndSymlink(t) 91 defer cleanup() 92 93 target, err := waitForChange(symlink, "", time.Duration(0)) 94 if err != nil { 95 t.Errorf("Was expecting nil error value from waitForChange but got [%s]", err) 96 } 97 98 if target != tmpdir { 99 t.Errorf("Returned symlink target should have been [%s] but was [%s]", tmpdir, target) 100 } 101 102 } 103 104 type cleanup func() 105 106 func makeTestDir(t *testing.T) (string, cleanup) { 107 tmpdir, err := ioutil.TempDir("", "symwatch-") 108 if err != nil { 109 t.Errorf("Failed to create tmpdir: %s", err) 110 } 111 return tmpdir, func() { 112 _ = os.RemoveAll(tmpdir) 113 } 114 } 115 116 func makeSymlink(t *testing.T, path string) (string, cleanup) { 117 symlink := path + "-symlink" 118 err := os.Symlink(path, symlink) 119 if err != nil { 120 t.Errorf("Failed to create symlink: %s", err) 121 } 122 return symlink, func() { 123 _ = os.Remove(symlink) 124 } 125 } 126 127 func makeDirAndSymlink(t *testing.T) (string, string, cleanup) { 128 tmpdir, tmpclean := makeTestDir(t) 129 symlink, symclean := makeSymlink(t, tmpdir) 130 131 return tmpdir, symlink, func() { 132 tmpclean() 133 symclean() 134 } 135 136 }