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  }