github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/manualtest/filelock/main.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "bytes" 6 "flag" 7 "fmt" 8 "os" 9 "os/exec" 10 "path/filepath" 11 12 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/storage" 13 ) 14 15 var ( 16 filename string 17 child bool 18 ) 19 20 func init() { 21 flag.StringVar(&filename, "filename", filepath.Join(os.TempDir(), "goleveldb_filelock_test"), "Filename used for testing") 22 flag.BoolVar(&child, "child", false, "This is the child") 23 } 24 25 func runChild() error { 26 var args []string 27 args = append(args, os.Args[1:]...) 28 args = append(args, "-child") 29 cmd := exec.Command(os.Args[0], args...) 30 var out bytes.Buffer 31 cmd.Stdout = &out 32 err := cmd.Run() 33 r := bufio.NewReader(&out) 34 for { 35 line, _, e1 := r.ReadLine() 36 if e1 != nil { 37 break 38 } 39 fmt.Println("[Child]", string(line)) 40 } 41 return err 42 } 43 44 func main() { 45 flag.Parse() 46 47 fmt.Printf("Using path: %s\n", filename) 48 if child { 49 fmt.Println("Child flag set.") 50 } 51 52 stor, err := storage.OpenFile(filename, false) 53 if err != nil { 54 fmt.Printf("Could not open storage: %s", err) 55 os.Exit(10) 56 } 57 58 if !child { 59 fmt.Println("Executing child -- first test (expecting error)") 60 err := runChild() 61 if err == nil { 62 fmt.Println("Expecting error from child") 63 } else if err.Error() != "exit status 10" { 64 fmt.Println("Got unexpected error from child:", err) 65 } else { 66 fmt.Printf("Got error from child: %s (expected)\n", err) 67 } 68 } 69 70 err = stor.Close() 71 if err != nil { 72 fmt.Printf("Error when closing storage: %s", err) 73 os.Exit(11) 74 } 75 76 if !child { 77 fmt.Println("Executing child -- second test") 78 err := runChild() 79 if err != nil { 80 fmt.Println("Got unexpected error from child:", err) 81 } 82 } 83 84 os.RemoveAll(filename) 85 }