Blame specs/posix_sys_stat_spec.yaml

Packit 437b5e
specify posix.sys.stat:
Packit 437b5e
- before:
Packit 437b5e
    st = require "posix.sys.stat"
Packit 437b5e
Packit 437b5e
    S_IRWXU, S_IRWXG, S_IRWXO = st.S_IRWXU, st.S_IRWXG, st.S_IRWXO
Packit 437b5e
    S_ISBLK, S_ISCHR, S_ISDIR, S_ISFIFO, S_ISREG, S_ISLNK, S_ISSOCK =
Packit 437b5e
      st.S_ISBLK, st.S_ISCHR, st.S_ISDIR, st.S_ISFIFO, st.S_ISREG, st.S_ISLNK, st.S_ISSOCK
Packit 437b5e
    RWXALL = bor (S_IRWXU, S_IRWXG, S_IRWXO)
Packit 437b5e
Packit 437b5e
    dir = posix.mkdtemp (template)
Packit 437b5e
    posix.mkdir (dir .. "/subdir")
Packit 437b5e
    posix.link ("subdir", dir .. "/soft", true)
Packit 437b5e
    touch (dir .. "/file")
Packit 437b5e
    posix.link (dir .. "/file", dir .. "/hard")
Packit 437b5e
    posix.link ("no such destination", dir .. "/dangling", true)
Packit 437b5e
    posix.mkfifo (dir .. "/fifo")
Packit 437b5e
Packit 437b5e
- after:
Packit 437b5e
    rmtmp (dir)
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe chmod:
Packit 437b5e
  - before:
Packit 437b5e
      chmod, lstat = st.chmod, st.lstat
Packit 437b5e
      chmod (dir .. "/file", bor (st.S_IRWXU, st.S_IRGRP, st.S_IXGRP))
Packit 437b5e
Packit 437b5e
  - context with bad arguments: |
Packit 437b5e
      badargs.diagnose (chmod, "(string, int)")
Packit 437b5e
Packit 437b5e
      examples {
Packit 437b5e
        ["it diagnoses non-existent files"] = function ()
Packit 437b5e
          expect (Emsg (chmod (dir .. "/not existing file", st.S_IRWXU))).
Packit 437b5e
            to_contain "No such file or directory"
Packit 437b5e
        end
Packit 437b5e
      }
Packit 437b5e
Packit 437b5e
  - it sets file mode:
Packit 437b5e
      mode = bor (st.S_IRUSR, st.S_IWUSR, st.S_IXGRP, st.S_IROTH)
Packit 437b5e
      chmod (dir .. "/file", mode)
Packit 437b5e
      expect (band (lstat (dir .. "/file").st_mode, RWXALL)).to_be (mode)
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe lstat:
Packit 437b5e
  - before:
Packit 437b5e
      # choose a format without seconds, that won't cause a race condition
Packit 437b5e
      fmt = "%b %d %H:%M"
Packit 437b5e
      now = os.date (fmt)
Packit 437b5e
      getegid, geteuid = posix.getegid, posix.geteuid
Packit 437b5e
Packit 437b5e
      lstat = st.lstat
Packit 437b5e
Packit 437b5e
  - context with bad arguments:
Packit 437b5e
      badargs.diagnose (lstat, "(string)")
Packit 437b5e
Packit 437b5e
  - it returns a PosixStat:
Packit 437b5e
      expect (prototype (lstat (dir .. "/file"))).to_be "PosixStat"
Packit 437b5e
  - it fetches the device id:
Packit 437b5e
      dev = lstat (dir .. "/file").st_dev
Packit 437b5e
      expect (type (dev)).to_be "number"
Packit 437b5e
      expect (dev >= 0).to_be (true)
Packit 437b5e
      expect (dev).to_be (lstat (dir).st_dev)
Packit 437b5e
  - it fetches the file inode:
Packit 437b5e
      ino = lstat (dir .. "/file").st_ino
Packit 437b5e
      expect (type (ino)).to_be "number"
Packit 437b5e
      expect (ino >= 0).to_be (true)
Packit 437b5e
      expect (ino).to_be (lstat (dir .. "/hard").st_ino)
Packit 437b5e
      expect (ino).not_to_be (lstat (dir .. "/soft").st_ino)
Packit 437b5e
  - context with file mode:
Packit 437b5e
    - it fetches the file access mode:
Packit 437b5e
        mode = lstat (dir).st_mode
Packit 437b5e
        expect (type (mode)).to_be "number"
Packit 437b5e
        expect (band (mode, S_IRWXU)).to_be (S_IRWXU)
Packit 437b5e
    - it recognises directories:
Packit 437b5e
        expect (S_ISBLK (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (lstat (dir).st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISFIFO (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (lstat (dir).st_mode)).to_be (0)
Packit 437b5e
    - it recognises fifos:
Packit 437b5e
        expect (S_ISBLK (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISFIFO (lstat (dir .. "/fifo").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISREG (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (lstat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
    - it recognises regular files:
Packit 437b5e
        expect (S_ISBLK (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISFIFO (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (lstat (dir .. "/file").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISLNK (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (lstat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
    - it recognises soft links:
Packit 437b5e
        expect (S_ISBLK (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISFIFO (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (lstat (dir .. "/soft").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISSOCK (lstat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
  - it fetches the number of links:
Packit 437b5e
      expect (lstat (dir .. "/file").st_nlink).to_be (2)
Packit 437b5e
      expect (lstat (dir .. "/soft").st_nlink).to_be (1)
Packit 437b5e
      expect (lstat (dir .. "/hard").st_nlink).
Packit 437b5e
        to_be (lstat (dir .. "/file").st_nlink)
Packit 437b5e
      expect (lstat (dir .. "/subdir").st_nlink).to_be (2)
Packit 437b5e
  - it fetches the owner id:
Packit 437b5e
      expect (lstat (dir .. "/file").st_uid).to_be (geteuid ())
Packit 437b5e
      expect (lstat (dir .. "/subdir").st_uid).to_be (geteuid ())
Packit 437b5e
  - it fetches the owner group id:
Packit 437b5e
      expect (lstat (dir .. "/file").st_gid).to_be (getegid ())
Packit 437b5e
      expect (lstat (dir .. "/subdir").st_gid).to_be (getegid ())
Packit 437b5e
  - it fetches the device special file id:
Packit 437b5e
      pending "mknod not yet bound"
Packit 437b5e
  - it fetches the file size:
Packit 437b5e
      # skip directory size, which is system dependent
Packit 437b5e
      expect (lstat (dir .. "/file").st_size).to_be (0)
Packit 437b5e
      expect (lstat (dir .. "/soft").st_size).to_be (string.len ("subdir"))
Packit 437b5e
      expect (lstat (dir .. "/hard").st_size).
Packit 437b5e
        to_be (lstat (dir .. "/file").st_size)
Packit 437b5e
  - it fetches the file access time:
Packit 437b5e
      expect (os.date (fmt, lstat (dir .. "/file").st_atime)).to_be (os.date (fmt))
Packit 437b5e
  - it fetches the file modification time:
Packit 437b5e
      expect (os.date (fmt, lstat (dir .. "/file").st_mtime)).to_be (now)
Packit 437b5e
  - it fetches the file change time:
Packit 437b5e
      expect (os.date (fmt, lstat (dir .. "/file").st_ctime)).to_be (now)
Packit 437b5e
  - it fetches the device block size:
Packit 437b5e
      blksize = lstat (dir .. "/file").st_blksize
Packit 437b5e
      expect (type (blksize)).to_be "number"
Packit 437b5e
      expect (blksize > 0).to_be (true)
Packit 437b5e
      expect (blksize).to_be (lstat (dir .. "/hard").st_blksize)
Packit 437b5e
  - it fetches the number of blocks:
Packit 437b5e
      blocks = lstat (dir .. "/file").st_blocks
Packit 437b5e
      expect (type (blocks)).to_be "number"
Packit 437b5e
      expect (blocks >= 0).to_be (true)
Packit 437b5e
      expect (blocks).to_be (lstat (dir .. "/hard").st_blocks)
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe mkdir:
Packit 437b5e
  - before:
Packit 437b5e
      dir = posix.mkdtemp (template)
Packit 437b5e
      lstat, mkdir = st.lstat, st.mkdir
Packit 437b5e
Packit 437b5e
  - after:
Packit 437b5e
      rmtmp (dir)
Packit 437b5e
Packit 437b5e
  - context with bad arguments:
Packit 437b5e
      badargs.diagnose (mkdir, "(string, ?int)")
Packit 437b5e
Packit 437b5e
  - it creates the named directory:
Packit 437b5e
      expect (Emsg (mkdir (dir .. "/subdir"))).not_to_contain "exists"
Packit 437b5e
      mode = lstat (dir .. "/subdir").st_mode
Packit 437b5e
      expect (st.S_ISDIR (mode)).not_to_be (0)
Packit 437b5e
  - it sets the new directory permissions:
Packit 437b5e
      mkdir (dir .. "/subdir", S_IRWXU)
Packit 437b5e
      mode = lstat (dir .. "/subdir").st_mode
Packit 437b5e
      expect (band (mode, RWXALL)).to_be (S_IRWXU)
Packit 437b5e
  - it diagnoses already existing directory:
Packit 437b5e
      expect (Emsg (mkdir (dir, RWXALL))).to_contain "exists"
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe mkfifo:
Packit 437b5e
  - before:
Packit 437b5e
      dir = posix.mkdtemp (template)
Packit 437b5e
      lstat, mkfifo = st.lstat, st.mkfifo
Packit 437b5e
Packit 437b5e
  - after:
Packit 437b5e
      rmtmp (dir)
Packit 437b5e
Packit 437b5e
  - context with bad arguments:
Packit 437b5e
      badargs.diagnose (mkfifo, "(string, ?int)")
Packit 437b5e
Packit 437b5e
  - it creates the named fifo:
Packit 437b5e
      expect (Emsg (mkfifo (dir .. "/fifo"))).not_to_contain "exists"
Packit 437b5e
      mode = lstat (dir .. "/fifo").st_mode
Packit 437b5e
      expect (st.S_ISFIFO (mode)).not_to_be (0)
Packit 437b5e
  - it sets the new fifo permissions:
Packit 437b5e
      mkfifo (dir .. "/fifo", S_IRWXU)
Packit 437b5e
      mode = lstat (dir .. "/fifo").st_mode
Packit 437b5e
      expect (band (mode, RWXALL)).to_be (S_IRWXU)
Packit 437b5e
  - it diagnoses already existing fifo:
Packit 437b5e
      expect (Emsg (mkfifo (dir, RWXALL))).to_contain "exists"
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe stat:
Packit 437b5e
  - before:
Packit 437b5e
      # choose a format without seconds, that won't cause a race condition
Packit 437b5e
      fmt = "%b %d %H:%M"
Packit 437b5e
      now = os.date (fmt)
Packit 437b5e
      getegid, geteuid = posix.getegid, posix.geteuid
Packit 437b5e
Packit 437b5e
      stat = st.stat
Packit 437b5e
Packit 437b5e
  - context with bad arguments:
Packit 437b5e
      badargs.diagnose (stat, "(string)")
Packit 437b5e
Packit 437b5e
  - it returns a PosixStat:
Packit 437b5e
      expect (prototype (stat (dir .. "/file"))).to_be "PosixStat"
Packit 437b5e
  - it fetches the device id:
Packit 437b5e
      dev = stat (dir .. "/file").st_dev
Packit 437b5e
      expect (type (dev)).to_be "number"
Packit 437b5e
      expect (dev >= 0).to_be (true)
Packit 437b5e
      expect (dev).to_be (stat (dir).st_dev)
Packit 437b5e
  - it fetches the file inode:
Packit 437b5e
      ino = stat (dir .. "/file").st_ino
Packit 437b5e
      expect (type (ino)).to_be "number"
Packit 437b5e
      expect (ino >= 0).to_be (true)
Packit 437b5e
      expect (ino).to_be (stat (dir .. "/hard").st_ino)
Packit 437b5e
      expect (ino).not_to_be (stat (dir .. "/soft").st_ino)
Packit 437b5e
  - context with file mode:
Packit 437b5e
    - it fetches the file access mode:
Packit 437b5e
        mode = stat (dir).st_mode
Packit 437b5e
        expect (type (mode)).to_be "number"
Packit 437b5e
        expect (band (mode, S_IRWXU)).to_be (S_IRWXU)
Packit 437b5e
    - it recognises directories:
Packit 437b5e
        expect (S_ISBLK (stat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (stat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (stat (dir).st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISFIFO (stat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (stat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (stat (dir).st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (stat (dir).st_mode)).to_be (0)
Packit 437b5e
    - it recognises fifos:
Packit 437b5e
        expect (S_ISBLK (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISFIFO (stat (dir .. "/fifo").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISREG (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (stat (dir .. "/fifo").st_mode)).to_be (0)
Packit 437b5e
    - it recognises regular files:
Packit 437b5e
        expect (S_ISBLK (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISFIFO (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (stat (dir .. "/file").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISLNK (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (stat (dir .. "/file").st_mode)).to_be (0)
Packit 437b5e
    - it recognises soft links:
Packit 437b5e
        expect (S_ISBLK (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISCHR (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISDIR (stat (dir .. "/soft").st_mode)).not_to_be (0)
Packit 437b5e
        expect (S_ISFIFO (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISREG (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISLNK (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
        expect (S_ISSOCK (stat (dir .. "/soft").st_mode)).to_be (0)
Packit 437b5e
  - it fetches the number of links:
Packit 437b5e
      expect (stat (dir .. "/file").st_nlink).to_be (2)
Packit 437b5e
      expect (stat (dir .. "/soft").st_nlink).
Packit 437b5e
        to_be (stat (dir .. "/subdir").st_nlink)
Packit 437b5e
      expect (stat (dir .. "/hard").st_nlink).
Packit 437b5e
        to_be (stat (dir .. "/file").st_nlink)
Packit 437b5e
      expect (stat (dir .. "/subdir").st_nlink).to_be (2)
Packit 437b5e
  - it fetches the owner id:
Packit 437b5e
      expect (stat (dir .. "/file").st_uid).to_be (geteuid ())
Packit 437b5e
      expect (stat (dir .. "/subdir").st_uid).to_be (geteuid ())
Packit 437b5e
  - it fetches the owner group id:
Packit 437b5e
      expect (stat (dir .. "/file").st_gid).to_be (getegid ())
Packit 437b5e
      expect (stat (dir .. "/subdir").st_gid).to_be (getegid ())
Packit 437b5e
  - it fetches the device special file id:
Packit 437b5e
      pending "mknod not yet bound"
Packit 437b5e
  - it fetches the file size:
Packit 437b5e
      # skip directory size, which is system dependent
Packit 437b5e
      expect (stat (dir .. "/file").st_size).to_be (0)
Packit 437b5e
      expect (stat (dir .. "/soft").st_size).not_to_be (string.len ("subdir"))
Packit 437b5e
      expect (stat (dir .. "/hard").st_size).
Packit 437b5e
        to_be (stat (dir .. "/file").st_size)
Packit 437b5e
  - it fetches the file access time:
Packit 437b5e
      expect (os.date (fmt, stat (dir .. "/file").st_atime)).to_be (os.date (fmt))
Packit 437b5e
  - it fetches the file modification time:
Packit 437b5e
      expect (os.date (fmt, stat (dir .. "/file").st_mtime)).to_be (now)
Packit 437b5e
  - it fetches the file change time:
Packit 437b5e
      expect (os.date (fmt, stat (dir .. "/file").st_ctime)).to_be (now)
Packit 437b5e
  - it fetches the device block size:
Packit 437b5e
      blksize = stat (dir .. "/file").st_blksize
Packit 437b5e
      expect (type (blksize)).to_be "number"
Packit 437b5e
      expect (blksize > 0).to_be (true)
Packit 437b5e
      expect (blksize).to_be (stat (dir .. "/hard").st_blksize)
Packit 437b5e
  - it fetches the number of blocks:
Packit 437b5e
      blocks = stat (dir .. "/file").st_blocks
Packit 437b5e
      expect (type (blocks)).to_be "number"
Packit 437b5e
      expect (blocks >= 0).to_be (true)
Packit 437b5e
      expect (blocks).to_be (stat (dir .. "/hard").st_blocks)
Packit 437b5e
Packit 437b5e
Packit 437b5e
- describe umask:
Packit 437b5e
  - before:
Packit 437b5e
      lstat, umask = st.lstat, st.umask
Packit 437b5e
      newmask = band (st.S_IWGRP, st.S_IRWXO)
Packit 437b5e
      origmask = umask (newmask)
Packit 437b5e
  - after:
Packit 437b5e
      umask (origmask)
Packit 437b5e
Packit 437b5e
  - context with bad arguments:
Packit 437b5e
      badargs.diagnose (umask, "(int)")
Packit 437b5e
Packit 437b5e
  - it returns current umask:
Packit 437b5e
      expect (umask (0)).to_be (newmask)
Packit 437b5e
      expect (umask (newmask)).to_be (0)
Packit 437b5e
  - it controls the mode of newly created files:
Packit 437b5e
      all = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO)
Packit 437b5e
      xxx, mask = dir .. "/xxx", bor (st.S_IRWXO, st.S_IWGRP, st.S_IXGRP)
Packit 437b5e
      umask (mask)
Packit 437b5e
      touch (xxx)
Packit 437b5e
      expect (band (lstat (xxx).st_mode, all)).to_be (bor (st.S_IRUSR, st.S_IWUSR, st.S_IRGRP))
Packit 437b5e
      os.remove (xxx)