# file      : tests/cfg-link.testscript
# license   : MIT; see accompanying LICENSE file

.include common.testscript

cfg_create += 2>!
cfg_info   += --link

uuid1 = '18f48b4b-b5d9-4712-b98c-1930df1c4228'
uuid2 = '28f48b4b-b5d9-4712-b98c-1930df1c4228'
uuid3 = '38f48b4b-b5d9-4712-b98c-1930df1c4228'

+$cfg_create -d cfg1 --name 'main'   --uuid "$uuid1" &cfg1/***
+$cfg_create -d cfg2 --name 'shared' --uuid "$uuid2" &cfg2/***

clone_cfgs = cp -r ../cfg1 ../cfg2 ./

sp = ' '

: self
:
{
  $cfg_create -d cfg1 --uuid "$uuid1" &cfg1/***

  $* -d cfg1 cfg1 2>>/"EOE" != 0
    error: linking configuration $~/cfg1/ with itself
      info: uuid: $uuid1
    EOE
}

: same-name
:
{
  $cfg_create -d cfg1 --name 'main'   &cfg1/***
  $cfg_create -d cfg2 --name 'shared' &cfg2/***

  $* -d cfg1 cfg2 --name 'main' 2>>/"EOE" != 0
    error: linking configuration $~/cfg2/ using current configuration name 'main'
      info: consider specifying alternative name with --name
    EOE
}

: basic
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>>/"EOE"
    linked with configuration $~/cfg2/
      uuid: $uuid2
      type: target
      name: shared
      id:   1
    EOE

  $cfg_info -d cfg1 >>/"EOO"
    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: main
    mode: fetch-cache=false

    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false
    EOO

  $cfg_info -d cfg2 --backlink >>/"EOO"
    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false

    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: main
    mode: fetch-cache=false
    EOO

  # While at it, test that an implicit link is unnamed.
  #
  mv cfg1 cfg1.tmp

  $cfg_info -d cfg2 --dangling >>/"EOO"
    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false

    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name:$sp
    EOO
}

: implicit-relink
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  rm -r cfg1/
  $cfg_create -d cfg1 --name 'foo' --uuid "$uuid1"

  $* -d cfg1 cfg2 2>>/"EOE"
    warning: current configuration $~/cfg1/ is already implicitly linked with $~/cfg2/
    linked with configuration $~/cfg2/
      uuid: $uuid2
      type: target
      name: shared
      id:   1
    EOE

  $cfg_info -d cfg1 >>/"EOO"
    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: foo
    mode: fetch-cache=false

    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false
    EOO
}

: turn-implicit-explicit
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  $* -d cfg2 cfg1 2>>/"EOE"
    linked with configuration $~/cfg1/
      uuid: $uuid1
      type: target
      name: main
      id:   1
    EOE

  $cfg_info -d cfg2 >>/"EOO"
    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false

    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: main
    mode: fetch-cache=false
    EOO

  $cfg_info -d cfg1 >>/"EOO"
    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: main
    mode: fetch-cache=false

    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false
    EOO

  # While at it, test that relink attempt is reported.
  #
  $* -d cfg2 cfg1 2>>/"EOE" != 0
    error: configuration with uuid $uuid1 is already linked as ../cfg1/
    EOE
}

: uuid-clash
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  $* -d cfg1 cfg2 2>>/"EOE" != 0
    error: configuration with uuid $uuid2 is already linked as ../cfg2/
    EOE
}

: path-clash
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  mv cfg2 cfg2.tmp
  $cfg_create -d cfg2 --name 'shared' --uuid "$uuid3" &cfg2/***

  $* -d cfg1 cfg2 2>>/"EOE" != 0
    error: configuration with path $~/cfg2/ is already linked
    EOE
}

: name-clash
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  $cfg_create -d cfg3 --name 'shared' --uuid "$uuid3" &cfg3/***

  $* -d cfg1 cfg3 --name 'shared' 2>>/"EOE" != 0
    error: configuration with name shared is already linked as ../cfg2/
      info: consider specifying alternative name with --name
    EOE

  $* -d cfg1 cfg3 2>>/"EOE"
    warning: configuration with name shared is already linked as ../cfg2/, linking as unnamed
    linked with configuration $~/cfg3/
      uuid: $uuid3
      type: target
      id:   2
    EOE
}

: implicit-link-path-clash
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!
  $* -d cfg2 cfg1 2>!

  mv cfg1 cfg1.tmp
  $cfg_create -d cfg1 --name 'main' --uuid "$uuid3" &cfg1/***

  $* -d cfg1 cfg2 2>>/"EOE" != 0
    error: current configuration $~/cfg1/ is already linked with $~/cfg2/
    EOE
}

: uuid-mismatch
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  mv cfg2 cfg2.tmp

  $cfg_create -d cfg2 --name 'shared' --uuid "$uuid3"

  $cfg_info -d cfg1 >- 2>>/"EOE" != 0
    error: configuration cfg2/ uuid mismatch
      info: uuid $uuid3
      info: linked with cfg1/ as $uuid2
    EOE

  rm -r cfg2
  mv cfg2.tmp cfg2

  $cfg_info -d cfg1 >>/"EOO"
    path: $~/cfg1/
    uuid: $uuid1
    type: target
    name: main
    mode: fetch-cache=false

    path: $~/cfg2/
    uuid: $uuid2
    type: target
    name: shared
    mode: fetch-cache=false
    EOO
}

: type-mismatch
:
{
  $clone_cfgs

  $* -d cfg1 cfg2 2>!

  rm -r cfg2

  $cfg_create -d cfg2 --name 'shared' --uuid "$uuid2" --type 'shared'

  $cfg_info -d cfg1 >- 2>>/"EOE" != 0
    error: configuration cfg2/ type mismatch
      info: type shared
      info: linked with cfg1/ as target
    EOE
}
