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  }