github.com/motemen/ghq@v1.0.3/helpers_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net/url" 7 "os" 8 "testing" 9 ) 10 11 func mustParseURL(urlString string) *url.URL { 12 u, err := url.Parse(urlString) 13 if err != nil { 14 panic(err) 15 } 16 return u 17 } 18 19 func captureReader(block func()) (*os.File, *os.File, error) { 20 rOut, wOut, err := os.Pipe() 21 if err != nil { 22 return nil, nil, err 23 } 24 25 rErr, wErr, err := os.Pipe() 26 if err != nil { 27 return nil, nil, err 28 } 29 30 defer wOut.Close() 31 defer wErr.Close() 32 33 var stdout, stderr *os.File 34 os.Stdout, stdout = wOut, os.Stdout 35 os.Stderr, stderr = wErr, os.Stderr 36 37 defer func() { 38 os.Stdout = stdout 39 os.Stderr = stderr 40 }() 41 42 block() 43 44 wOut.Close() 45 wErr.Close() 46 47 return rOut, rErr, nil 48 } 49 50 func capture(block func()) (string, string, error) { 51 rOut, rErr, err := captureReader(block) 52 if err != nil { 53 return "", "", err 54 } 55 defer rOut.Close() 56 defer rErr.Close() 57 58 bufOut, err := ioutil.ReadAll(rOut) 59 if err != nil { 60 return "", "", err 61 } 62 63 bufErr, err := ioutil.ReadAll(rErr) 64 if err != nil { 65 return "", "", err 66 } 67 68 return string(bufOut), string(bufErr), nil 69 } 70 71 func captureWithInput(in []string, block func()) (string, string, error) { 72 rIn, wIn, err := os.Pipe() 73 if err != nil { 74 return "", "", err 75 } 76 defer rIn.Close() 77 var stdin *os.File 78 os.Stdin, stdin = rIn, os.Stdin 79 defer func() { os.Stdin = stdin }() 80 for _, line := range in { 81 fmt.Fprintln(wIn, line) 82 } 83 wIn.Close() 84 return capture(block) 85 } 86 87 func newTempDir(t *testing.T) string { 88 tmpdir, err := ioutil.TempDir("", "ghq-test") 89 if err != nil { 90 t.Fatal(err) 91 } 92 // Resolve /var/folders/.../T/... to /private/var/... in OSX 93 wd, err := os.Getwd() 94 if err != nil { 95 t.Fatalf("os.Getwd(): %s", err) 96 } 97 98 defer func() { 99 err := os.Chdir(wd) 100 if err != nil { 101 t.Fatalf("os.Chdir(): %s", err) 102 } 103 }() 104 105 err = os.Chdir(tmpdir) 106 if err != nil { 107 t.Fatalf("os.Chdir(): %s", err) 108 } 109 110 tmpdir, err = os.Getwd() 111 if err != nil { 112 t.Fatalf("os.Getwd(): %s", err) 113 } 114 115 s, err := toFullPath(tmpdir) 116 if err != nil { 117 t.Fatalf("toFullPath(%q): %s", tmpdir, err) 118 } 119 return s 120 } 121 122 func tmpEnv(key, val string) func() { 123 orig, ok := os.LookupEnv(key) 124 os.Setenv(key, val) 125 126 return func() { 127 if ok { 128 os.Setenv(key, orig) 129 } else { 130 os.Unsetenv(key) 131 } 132 } 133 }