# file      : tests/path-entry/testscript
# license   : MIT; see accompanying LICENSE file

# Note that atime tests may fail if running on a mount with noatime (for
# example, this happens on NetBSD).

: existing
:
{{
  : file
  :
  : Note that the newline character is translated into 2 characters being
  : printed on Windows. This why we exclude it, to get consistent behavior on
  : both POSIX and Windows.
  :
  {
    cat <:'abc' >=f
    $* f >>~%EOO%
      type: regular
      size: 3
      link count: 1
      %.+
      EOO
  }

  : dir
  :
  : Note that the size value is meaningless for directory entries.
  :
  {
    mkdir -p d
    $* d >>~%EOO%
      type: directory
      %.+
      EOO
  }

  : followed-symlink
  :
  {
    cat <:'abc' >=f
    ln -s f l
    $* -l l >>~%EOO%
      type: regular
      size: 3
      %.+
      EOO
  }

  : symlink
  :
  : If we are not cross-testing let's test if symlinks are properly followed.
  : On Windows that involves mklink command usability test. If we fail to
  : create a trial link (say because we are not in the Developer Mode and are
  : running non-elevated console), then the test group will be silently
  : skipped.
  :
  if ($test.target == $build.host)
  {{
    +if ($cxx.target.class != 'windows')
    {
      lnf = [cmdline] ^ln -s t l &l
      lnd = [cmdline] $lnf
    }
    else
    {
      echo 'yes' >=t
      if cmd /C 'mklink l t' >- 2>- &?l && cat l >'yes'
      {
        lnf = [cmdline] cmd /C 'mklink l t' &l >-
        lnd = [cmdline] cmd /C 'mklink /D l t' &l >-
      }

      jnc = [cmdline] cmd /C 'mklink /J l t' &l >-
    }

    : symlink
    :
    if! $empty($lnf)
    {{
      : file
      :
      {{
        : get-info
        :
        : Test that the target type, size, permissions and file times are
        : obtained via a symlink.
        :
        {
          cat <:'abc' >=t
          $lnf
          $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' t | set ti
          $* -l l >"$ti"
        }

        : set-info
        :
        : Test that permissions and file times are set via a symlink.
        :
        {
          cat <:'abc' >=t
          $lnf
          $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' l | set ti
          sed -n -e 's/permissions: (.+)/\1/p' <"$ti" >~/'4.{2}'/
          sed -n -e 's/mtime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:00'
          sed -n -e 's/atime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:01'
        }

        : touch
        :
        : Test that a symlink touch touches the target.
        :
        {
          cat <:'abc' >=t
          $lnf
          $* t | set ti
          sleep 2
          $* -t l | set li
          if ("$ti" == "$li")
            exit "link touch doesn't change target"
        }
      }}

      : dir
      :
      {{
        : get-info
        :
        : Test that the target type, size, permissions and file times are
        : obtained via a symlink.
        :
        {
          mkdir t
          $lnd
          $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' t | set ti
          $* -l l >"$ti"
        }

        : set-info
        :
        : Test that permissions and file times are set via a symlink.
        :
        {
          mkdir t
          $lnd
          $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' l | set ti
          sed -n -e 's/permissions: (.+)/\1/p' <"$ti" >~/'4.{2}'/
          sed -n -e 's/mtime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:00'
          sed -n -e 's/atime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:01'
        }
      }}
    }}

    : junction
    :
    if! $empty($jnc)
    {{
      : get-info
      :
      : Test that the target type, size, permissions and file times are
      : obtained via a junction.
      :
      {
        mkdir t
        $jnc

        # Pass the absolute path so the junction's target path matches.
        #
        $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' $~/t | \
        set ti

        $* -l l >"$ti"
      }

      : set-info
      :
      : Test that permissions and file times are set via a junction.
      :
      {
        mkdir t
        $jnc
        $* -p 400 -m '2020-03-05 00:00:00' -a '2020-03-05 00:00:01' l | set ti
        sed -n -e 's/permissions: (.+)/\1/p' <"$ti" >~/'4.{2}'/
        sed -n -e 's/mtime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:00'
        sed -n -e 's/atime: (.+)/\1/p' <"$ti" >'2020-03-05 00:00:01'
      }
    }}
  }}

  : hardlink
  :
  : If we are not cross-testing let's test hard links.
  :
  if ($test.target == $build.host)
  {
    cat <:'abc' >=f &!f
    ln f h1
    $* f >>~%EOO%
      type: regular
      size: 3
      link count: 2
      %.+
      EOO
    ln h1 h2
    $* h2 >>~%EOO%
      type: regular
      size: 3
      link count: 3
      %.+
      EOO
    rm f
    $* h1 >>~%EOO%
      type: regular
      size: 3
      link count: 2
      %.+
      EOO
  }
}}

: non-existent
:
$* f == 1
