#!/usr/bin/env bash

set -eu -o pipefail

set -x

source common.sh

# Avoid store dir being inside sandbox build-dir
unset NIX_STORE_DIR
unset NIX_STATE_DIR

setupStoreDirs

initLowerStore

mountOverlayfs

### Check status

# Checking for path in lower layer
stat $(toRealPath "$storeA/nix/store" "$pathInLowerStore")

# Checking for path in upper layer (should fail)
expect 1 stat $(toRealPath "$storeBTop" "$pathInLowerStore")

# Checking for path in overlay store matching lower layer
diff $(toRealPath "$storeA/nix/store" "$pathInLowerStore") $(toRealPath "$storeBRoot/nix/store" "$pathInLowerStore")

# Checking requisites query agreement
[[ \
  $(nix-store --store $storeA --query --requisites $drvPath) \
  == \
  $(nix-store --store $storeB --query --requisites $drvPath) \
  ]]

# Checking referrers query agreement
busyboxStore=$(nix store --store $storeA add-path $busybox)
[[ \
  $(nix-store --store $storeA --query --referrers $busyboxStore) \
  == \
  $(nix-store --store $storeB --query --referrers $busyboxStore) \
  ]]

# Checking derivers query agreement
[[ \
  $(nix-store --store $storeA --query --deriver $pathInLowerStore) \
  == \
  $(nix-store --store $storeB --query --deriver $pathInLowerStore) \
  ]]

# Checking outputs query agreement
[[ \
  $(nix-store --store $storeA --query --outputs $drvPath) \
  == \
  $(nix-store --store $storeB --query --outputs $drvPath) \
  ]]

# Verifying path in lower layer
nix-store --verify-path --store "$storeA" "$pathInLowerStore"

# Verifying path in merged-store
nix-store --verify-path --store "$storeB" "$pathInLowerStore"

hashPart=$(echo $pathInLowerStore | sed "s^${NIX_STORE_DIR:-/nix/store}/^^" | sed 's/-.*//')

# Lower store can find from hash part
[[ $(nix store --store $storeA path-from-hash-part $hashPart) == $pathInLowerStore ]]

# merged store can find from hash part
[[ $(nix store --store $storeB path-from-hash-part $hashPart) == $pathInLowerStore ]]