github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/testing/checkers/file.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package checkers 5 6 import ( 7 "fmt" 8 "os" 9 "reflect" 10 11 gc "launchpad.net/gocheck" 12 ) 13 14 // IsNonEmptyFile checker 15 16 type isNonEmptyFileChecker struct { 17 *gc.CheckerInfo 18 } 19 20 var IsNonEmptyFile gc.Checker = &isNonEmptyFileChecker{ 21 &gc.CheckerInfo{Name: "IsNonEmptyFile", Params: []string{"obtained"}}, 22 } 23 24 func (checker *isNonEmptyFileChecker) Check(params []interface{}, names []string) (result bool, error string) { 25 filename, isString := stringOrStringer(params[0]) 26 if isString { 27 fileInfo, err := os.Stat(filename) 28 if os.IsNotExist(err) { 29 return false, fmt.Sprintf("%s does not exist", filename) 30 } else if err != nil { 31 return false, fmt.Sprintf("other stat error: %v", err) 32 } 33 if fileInfo.Size() > 0 { 34 return true, "" 35 } else { 36 return false, fmt.Sprintf("%s is empty", filename) 37 } 38 } 39 40 value := reflect.ValueOf(params[0]) 41 return false, fmt.Sprintf("obtained value is not a string and has no .String(), %s:%#v", value.Kind(), params[0]) 42 } 43 44 // IsDirectory checker 45 46 type isDirectoryChecker struct { 47 *gc.CheckerInfo 48 } 49 50 var IsDirectory gc.Checker = &isDirectoryChecker{ 51 &gc.CheckerInfo{Name: "IsDirectory", Params: []string{"obtained"}}, 52 } 53 54 func (checker *isDirectoryChecker) Check(params []interface{}, names []string) (result bool, error string) { 55 path, isString := stringOrStringer(params[0]) 56 if isString { 57 fileInfo, err := os.Stat(path) 58 if os.IsNotExist(err) { 59 return false, fmt.Sprintf("%s does not exist", path) 60 } else if err != nil { 61 return false, fmt.Sprintf("other stat error: %v", err) 62 } 63 if fileInfo.IsDir() { 64 return true, "" 65 } else { 66 return false, fmt.Sprintf("%s is not a directory", path) 67 } 68 } 69 70 value := reflect.ValueOf(params[0]) 71 return false, fmt.Sprintf("obtained value is not a string and has no .String(), %s:%#v", value.Kind(), params[0]) 72 } 73 74 // IsSymlink checker 75 76 type isSymlinkChecker struct { 77 *gc.CheckerInfo 78 } 79 80 var IsSymlink gc.Checker = &isSymlinkChecker{ 81 &gc.CheckerInfo{Name: "IsSymlink", Params: []string{"obtained"}}, 82 } 83 84 func (checker *isSymlinkChecker) Check(params []interface{}, names []string) (result bool, error string) { 85 path, isString := stringOrStringer(params[0]) 86 if isString { 87 fileInfo, err := os.Lstat(path) 88 if os.IsNotExist(err) { 89 return false, fmt.Sprintf("%s does not exist", path) 90 } else if err != nil { 91 return false, fmt.Sprintf("other stat error: %v", err) 92 } 93 if fileInfo.Mode()&os.ModeSymlink != 0 { 94 return true, "" 95 } else { 96 return false, fmt.Sprintf("%s is not a symlink: %+v", path, fileInfo) 97 } 98 } 99 100 value := reflect.ValueOf(params[0]) 101 return false, fmt.Sprintf("obtained value is not a string and has no .String(), %s:%#v", value.Kind(), params[0]) 102 } 103 104 // DoesNotExist checker makes sure the path specified doesn't exist. 105 106 type doesNotExistChecker struct { 107 *gc.CheckerInfo 108 } 109 110 var DoesNotExist gc.Checker = &doesNotExistChecker{ 111 &gc.CheckerInfo{Name: "DoesNotExist", Params: []string{"obtained"}}, 112 } 113 114 func (checker *doesNotExistChecker) Check(params []interface{}, names []string) (result bool, error string) { 115 path, isString := stringOrStringer(params[0]) 116 if isString { 117 _, err := os.Stat(path) 118 if os.IsNotExist(err) { 119 return true, "" 120 } else if err != nil { 121 return false, fmt.Sprintf("other stat error: %v", err) 122 } 123 return false, fmt.Sprintf("%s exists", path) 124 } 125 126 value := reflect.ValueOf(params[0]) 127 return false, fmt.Sprintf("obtained value is not a string and has no .String(), %s:%#v", value.Kind(), params[0]) 128 } 129 130 // SymlinkDoesNotExist checker makes sure the path specified doesn't exist. 131 132 type symlinkDoesNotExistChecker struct { 133 *gc.CheckerInfo 134 } 135 136 var SymlinkDoesNotExist gc.Checker = &symlinkDoesNotExistChecker{ 137 &gc.CheckerInfo{Name: "SymlinkDoesNotExist", Params: []string{"obtained"}}, 138 } 139 140 func (checker *symlinkDoesNotExistChecker) Check(params []interface{}, names []string) (result bool, error string) { 141 path, isString := stringOrStringer(params[0]) 142 if isString { 143 _, err := os.Lstat(path) 144 if os.IsNotExist(err) { 145 return true, "" 146 } else if err != nil { 147 return false, fmt.Sprintf("other stat error: %v", err) 148 } 149 return false, fmt.Sprintf("%s exists", path) 150 } 151 152 value := reflect.ValueOf(params[0]) 153 return false, fmt.Sprintf("obtained value is not a string and has no .String(), %s:%#v", value.Kind(), params[0]) 154 }