#!/bin/bash

pushd $(dirname "$0") > /dev/null

RunEnvironmentVariablePathsTest()
{
    # Check for proper handling of paths specified via environment variables.

    # Set up a layer path that includes default and user-specified locations,
    # so that the test app can find them.  Include some badly specified elements as well.
    vk_layer_path="$VK_LAYER_PATH"
    vk_layer_path+=":/usr/local/etc/vulkan/implicit_layer.d:/usr/local/share/vulkan/implicit_layer.d"
    vk_layer_path+=":/tmp/carol:::"
    vk_layer_path+=":/etc/vulkan/implicit_layer.d:/usr/share/vulkan/implicit_layer.d:$HOME/.local/share/vulkan/implicit_layer.d"
    vk_layer_path+=":::::/tandy:"

    # Set vars to include some "challenging" paths and run the test.
    output=$(VK_LOADER_DEBUG=all \
       XDG_CONFIG_DIRS=":/tmp/goober:::::/tmp/goober2/:/tmp/goober3/with spaces:::" \
       XDG_DATA_DIRS="::::/tmp/goober4:::::/tmp/goober5:/tmp/goober6/with spaces::::/tmp/goober7:" \
       VK_LAYER_PATH=${vk_layer_path} \
       GTEST_FILTER=CreateInstance.LayerPresent \
       ./vk_loader_validation_tests 2>&1)

    # Here is a path we expect to find.  The loader constructs these from the XDG* env vars. 
    right_path="/tmp/goober/vulkan/icd.d:/tmp/goober2//vulkan/icd.d:/tmp/goober3/with spaces/vulkan/icd.d"
    # There are other paths that come from SYSCONFIG settings established at build time.
    # So we can't really guess at what those are here.
    right_path+=".*"
    # Also expect to find these, since we added them.
    right_path+="/tmp/goober4/vulkan/icd.d:/tmp/goober5/vulkan/icd.d:/tmp/goober6/with spaces/vulkan/icd.d:/tmp/goober7/vulkan/icd.d"
    echo "$output" | grep -q "$right_path"
    ec=$?
    if [ $ec -eq 1 ]
    then
       echo "Environment Variable Path test FAILED - ICD path incorrect" >&2
       exit 1
    fi
    # Change the string to implicit layers.
    right_path=${right_path//icd.d/implicit_layer.d}
    echo "$output" | grep -q "$right_path"
    ec=$?
    if [ $ec -eq 1 ]
    then
       echo "Environment Variable Path test FAILED - Implicit layer path incorrect" >&2
       exit 1
    fi
    # Sadly, the loader does not clean up this path and just stumbles through it.
    # So just make sure it is the same.
    right_path="${vk_layer_path}"
    echo "$output" | grep -q "$right_path"
    ec=$?
    if [ $ec -eq 1 ]
    then
       echo "Environment Variable Path test FAILED - VK_LAYER_PATH incorrect" >&2
       exit 1
    fi
    echo "Environment Variable Path test PASSED"
}

RunCreateInstanceTest()
{
    # Check for layer insertion via CreateInstance.
    output=$(VK_LOADER_DEBUG=all \
       GTEST_FILTER=CreateInstance.LayerPresent \
       ./vk_loader_validation_tests 2>&1)

    echo "$output" | grep -q "Insert instance layer VK_LAYER_LUNARG_parameter_validation"
    ec=$?

    if [ $ec -eq 1 ]
    then
       echo "CreateInstance insertion test FAILED - parameter-validation not detected in instance layers" >&2
       exit 1
    fi
    echo "CreateInstance Insertion test PASSED"
}

RunEnumerateInstanceLayerPropertiesTest()
{
    count=$(GTEST_FILTER=EnumerateInstanceLayerProperties.Count \
        ./vk_loader_validation_tests count 2>&1 |
        grep -o 'count=[0-9]\+' | sed 's/^.*=//')

    if [ "$count" -gt 1 ]
    then
        diff \
            <(GTEST_PRINT_TIME=0 \
                GTEST_FILTER=EnumerateInstanceLayerProperties.OnePass \
                ./vk_loader_validation_tests count "$count" properties 2>&1 |
                grep 'properties') \
            <(GTEST_PRINT_TIME=0 \
                GTEST_FILTER=EnumerateInstanceLayerProperties.TwoPass \
                ./vk_loader_validation_tests properties 2>&1 |
                grep 'properties')
    fi
    ec=$?

    if [ $ec -eq 1 ]
    then
        echo "EnumerateInstanceLayerProperties OnePass vs TwoPass test FAILED - properties do not match" >&2
        exit 1
    fi
    echo "EnumerateInstanceLayerProperties OnePass vs TwoPass test PASSED"
}

RunEnumerateInstanceExtensionPropertiesTest()
{
    count=$(GTEST_FILTER=EnumerateInstanceExtensionProperties.Count \
        ./vk_loader_validation_tests count 2>&1 |
        grep -o 'count=[0-9]\+' | sed 's/^.*=//')

    if [ "$count" -gt 1 ]
    then
        diff \
            <(GTEST_PRINT_TIME=0 \
                GTEST_FILTER=EnumerateInstanceExtensionProperties.OnePass \
                ./vk_loader_validation_tests count "$count" properties 2>&1 |
                grep 'properties') \
            <(GTEST_PRINT_TIME=0 \
                GTEST_FILTER=EnumerateInstanceExtensionProperties.TwoPass \
                ./vk_loader_validation_tests properties 2>&1 |
                grep 'properties')
    fi
    ec=$?

    if [ $ec -eq 1 ]
    then
        echo "EnumerateInstanceExtensionProperties OnePass vs TwoPass test FAILED - properties do not match" >&2
        exit 1
    fi
    echo "EnumerateInstanceExtensionProperties OnePass vs TwoPass test PASSED"
}

./vk_loader_validation_tests

RunEnvironmentVariablePathsTest
RunCreateInstanceTest
RunEnumerateInstanceLayerPropertiesTest
RunEnumerateInstanceExtensionPropertiesTest

# Test the wrap objects layer.
./run_wrap_objects_tests.sh || exit 1

popd > /dev/null
