15db71995Sopenharmony_ci/*
25db71995Sopenharmony_ci * Copyright (c) 2023 The Khronos Group Inc.
35db71995Sopenharmony_ci * Copyright (c) 2023 Valve Corporation
45db71995Sopenharmony_ci * Copyright (c) 2023 LunarG, Inc.
55db71995Sopenharmony_ci *
65db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
75db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to
85db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the
95db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
105db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are
115db71995Sopenharmony_ci * furnished to do so, subject to the following conditions:
125db71995Sopenharmony_ci *
135db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in
145db71995Sopenharmony_ci * all copies or substantial portions of the Materials.
155db71995Sopenharmony_ci *
165db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
175db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
185db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
195db71995Sopenharmony_ci *
205db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
215db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
225db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
235db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS.
245db71995Sopenharmony_ci *
255db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com>
265db71995Sopenharmony_ci */
275db71995Sopenharmony_ci
285db71995Sopenharmony_ci#include "test_environment.h"
295db71995Sopenharmony_ci
305db71995Sopenharmony_cistd::string get_settings_location_log_message([[maybe_unused]] FrameworkEnvironment const& env,
315db71995Sopenharmony_ci                                              [[maybe_unused]] bool use_secure = false) {
325db71995Sopenharmony_ci    std::string s = "Using layer configurations found in loader settings from ";
335db71995Sopenharmony_ci#if defined(WIN32)
345db71995Sopenharmony_ci    return s + env.get_folder(ManifestLocation::settings_location).location().str() + "\\vk_loader_settings.json";
355db71995Sopenharmony_ci#elif COMMON_UNIX_PLATFORMS
365db71995Sopenharmony_ci    if (use_secure)
375db71995Sopenharmony_ci        return s + "/etc/vulkan/loader_settings.d/vk_loader_settings.json";
385db71995Sopenharmony_ci    else
395db71995Sopenharmony_ci        return s + "/home/fake_home/.local/share/vulkan/loader_settings.d/vk_loader_settings.json";
405db71995Sopenharmony_ci#endif
415db71995Sopenharmony_ci}
425db71995Sopenharmony_ci
435db71995Sopenharmony_ci// Make sure settings layer is found and that a layer defined in it is loaded
445db71995Sopenharmony_ciTEST(SettingsFile, FileExist) {
455db71995Sopenharmony_ci    FrameworkEnvironment env{};
465db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
475db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer_0";
485db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
495db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
505db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
515db71995Sopenharmony_ci        "regular_test_layer.json"}
525db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
535db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
545db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
555db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
565db71995Sopenharmony_ci                .set_name(regular_layer_name)
575db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path().str())
585db71995Sopenharmony_ci                .set_control("on"))));
595db71995Sopenharmony_ci    {
605db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
615db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
625db71995Sopenharmony_ci
635db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
645db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
655db71995Sopenharmony_ci        inst.CheckCreate();
665db71995Sopenharmony_ci
675db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
685db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
695db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, regular_layer_name));
705db71995Sopenharmony_ci    }
715db71995Sopenharmony_ci}
725db71995Sopenharmony_ci
735db71995Sopenharmony_ci// Make sure that if the settings file is in a user local path, that it isn't used when running with elevated privileges
745db71995Sopenharmony_ciTEST(SettingsFile, SettingsInUnsecuredLocation) {
755db71995Sopenharmony_ci    FrameworkEnvironment env{};
765db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
775db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer_0";
785db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
795db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
805db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
815db71995Sopenharmony_ci        "regular_test_layer.json"}
825db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
835db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
845db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
855db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
865db71995Sopenharmony_ci                .set_name(regular_layer_name)
875db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path().str())
885db71995Sopenharmony_ci                .set_control("on"))));
895db71995Sopenharmony_ci    {
905db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
915db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
925db71995Sopenharmony_ci
935db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
945db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
955db71995Sopenharmony_ci        inst.CheckCreate();
965db71995Sopenharmony_ci
975db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
985db71995Sopenharmony_ci        env.debug_log.clear();
995db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
1005db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, regular_layer_name));
1015db71995Sopenharmony_ci    }
1025db71995Sopenharmony_ci    env.platform_shim->set_elevated_privilege(true);
1035db71995Sopenharmony_ci    {
1045db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
1055db71995Sopenharmony_ci
1065db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
1075db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
1085db71995Sopenharmony_ci        inst.CheckCreate();
1095db71995Sopenharmony_ci
1105db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
1115db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
1125db71995Sopenharmony_ci    }
1135db71995Sopenharmony_ci}
1145db71995Sopenharmony_ci
1155db71995Sopenharmony_ciTEST(SettingsFile, SettingsInSecuredLocation) {
1165db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_secure_loader_settings(true)};
1175db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
1185db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
1195db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer_0";
1205db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
1215db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1225db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1235db71995Sopenharmony_ci        "regular_test_layer.json"}
1245db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
1255db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
1265db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
1275db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
1285db71995Sopenharmony_ci                .set_name(regular_layer_name)
1295db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path().str())
1305db71995Sopenharmony_ci                .set_control("on"))));
1315db71995Sopenharmony_ci    {
1325db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
1335db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
1345db71995Sopenharmony_ci
1355db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
1365db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
1375db71995Sopenharmony_ci        inst.CheckCreate();
1385db71995Sopenharmony_ci
1395db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env, true)));
1405db71995Sopenharmony_ci        env.debug_log.clear();
1415db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
1425db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, regular_layer_name));
1435db71995Sopenharmony_ci    }
1445db71995Sopenharmony_ci    env.platform_shim->set_elevated_privilege(true);
1455db71995Sopenharmony_ci    {
1465db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
1475db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
1485db71995Sopenharmony_ci
1495db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
1505db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
1515db71995Sopenharmony_ci        inst.CheckCreate();
1525db71995Sopenharmony_ci
1535db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env, true)));
1545db71995Sopenharmony_ci        env.debug_log.clear();
1555db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
1565db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, regular_layer_name));
1575db71995Sopenharmony_ci    }
1585db71995Sopenharmony_ci}
1595db71995Sopenharmony_ci
1605db71995Sopenharmony_ci// Make sure settings file can have multiple sets of settings
1615db71995Sopenharmony_ciTEST(SettingsFile, SupportsMultipleSetingsSimultaneously) {
1625db71995Sopenharmony_ci    FrameworkEnvironment env{};
1635db71995Sopenharmony_ci    const char* app_specific_layer_name = "VK_LAYER_TestLayer_0";
1645db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
1655db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1665db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(app_specific_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1675db71995Sopenharmony_ci        "VK_LAYER_app_specific.json"}
1685db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
1695db71995Sopenharmony_ci    const char* global_layer_name = "VK_LAYER_TestLayer_1";
1705db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
1715db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1725db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(global_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1735db71995Sopenharmony_ci        "VK_LAYER_global.json"}
1745db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
1755db71995Sopenharmony_ci    env.update_loader_settings(
1765db71995Sopenharmony_ci        env.loader_settings
1775db71995Sopenharmony_ci            // configuration that matches the current executable path - but dont set the app-key just yet
1785db71995Sopenharmony_ci            .add_app_specific_setting(AppSpecificSettings{}
1795db71995Sopenharmony_ci                                          .add_stderr_log_filter("all")
1805db71995Sopenharmony_ci                                          .add_layer_configuration(LoaderSettingsLayerConfiguration{}
1815db71995Sopenharmony_ci                                                                       .set_name(app_specific_layer_name)
1825db71995Sopenharmony_ci                                                                       .set_path(env.get_layer_manifest_path(0).str())
1835db71995Sopenharmony_ci                                                                       .set_control("on"))
1845db71995Sopenharmony_ci                                          .add_app_key("key0"))
1855db71995Sopenharmony_ci            // configuration that should never be used
1865db71995Sopenharmony_ci            .add_app_specific_setting(
1875db71995Sopenharmony_ci                AppSpecificSettings{}
1885db71995Sopenharmony_ci                    .add_stderr_log_filter("all")
1895db71995Sopenharmony_ci                    .add_layer_configuration(
1905db71995Sopenharmony_ci                        LoaderSettingsLayerConfiguration{}.set_name("VK_LAYER_haha").set_path("/made/up/path").set_control("auto"))
1915db71995Sopenharmony_ci                    .add_layer_configuration(LoaderSettingsLayerConfiguration{}
1925db71995Sopenharmony_ci                                                 .set_name("VK_LAYER_haha2")
1935db71995Sopenharmony_ci                                                 .set_path("/made/up/path2")
1945db71995Sopenharmony_ci                                                 .set_control("auto"))
1955db71995Sopenharmony_ci                    .add_app_key("key1")
1965db71995Sopenharmony_ci                    .add_app_key("key2"))
1975db71995Sopenharmony_ci            // Add a global configuration
1985db71995Sopenharmony_ci            .add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
1995db71995Sopenharmony_ci                LoaderSettingsLayerConfiguration{}
2005db71995Sopenharmony_ci                    .set_name(global_layer_name)
2015db71995Sopenharmony_ci                    .set_path(env.get_layer_manifest_path(1).str())
2025db71995Sopenharmony_ci                    .set_control("on"))));
2035db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
2045db71995Sopenharmony_ci    {
2055db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
2065db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, global_layer_name));
2075db71995Sopenharmony_ci
2085db71995Sopenharmony_ci        // Check that the global config is used
2095db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
2105db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
2115db71995Sopenharmony_ci        inst.CheckCreate();
2125db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
2135db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2145db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, global_layer_name));
2155db71995Sopenharmony_ci    }
2165db71995Sopenharmony_ci    env.debug_log.clear();
2175db71995Sopenharmony_ci    // Set one set to contain the current executable path
2185db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).add_app_key(fs::fixup_backslashes_in_path(test_platform_executable_path()));
2195db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
2205db71995Sopenharmony_ci    {
2215db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
2225db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, app_specific_layer_name));
2235db71995Sopenharmony_ci
2245db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
2255db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
2265db71995Sopenharmony_ci        inst.CheckCreate();
2275db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
2285db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2295db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, app_specific_layer_name));
2305db71995Sopenharmony_ci    }
2315db71995Sopenharmony_ci}
2325db71995Sopenharmony_ci
2335db71995Sopenharmony_ci// Make sure layers found through the settings file are enableable by environment variables
2345db71995Sopenharmony_ciTEST(SettingsFile, LayerAutoEnabledByEnvVars) {
2355db71995Sopenharmony_ci    FrameworkEnvironment env{};
2365db71995Sopenharmony_ci    env.loader_settings.set_file_format_version({1, 0, 0});
2375db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
2385db71995Sopenharmony_ci
2395db71995Sopenharmony_ci    const char* layer_name = "VK_LAYER_automatic";
2405db71995Sopenharmony_ci    env.add_explicit_layer(
2415db71995Sopenharmony_ci        TestLayerDetails{ManifestLayer{}.add_layer(
2425db71995Sopenharmony_ci                             ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2435db71995Sopenharmony_ci                         "layer_name.json"}
2445db71995Sopenharmony_ci            .set_discovery_type(ManifestDiscoveryType::override_folder));
2455db71995Sopenharmony_ci
2465db71995Sopenharmony_ci    env.update_loader_settings(
2475db71995Sopenharmony_ci        env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2485db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
2495db71995Sopenharmony_ci                .set_name(layer_name)
2505db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path(0).str())
2515db71995Sopenharmony_ci                .set_control("auto"))));
2525db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
2535db71995Sopenharmony_ci    {
2545db71995Sopenharmony_ci        EnvVarWrapper instance_layers{"VK_INSTANCE_LAYERS", layer_name};
2555db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
2565db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, layer_name));
2575db71995Sopenharmony_ci
2585db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
2595db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
2605db71995Sopenharmony_ci        inst.CheckCreate();
2615db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
2625db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2635db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name));
2645db71995Sopenharmony_ci    }
2655db71995Sopenharmony_ci    env.debug_log.clear();
2665db71995Sopenharmony_ci
2675db71995Sopenharmony_ci    {
2685db71995Sopenharmony_ci        EnvVarWrapper loader_layers_enable{"VK_LOADER_LAYERS_ENABLE", layer_name};
2695db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
2705db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, layer_name));
2715db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
2725db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
2735db71995Sopenharmony_ci        inst.CheckCreate();
2745db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
2755db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2765db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name));
2775db71995Sopenharmony_ci    }
2785db71995Sopenharmony_ci}
2795db71995Sopenharmony_ci
2805db71995Sopenharmony_ci// Make sure layers are disallowed from loading if the settings file says so
2815db71995Sopenharmony_ciTEST(SettingsFile, LayerDisablesImplicitLayer) {
2825db71995Sopenharmony_ci    FrameworkEnvironment env{};
2835db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
2845db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_Implicit_TestLayer";
2855db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
2865db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
2875db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2885db71995Sopenharmony_ci                                                         .set_disable_environment("oof")),
2895db71995Sopenharmony_ci                           "implicit_test_layer.json");
2905db71995Sopenharmony_ci
2915db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
2925db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2935db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
2945db71995Sopenharmony_ci                .set_name(implicit_layer_name)
2955db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str())
2965db71995Sopenharmony_ci                .set_control("off")
2975db71995Sopenharmony_ci                .set_treat_as_implicit_manifest(true))));
2985db71995Sopenharmony_ci    {
2995db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
3005db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
3015db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
3025db71995Sopenharmony_ci        inst.CheckCreate();
3035db71995Sopenharmony_ci
3045db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
3055db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
3065db71995Sopenharmony_ci    }
3075db71995Sopenharmony_ci}
3085db71995Sopenharmony_ci
3095db71995Sopenharmony_ci// Implicit layers should be reordered by the settings file
3105db71995Sopenharmony_ciTEST(SettingsFile, ImplicitLayersDontInterfere) {
3115db71995Sopenharmony_ci    FrameworkEnvironment env{};
3125db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
3135db71995Sopenharmony_ci    const char* implicit_layer_name1 = "VK_LAYER_Implicit_TestLayer1";
3145db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
3155db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name1)
3165db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
3175db71995Sopenharmony_ci                                                         .set_disable_environment("oof")),
3185db71995Sopenharmony_ci                           "implicit_test_layer1.json");
3195db71995Sopenharmony_ci    const char* implicit_layer_name2 = "VK_LAYER_Implicit_TestLayer2";
3205db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
3215db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name2)
3225db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
3235db71995Sopenharmony_ci                                                         .set_disable_environment("oof")),
3245db71995Sopenharmony_ci                           "implicit_test_layer2.json");
3255db71995Sopenharmony_ci    // validate order when settings file is not present
3265db71995Sopenharmony_ci    {
3275db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(2);
3285db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name1));
3295db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name2));
3305db71995Sopenharmony_ci
3315db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
3325db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
3335db71995Sopenharmony_ci        inst.CheckCreate();
3345db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
3355db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
3365db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
3375db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, implicit_layer_name2));
3385db71995Sopenharmony_ci    }
3395db71995Sopenharmony_ci    // Now setup the settings file to contain a specific order
3405db71995Sopenharmony_ci    env.update_loader_settings(LoaderSettings{}.add_app_specific_setting(
3415db71995Sopenharmony_ci        AppSpecificSettings{}
3425db71995Sopenharmony_ci            .add_stderr_log_filter("all")
3435db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
3445db71995Sopenharmony_ci                                         .set_name(implicit_layer_name1)
3455db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
3465db71995Sopenharmony_ci                                         .set_control("auto")
3475db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))
3485db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
3495db71995Sopenharmony_ci                                         .set_name(implicit_layer_name2)
3505db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(1).str())
3515db71995Sopenharmony_ci                                         .set_control("auto")
3525db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))));
3535db71995Sopenharmony_ci    {
3545db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(2);
3555db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name1));
3565db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name2));
3575db71995Sopenharmony_ci
3585db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
3595db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
3605db71995Sopenharmony_ci        inst.CheckCreate();
3615db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
3625db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
3635db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
3645db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, implicit_layer_name2));
3655db71995Sopenharmony_ci    }
3665db71995Sopenharmony_ci
3675db71995Sopenharmony_ci    // Flip the order and store the settings in the env for later use in the test
3685db71995Sopenharmony_ci    env.loader_settings = LoaderSettings{}.add_app_specific_setting(
3695db71995Sopenharmony_ci        AppSpecificSettings{}
3705db71995Sopenharmony_ci            .add_stderr_log_filter("all")
3715db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
3725db71995Sopenharmony_ci                                         .set_name(implicit_layer_name2)
3735db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(1).str())
3745db71995Sopenharmony_ci                                         .set_control("auto")
3755db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))
3765db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
3775db71995Sopenharmony_ci                                         .set_name(implicit_layer_name1)
3785db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
3795db71995Sopenharmony_ci                                         .set_control("auto")
3805db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true)));
3815db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
3825db71995Sopenharmony_ci
3835db71995Sopenharmony_ci    {
3845db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(2);
3855db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name2));
3865db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name1));
3875db71995Sopenharmony_ci
3885db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
3895db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
3905db71995Sopenharmony_ci        inst.CheckCreate();
3915db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
3925db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
3935db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name2));
3945db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, implicit_layer_name1));
3955db71995Sopenharmony_ci    }
3965db71995Sopenharmony_ci
3975db71995Sopenharmony_ci    // Now add an explicit layer into the middle and verify that is in the correct location
3985db71995Sopenharmony_ci    const char* explicit_layer_name3 = "VK_LAYER_Explicit_TestLayer3";
3995db71995Sopenharmony_ci    env.add_explicit_layer(
4005db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
4015db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name3).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
4025db71995Sopenharmony_ci        "explicit_test_layer3.json");
4035db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.insert(
4045db71995Sopenharmony_ci        env.loader_settings.app_specific_settings.at(0).layer_configurations.begin() + 1,
4055db71995Sopenharmony_ci        LoaderSettingsLayerConfiguration{}
4065db71995Sopenharmony_ci            .set_name(explicit_layer_name3)
4075db71995Sopenharmony_ci            .set_path(env.get_shimmed_layer_manifest_path(2).str())
4085db71995Sopenharmony_ci            .set_control("on"));
4095db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
4105db71995Sopenharmony_ci    {
4115db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(3);
4125db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name2));
4135db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name3));
4145db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, implicit_layer_name1));
4155db71995Sopenharmony_ci
4165db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
4175db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
4185db71995Sopenharmony_ci        inst.CheckCreate();
4195db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
4205db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
4215db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name2));
4225db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_name3));
4235db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, implicit_layer_name1));
4245db71995Sopenharmony_ci    }
4255db71995Sopenharmony_ci}
4265db71995Sopenharmony_ci
4275db71995Sopenharmony_ci// Make sure layers that are disabled can't be enabled by the application
4285db71995Sopenharmony_ciTEST(SettingsFile, ApplicationEnablesIgnored) {
4295db71995Sopenharmony_ci    FrameworkEnvironment env{};
4305db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
4315db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_TestLayer";
4325db71995Sopenharmony_ci    env.add_explicit_layer(
4335db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
4345db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
4355db71995Sopenharmony_ci        "regular_test_layer.json");
4365db71995Sopenharmony_ci
4375db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
4385db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
4395db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
4405db71995Sopenharmony_ci                .set_name(explicit_layer_name)
4415db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str())
4425db71995Sopenharmony_ci                .set_control("off"))));
4435db71995Sopenharmony_ci    {
4445db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
4455db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
4465db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
4475db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name);
4485db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT));
4495db71995Sopenharmony_ci    }
4505db71995Sopenharmony_ci}
4515db71995Sopenharmony_ci
4525db71995Sopenharmony_ciTEST(SettingsFile, LayerListIsEmpty) {
4535db71995Sopenharmony_ci    FrameworkEnvironment env{};
4545db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
4555db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_TestLayer";
4565db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
4575db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
4585db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
4595db71995Sopenharmony_ci                                                         .set_disable_environment("HeeHee")),
4605db71995Sopenharmony_ci                           "regular_test_layer.json");
4615db71995Sopenharmony_ci
4625db71995Sopenharmony_ci    JsonWriter writer{};
4635db71995Sopenharmony_ci    writer.StartObject();
4645db71995Sopenharmony_ci    writer.AddKeyedString("file_format_version", "1.0.0");
4655db71995Sopenharmony_ci    writer.StartKeyedObject("settings");
4665db71995Sopenharmony_ci    writer.StartKeyedObject("layers");
4675db71995Sopenharmony_ci    writer.EndObject();
4685db71995Sopenharmony_ci    writer.EndObject();
4695db71995Sopenharmony_ci    writer.EndObject();
4705db71995Sopenharmony_ci    env.write_settings_file(writer.output);
4715db71995Sopenharmony_ci
4725db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
4735db71995Sopenharmony_ci
4745db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
4755db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
4765db71995Sopenharmony_ci    inst.CheckCreate();
4775db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
4785db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
4795db71995Sopenharmony_ci}
4805db71995Sopenharmony_ci
4815db71995Sopenharmony_ci// If a settings file exists but contains no valid settings - don't consider it
4825db71995Sopenharmony_ciTEST(SettingsFile, InvalidSettingsFile) {
4835db71995Sopenharmony_ci    FrameworkEnvironment env{};
4845db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
4855db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_TestLayer";
4865db71995Sopenharmony_ci    env.add_explicit_layer(
4875db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
4885db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
4895db71995Sopenharmony_ci        "regular_test_layer.json");
4905db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
4915db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
4925db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
4935db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
4945db71995Sopenharmony_ci                                                         .set_disable_environment("foobarbaz")),
4955db71995Sopenharmony_ci                           "implicit_test_layer.json");
4965db71995Sopenharmony_ci    auto check_integrity = [&env, explicit_layer_name, implicit_layer_name]() {
4975db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(2);
4985db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name));
4995db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name));
5005db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
5015db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
5025db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name);
5035db71995Sopenharmony_ci        inst.CheckCreate();
5045db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
5055db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
5065db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name));
5075db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_name));
5085db71995Sopenharmony_ci    };
5095db71995Sopenharmony_ci
5105db71995Sopenharmony_ci    {
5115db71995Sopenharmony_ci        std::fstream fuzzer_output_json_file{FUZZER_OUTPUT_JSON_FILE, std::ios_base::in};
5125db71995Sopenharmony_ci        ASSERT_TRUE(fuzzer_output_json_file.is_open());
5135db71995Sopenharmony_ci        std::stringstream fuzzer_output_json;
5145db71995Sopenharmony_ci        fuzzer_output_json << fuzzer_output_json_file.rdbuf();
5155db71995Sopenharmony_ci        env.write_settings_file(fuzzer_output_json.str());
5165db71995Sopenharmony_ci
5175db71995Sopenharmony_ci        check_integrity();
5185db71995Sopenharmony_ci    }
5195db71995Sopenharmony_ci
5205db71995Sopenharmony_ci    // No actual settings
5215db71995Sopenharmony_ci    {
5225db71995Sopenharmony_ci        JsonWriter writer{};
5235db71995Sopenharmony_ci        writer.StartObject();
5245db71995Sopenharmony_ci        writer.AddKeyedString("file_format_version", "0.0.0");
5255db71995Sopenharmony_ci        writer.EndObject();
5265db71995Sopenharmony_ci        env.write_settings_file(writer.output);
5275db71995Sopenharmony_ci
5285db71995Sopenharmony_ci        check_integrity();
5295db71995Sopenharmony_ci    }
5305db71995Sopenharmony_ci
5315db71995Sopenharmony_ci    {
5325db71995Sopenharmony_ci        JsonWriter writer{};
5335db71995Sopenharmony_ci        writer.StartObject();
5345db71995Sopenharmony_ci        writer.AddKeyedString("file_format_version", "0.0.0");
5355db71995Sopenharmony_ci        writer.StartKeyedArray("settings_array");
5365db71995Sopenharmony_ci        writer.EndArray();
5375db71995Sopenharmony_ci        writer.StartKeyedObject("settings");
5385db71995Sopenharmony_ci        writer.EndObject();
5395db71995Sopenharmony_ci        writer.EndObject();
5405db71995Sopenharmony_ci        env.write_settings_file(writer.output);
5415db71995Sopenharmony_ci
5425db71995Sopenharmony_ci        check_integrity();
5435db71995Sopenharmony_ci    }
5445db71995Sopenharmony_ci
5455db71995Sopenharmony_ci    {
5465db71995Sopenharmony_ci        JsonWriter writer{};
5475db71995Sopenharmony_ci        writer.StartObject();
5485db71995Sopenharmony_ci        for (uint32_t i = 0; i < 3; i++) {
5495db71995Sopenharmony_ci            writer.StartKeyedArray("settings_array");
5505db71995Sopenharmony_ci            writer.EndArray();
5515db71995Sopenharmony_ci            writer.StartKeyedObject("boogabooga");
5525db71995Sopenharmony_ci            writer.EndObject();
5535db71995Sopenharmony_ci            writer.StartKeyedObject("settings");
5545db71995Sopenharmony_ci            writer.EndObject();
5555db71995Sopenharmony_ci        }
5565db71995Sopenharmony_ci        writer.EndObject();
5575db71995Sopenharmony_ci        env.write_settings_file(writer.output);
5585db71995Sopenharmony_ci
5595db71995Sopenharmony_ci        check_integrity();
5605db71995Sopenharmony_ci    }
5615db71995Sopenharmony_ci}
5625db71995Sopenharmony_ci
5635db71995Sopenharmony_ci// Unknown layers are put in the correct location
5645db71995Sopenharmony_ciTEST(SettingsFile, UnknownLayersInRightPlace) {
5655db71995Sopenharmony_ci    FrameworkEnvironment env{};
5665db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
5675db71995Sopenharmony_ci    const char* explicit_layer_name1 = "VK_LAYER_TestLayer1";
5685db71995Sopenharmony_ci    env.add_explicit_layer(
5695db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
5705db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
5715db71995Sopenharmony_ci        "regular_test_layer1.json");
5725db71995Sopenharmony_ci    const char* implicit_layer_name1 = "VK_LAYER_ImplicitTestLayer1";
5735db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
5745db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name1)
5755db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
5765db71995Sopenharmony_ci                                                         .set_disable_environment("foobarbaz")),
5775db71995Sopenharmony_ci                           "implicit_test_layer1.json");
5785db71995Sopenharmony_ci    const char* explicit_layer_name2 = "VK_LAYER_TestLayer2";
5795db71995Sopenharmony_ci    env.add_explicit_layer(
5805db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
5815db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
5825db71995Sopenharmony_ci        "regular_test_layer2.json");
5835db71995Sopenharmony_ci    const char* implicit_layer_name2 = "VK_LAYER_ImplicitTestLayer2";
5845db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
5855db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name2)
5865db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
5875db71995Sopenharmony_ci                                                         .set_disable_environment("foobarbaz")),
5885db71995Sopenharmony_ci                           "implicit_test_layer2.json");
5895db71995Sopenharmony_ci
5905db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
5915db71995Sopenharmony_ci        AppSpecificSettings{}
5925db71995Sopenharmony_ci            .add_stderr_log_filter("all")
5935db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
5945db71995Sopenharmony_ci                                         .set_name(explicit_layer_name2)
5955db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(2).str())
5965db71995Sopenharmony_ci                                         .set_control("on"))
5975db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location"))
5985db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
5995db71995Sopenharmony_ci                                         .set_name(implicit_layer_name2)
6005db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(3).str())
6015db71995Sopenharmony_ci                                         .set_control("on")
6025db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))));
6035db71995Sopenharmony_ci
6045db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(4);
6055db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name2));
6065db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name1));
6075db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_name1));
6085db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(3).layerName, implicit_layer_name2));
6095db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6105db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
6115db71995Sopenharmony_ci    inst.create_info.add_layer(explicit_layer_name1);
6125db71995Sopenharmony_ci    inst.CheckCreate();
6135db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
6145db71995Sopenharmony_ci    auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
6155db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name2));
6165db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name1));
6175db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_name1));
6185db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(3).layerName, implicit_layer_name2));
6195db71995Sopenharmony_ci}
6205db71995Sopenharmony_ci
6215db71995Sopenharmony_ci// Settings file allows loading multiple layers with the same name - as long as the path is different
6225db71995Sopenharmony_ciTEST(SettingsFile, MultipleLayersWithSameName) {
6235db71995Sopenharmony_ci    FrameworkEnvironment env{};
6245db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
6255db71995Sopenharmony_ci
6265db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_TestLayer";
6275db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
6285db71995Sopenharmony_ci                                                         .set_name(explicit_layer_name)
6295db71995Sopenharmony_ci                                                         .set_description("0000")
6305db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
6315db71995Sopenharmony_ci                           "regular_test_layer1.json");
6325db71995Sopenharmony_ci
6335db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
6345db71995Sopenharmony_ci                                                         .set_name(explicit_layer_name)
6355db71995Sopenharmony_ci                                                         .set_description("1111")
6365db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
6375db71995Sopenharmony_ci                           "regular_test_layer2.json");
6385db71995Sopenharmony_ci
6395db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
6405db71995Sopenharmony_ci        AppSpecificSettings{}
6415db71995Sopenharmony_ci            .add_stderr_log_filter("all")
6425db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
6435db71995Sopenharmony_ci                                         .set_name(explicit_layer_name)
6445db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
6455db71995Sopenharmony_ci                                         .set_control("on"))
6465db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
6475db71995Sopenharmony_ci                                         .set_name(explicit_layer_name)
6485db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(1).str())
6495db71995Sopenharmony_ci                                         .set_control("on"))));
6505db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(2);
6515db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name));
6525db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).description, "0000"));
6535db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name));
6545db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(1).description, "1111"));
6555db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6565db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
6575db71995Sopenharmony_ci    inst.CheckCreate();
6585db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
6595db71995Sopenharmony_ci    auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
6605db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name));
6615db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(0).description, "0000"));
6625db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_name));
6635db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(1).description, "1111"));
6645db71995Sopenharmony_ci}
6655db71995Sopenharmony_ci
6665db71995Sopenharmony_ci// Settings file shouldn't be able to cause the same layer from the same path twice
6675db71995Sopenharmony_ciTEST(SettingsFile, MultipleLayersWithSamePath) {
6685db71995Sopenharmony_ci    FrameworkEnvironment env{};
6695db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
6705db71995Sopenharmony_ci
6715db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_TestLayer";
6725db71995Sopenharmony_ci    env.add_explicit_layer(
6735db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
6745db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
6755db71995Sopenharmony_ci        "regular_test_layer1.json");
6765db71995Sopenharmony_ci
6775db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
6785db71995Sopenharmony_ci        AppSpecificSettings{}
6795db71995Sopenharmony_ci            .add_stderr_log_filter("all")
6805db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
6815db71995Sopenharmony_ci                                         .set_name(explicit_layer_name)
6825db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
6835db71995Sopenharmony_ci                                         .set_control("on"))
6845db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
6855db71995Sopenharmony_ci                                         .set_name(explicit_layer_name)
6865db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
6875db71995Sopenharmony_ci                                         .set_control("on"))));
6885db71995Sopenharmony_ci
6895db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
6905db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name));
6915db71995Sopenharmony_ci
6925db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6935db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
6945db71995Sopenharmony_ci    inst.CheckCreate();
6955db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
6965db71995Sopenharmony_ci    auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
6975db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name));
6985db71995Sopenharmony_ci}
6995db71995Sopenharmony_ci
7005db71995Sopenharmony_ci// Settings contains a layer whose name doesn't match the one found in the layer manifest - make sure the layer from the settings
7015db71995Sopenharmony_ci// file is removed
7025db71995Sopenharmony_ciTEST(SettingsFile, MismatchedLayerNameAndManifestPath) {
7035db71995Sopenharmony_ci    FrameworkEnvironment env{};
7045db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
7055db71995Sopenharmony_ci
7065db71995Sopenharmony_ci    const char* manifest_explicit_layer_name = "VK_LAYER_MANIFEST_TestLayer";
7075db71995Sopenharmony_ci    const char* settings_explicit_layer_name = "VK_LAYER_Settings_TestLayer";
7085db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7095db71995Sopenharmony_ci                                                         .set_name(manifest_explicit_layer_name)
7105db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
7115db71995Sopenharmony_ci                           "regular_test_layer1.json");
7125db71995Sopenharmony_ci
7135db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_Implicit_TestLayer";
7145db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7155db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
7165db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
7175db71995Sopenharmony_ci                                                         .set_disable_environment("oof")),
7185db71995Sopenharmony_ci                           "implicit_test_layer.json");
7195db71995Sopenharmony_ci
7205db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
7215db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
7225db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
7235db71995Sopenharmony_ci                .set_name(settings_explicit_layer_name)
7245db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str())
7255db71995Sopenharmony_ci                .set_control("on"))));
7265db71995Sopenharmony_ci
7275db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
7285db71995Sopenharmony_ci
7295db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
7305db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
7315db71995Sopenharmony_ci    inst.CheckCreate();
7325db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
7335db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
7345db71995Sopenharmony_ci}
7355db71995Sopenharmony_ci
7365db71995Sopenharmony_ci// Settings file should take precedence over the meta layer, if present
7375db71995Sopenharmony_ciTEST(SettingsFile, MetaLayerAlsoActivates) {
7385db71995Sopenharmony_ci    FrameworkEnvironment env{};
7395db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
7405db71995Sopenharmony_ci
7415db71995Sopenharmony_ci    const char* settings_explicit_layer_name = "VK_LAYER_Regular_TestLayer";
7425db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7435db71995Sopenharmony_ci                                                         .set_name(settings_explicit_layer_name)
7445db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
7455db71995Sopenharmony_ci                           "explicit_test_layer.json");
7465db71995Sopenharmony_ci
7475db71995Sopenharmony_ci    const char* settings_implicit_layer_name = "VK_LAYER_RegularImplicit_TestLayer";
7485db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7495db71995Sopenharmony_ci                                                         .set_name(settings_implicit_layer_name)
7505db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
7515db71995Sopenharmony_ci                                                         .set_disable_environment("AndISaidHey")
7525db71995Sopenharmony_ci                                                         .set_enable_environment("WhatsGoingOn")),
7535db71995Sopenharmony_ci                           "implicit_layer.json");
7545db71995Sopenharmony_ci
7555db71995Sopenharmony_ci    const char* component_explicit_layer_name1 = "VK_LAYER_Component_TestLayer1";
7565db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7575db71995Sopenharmony_ci                                                                          .set_name(component_explicit_layer_name1)
7585db71995Sopenharmony_ci                                                                          .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
7595db71995Sopenharmony_ci                                            "component_test_layer1.json"));
7605db71995Sopenharmony_ci
7615db71995Sopenharmony_ci    const char* component_explicit_layer_name2 = "VK_LAYER_Component_TestLayer2";
7625db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
7635db71995Sopenharmony_ci                                                                          .set_name(component_explicit_layer_name2)
7645db71995Sopenharmony_ci                                                                          .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
7655db71995Sopenharmony_ci                                            "component_test_layer2.json"));
7665db71995Sopenharmony_ci
7675db71995Sopenharmony_ci    const char* meta_layer_name1 = "VK_LAYER_meta_layer1";
7685db71995Sopenharmony_ci    env.add_implicit_layer(
7695db71995Sopenharmony_ci        ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{}
7705db71995Sopenharmony_ci                                                                         .set_name(meta_layer_name1)
7715db71995Sopenharmony_ci                                                                         .add_component_layer(component_explicit_layer_name2)
7725db71995Sopenharmony_ci                                                                         .add_component_layer(component_explicit_layer_name1)
7735db71995Sopenharmony_ci                                                                         .set_disable_environment("NotGonnaWork")),
7745db71995Sopenharmony_ci        "meta_test_layer.json");
7755db71995Sopenharmony_ci
7765db71995Sopenharmony_ci    const char* meta_layer_name2 = "VK_LAYER_meta_layer2";
7775db71995Sopenharmony_ci    env.add_implicit_layer(
7785db71995Sopenharmony_ci        ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{}
7795db71995Sopenharmony_ci                                                                         .set_name(meta_layer_name2)
7805db71995Sopenharmony_ci                                                                         .add_component_layer(component_explicit_layer_name1)
7815db71995Sopenharmony_ci                                                                         .set_disable_environment("ILikeTrains")
7825db71995Sopenharmony_ci                                                                         .set_enable_environment("BakedBeans")),
7835db71995Sopenharmony_ci        "not_automatic_meta_test_layer.json");
7845db71995Sopenharmony_ci
7855db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
7865db71995Sopenharmony_ci        AppSpecificSettings{}
7875db71995Sopenharmony_ci            .add_stderr_log_filter("all")
7885db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
7895db71995Sopenharmony_ci                                         .set_name(settings_explicit_layer_name)
7905db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
7915db71995Sopenharmony_ci                                         .set_control("on")
7925db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(false))
7935db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location"))
7945db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
7955db71995Sopenharmony_ci                                         .set_name(settings_implicit_layer_name)
7965db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(1).str())
7975db71995Sopenharmony_ci                                         .set_control("auto")
7985db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))));
7995db71995Sopenharmony_ci    {
8005db71995Sopenharmony_ci        EnvVarWrapper enable_meta_layer{"WhatsGoingOn", "1"};
8015db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(6);
8025db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, settings_explicit_layer_name));
8035db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, meta_layer_name1));
8045db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, meta_layer_name2));
8055db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(3).layerName, component_explicit_layer_name1));
8065db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(4).layerName, component_explicit_layer_name2));
8075db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(5).layerName, settings_implicit_layer_name));
8085db71995Sopenharmony_ci
8095db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
8105db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
8115db71995Sopenharmony_ci        inst.CheckCreate();
8125db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
8135db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 5);
8145db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, settings_explicit_layer_name));
8155db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, component_explicit_layer_name2));
8165db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, component_explicit_layer_name1));
8175db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(3).layerName, meta_layer_name1));
8185db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(4).layerName, settings_implicit_layer_name));
8195db71995Sopenharmony_ci    }
8205db71995Sopenharmony_ci    {
8215db71995Sopenharmony_ci        EnvVarWrapper enable_meta_layer{"BakedBeans", "1"};
8225db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(6);
8235db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, settings_explicit_layer_name));
8245db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, meta_layer_name1));
8255db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, meta_layer_name2));
8265db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(3).layerName, component_explicit_layer_name1));
8275db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(4).layerName, component_explicit_layer_name2));
8285db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(5).layerName, settings_implicit_layer_name));
8295db71995Sopenharmony_ci
8305db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
8315db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
8325db71995Sopenharmony_ci        inst.CheckCreate();
8335db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
8345db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 5);
8355db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, settings_explicit_layer_name));
8365db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, component_explicit_layer_name2));
8375db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, component_explicit_layer_name1));
8385db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(3).layerName, meta_layer_name1));
8395db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(4).layerName, meta_layer_name2));
8405db71995Sopenharmony_ci    }
8415db71995Sopenharmony_ci}
8425db71995Sopenharmony_ci
8435db71995Sopenharmony_ci// Layers are correctly ordered by settings file.
8445db71995Sopenharmony_ciTEST(SettingsFile, LayerOrdering) {
8455db71995Sopenharmony_ci    FrameworkEnvironment env{};
8465db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
8475db71995Sopenharmony_ci
8485db71995Sopenharmony_ci    const char* explicit_layer_name1 = "VK_LAYER_Regular_TestLayer1";
8495db71995Sopenharmony_ci    env.add_explicit_layer(
8505db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
8515db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
8525db71995Sopenharmony_ci        "explicit_test_layer1.json");
8535db71995Sopenharmony_ci
8545db71995Sopenharmony_ci    const char* explicit_layer_name2 = "VK_LAYER_Regular_TestLayer2";
8555db71995Sopenharmony_ci    env.add_explicit_layer(
8565db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
8575db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
8585db71995Sopenharmony_ci        "explicit_test_layer2.json");
8595db71995Sopenharmony_ci
8605db71995Sopenharmony_ci    const char* implicit_layer_name1 = "VK_LAYER_Implicit_TestLayer1";
8615db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
8625db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name1)
8635db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
8645db71995Sopenharmony_ci                                                         .set_disable_environment("Domierigato")),
8655db71995Sopenharmony_ci                           "implicit_layer1.json");
8665db71995Sopenharmony_ci
8675db71995Sopenharmony_ci    const char* implicit_layer_name2 = "VK_LAYER_Implicit_TestLayer2";
8685db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
8695db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name2)
8705db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
8715db71995Sopenharmony_ci                                                         .set_disable_environment("Mistehrobato")),
8725db71995Sopenharmony_ci                           "implicit_layer2.json");
8735db71995Sopenharmony_ci
8745db71995Sopenharmony_ci    env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all"));
8755db71995Sopenharmony_ci
8765db71995Sopenharmony_ci    std::vector<LoaderSettingsLayerConfiguration> layer_configs{4};
8775db71995Sopenharmony_ci    layer_configs.at(0)
8785db71995Sopenharmony_ci        .set_name(explicit_layer_name1)
8795db71995Sopenharmony_ci        .set_path(env.get_shimmed_layer_manifest_path(0).str())
8805db71995Sopenharmony_ci        .set_control("on")
8815db71995Sopenharmony_ci        .set_treat_as_implicit_manifest(false);
8825db71995Sopenharmony_ci    layer_configs.at(1)
8835db71995Sopenharmony_ci        .set_name(explicit_layer_name2)
8845db71995Sopenharmony_ci        .set_path(env.get_shimmed_layer_manifest_path(1).str())
8855db71995Sopenharmony_ci        .set_control("on")
8865db71995Sopenharmony_ci        .set_treat_as_implicit_manifest(false);
8875db71995Sopenharmony_ci    layer_configs.at(2)
8885db71995Sopenharmony_ci        .set_name(implicit_layer_name1)
8895db71995Sopenharmony_ci        .set_path(env.get_shimmed_layer_manifest_path(2).str())
8905db71995Sopenharmony_ci        .set_control("on")
8915db71995Sopenharmony_ci        .set_treat_as_implicit_manifest(true);
8925db71995Sopenharmony_ci    layer_configs.at(3)
8935db71995Sopenharmony_ci        .set_name(implicit_layer_name2)
8945db71995Sopenharmony_ci        .set_path(env.get_shimmed_layer_manifest_path(3).str())
8955db71995Sopenharmony_ci        .set_control("on")
8965db71995Sopenharmony_ci        .set_treat_as_implicit_manifest(true);
8975db71995Sopenharmony_ci
8985db71995Sopenharmony_ci    std::sort(layer_configs.begin(), layer_configs.end());
8995db71995Sopenharmony_ci    uint32_t permutation_count = 0;
9005db71995Sopenharmony_ci    do {
9015db71995Sopenharmony_ci        env.loader_settings.app_specific_settings.at(0).layer_configurations.clear();
9025db71995Sopenharmony_ci        env.loader_settings.app_specific_settings.at(0).add_layer_configurations(layer_configs);
9035db71995Sopenharmony_ci        env.update_loader_settings(env.loader_settings);
9045db71995Sopenharmony_ci
9055db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(4);
9065db71995Sopenharmony_ci        for (uint32_t i = 0; i < 4; i++) {
9075db71995Sopenharmony_ci            ASSERT_TRUE(layer_configs.at(i).name == layer_props.at(i).layerName);
9085db71995Sopenharmony_ci        }
9095db71995Sopenharmony_ci
9105db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
9115db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
9125db71995Sopenharmony_ci        inst.CheckCreate();
9135db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
9145db71995Sopenharmony_ci        auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
9155db71995Sopenharmony_ci        for (uint32_t i = 0; i < 4; i++) {
9165db71995Sopenharmony_ci            ASSERT_TRUE(layer_configs.at(i).name == active_layers.at(i).layerName);
9175db71995Sopenharmony_ci        }
9185db71995Sopenharmony_ci        env.debug_log.clear();
9195db71995Sopenharmony_ci        permutation_count++;
9205db71995Sopenharmony_ci    } while (std::next_permutation(layer_configs.begin(), layer_configs.end()));
9215db71995Sopenharmony_ci    ASSERT_EQ(permutation_count, 24U);  // should be this many orderings
9225db71995Sopenharmony_ci}
9235db71995Sopenharmony_ci
9245db71995Sopenharmony_ciTEST(SettingsFile, EnvVarsWork_VK_LAYER_PATH) {
9255db71995Sopenharmony_ci    FrameworkEnvironment env{};
9265db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
9275db71995Sopenharmony_ci
9285db71995Sopenharmony_ci    const char* explicit_layer_name1 = "VK_LAYER_Regular_TestLayer1";
9295db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
9305db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
9315db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
9325db71995Sopenharmony_ci        "explicit_test_layer1.json"}
9335db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::env_var));
9345db71995Sopenharmony_ci
9355db71995Sopenharmony_ci    const char* implicit_layer_name1 = "VK_LAYER_Implicit_TestLayer1";
9365db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
9375db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name1)
9385db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
9395db71995Sopenharmony_ci                                                         .set_disable_environment("Domierigato")),
9405db71995Sopenharmony_ci                           "implicit_layer1.json");
9415db71995Sopenharmony_ci    const char* non_env_var_layer_name2 = "VK_LAYER_Regular_TestLayer2";
9425db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
9435db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
9445db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(non_env_var_layer_name2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
9455db71995Sopenharmony_ci        "explicit_test_layer2.json"});
9465db71995Sopenharmony_ci
9475db71995Sopenharmony_ci    {
9485db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(2);
9495db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name1));
9505db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name1));
9515db71995Sopenharmony_ci
9525db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
9535db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
9545db71995Sopenharmony_ci        inst.CheckCreate();
9555db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
9565db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
9575db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
9585db71995Sopenharmony_ci    }
9595db71995Sopenharmony_ci    {
9605db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
9615db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
9625db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name1);
9635db71995Sopenharmony_ci        inst.CheckCreate();
9645db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
9655db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
9665db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
9675db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_name1));
9685db71995Sopenharmony_ci    }
9695db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.add_app_specific_setting(
9705db71995Sopenharmony_ci        AppSpecificSettings{}
9715db71995Sopenharmony_ci            .add_stderr_log_filter("all")
9725db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
9735db71995Sopenharmony_ci                                         .set_name(non_env_var_layer_name2)
9745db71995Sopenharmony_ci                                         .set_control("on")
9755db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(2).str()))
9765db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location"))));
9775db71995Sopenharmony_ci    {
9785db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(3);
9795db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, non_env_var_layer_name2));
9805db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_name1));
9815db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_name1));
9825db71995Sopenharmony_ci
9835db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
9845db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
9855db71995Sopenharmony_ci        inst.CheckCreate();
9865db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
9875db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
9885db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, non_env_var_layer_name2));
9895db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, implicit_layer_name1));
9905db71995Sopenharmony_ci    }
9915db71995Sopenharmony_ci    {
9925db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
9935db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
9945db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name1);
9955db71995Sopenharmony_ci        inst.CheckCreate();
9965db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
9975db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
9985db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, non_env_var_layer_name2));
9995db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, implicit_layer_name1));
10005db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, explicit_layer_name1));
10015db71995Sopenharmony_ci    }
10025db71995Sopenharmony_ci}
10035db71995Sopenharmony_ci
10045db71995Sopenharmony_ciTEST(SettingsFile, EnvVarsWork_VK_ADD_LAYER_PATH) {
10055db71995Sopenharmony_ci    FrameworkEnvironment env{};
10065db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
10075db71995Sopenharmony_ci
10085db71995Sopenharmony_ci    const char* implicit_layer_name1 = "VK_LAYER_Implicit_TestLayer1";
10095db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
10105db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name1)
10115db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
10125db71995Sopenharmony_ci                                                         .set_disable_environment("Domierigato")),
10135db71995Sopenharmony_ci                           "implicit_layer1.json");
10145db71995Sopenharmony_ci    const char* explicit_layer_name1 = "VK_LAYER_Regular_TestLayer1";
10155db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
10165db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
10175db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
10185db71995Sopenharmony_ci        "explicit_test_layer1.json"}
10195db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::add_env_var));
10205db71995Sopenharmony_ci    const char* non_env_var_layer_name2 = "VK_LAYER_Regular_TestLayer2";
10215db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
10225db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
10235db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(non_env_var_layer_name2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
10245db71995Sopenharmony_ci        "explicit_test_layer2.json"});
10255db71995Sopenharmony_ci
10265db71995Sopenharmony_ci    {
10275db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(3);
10285db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name1));
10295db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name1));
10305db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, non_env_var_layer_name2));
10315db71995Sopenharmony_ci
10325db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
10335db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
10345db71995Sopenharmony_ci        inst.CheckCreate();
10355db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
10365db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
10375db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
10385db71995Sopenharmony_ci    }
10395db71995Sopenharmony_ci    {
10405db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
10415db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
10425db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name1);
10435db71995Sopenharmony_ci        inst.CheckCreate();
10445db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
10455db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
10465db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name1));
10475db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_name1));
10485db71995Sopenharmony_ci    }
10495db71995Sopenharmony_ci
10505db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.add_app_specific_setting(
10515db71995Sopenharmony_ci        AppSpecificSettings{}
10525db71995Sopenharmony_ci            .add_stderr_log_filter("all")
10535db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
10545db71995Sopenharmony_ci                                         .set_name(explicit_layer_name1)
10555db71995Sopenharmony_ci                                         .set_control("on")
10565db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(1).str()))
10575db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
10585db71995Sopenharmony_ci                                         .set_name(non_env_var_layer_name2)
10595db71995Sopenharmony_ci                                         .set_control("on")
10605db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(2).str()))
10615db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
10625db71995Sopenharmony_ci                                         .set_name(implicit_layer_name1)
10635db71995Sopenharmony_ci                                         .set_control("on")
10645db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path(0).str())
10655db71995Sopenharmony_ci                                         .set_treat_as_implicit_manifest(true))));
10665db71995Sopenharmony_ci    {
10675db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(3);
10685db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name1));
10695db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(1).layerName, non_env_var_layer_name2));
10705db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(2).layerName, implicit_layer_name1));
10715db71995Sopenharmony_ci
10725db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
10735db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
10745db71995Sopenharmony_ci        inst.CheckCreate();
10755db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
10765db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
10775db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name1));
10785db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, non_env_var_layer_name2));
10795db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, implicit_layer_name1));
10805db71995Sopenharmony_ci    }
10815db71995Sopenharmony_ci    {
10825db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
10835db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
10845db71995Sopenharmony_ci        inst.create_info.add_layer(explicit_layer_name1);
10855db71995Sopenharmony_ci        inst.CheckCreate();
10865db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
10875db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
10885db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name1));
10895db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(1).layerName, non_env_var_layer_name2));
10905db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(2).layerName, implicit_layer_name1));
10915db71995Sopenharmony_ci    }
10925db71995Sopenharmony_ci}
10935db71995Sopenharmony_ci
10945db71995Sopenharmony_ciTEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS) {
10955db71995Sopenharmony_ci    FrameworkEnvironment env{};
10965db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
10975db71995Sopenharmony_ci
10985db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_Regular_TestLayer1";
10995db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
11005db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
11015db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
11025db71995Sopenharmony_ci        "explicit_test_layer1.json"});
11035db71995Sopenharmony_ci
11045db71995Sopenharmony_ci    {
11055db71995Sopenharmony_ci        EnvVarWrapper vk_instance_layers{"VK_INSTANCE_LAYERS", explicit_layer_name};
11065db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
11075db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name));
11085db71995Sopenharmony_ci
11095db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
11105db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
11115db71995Sopenharmony_ci        inst.CheckCreate();
11125db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(get_settings_location_log_message(env)));
11135db71995Sopenharmony_ci        auto layer = inst.GetActiveLayers(inst.GetPhysDev(), 1);
11145db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer.at(0).layerName, explicit_layer_name));
11155db71995Sopenharmony_ci    }
11165db71995Sopenharmony_ci    env.update_loader_settings(
11175db71995Sopenharmony_ci        env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
11185db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
11195db71995Sopenharmony_ci                .set_name(explicit_layer_name)
11205db71995Sopenharmony_ci                .set_control("off")
11215db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str()))));
11225db71995Sopenharmony_ci    {
11235db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
11245db71995Sopenharmony_ci
11255db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
11265db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
11275db71995Sopenharmony_ci        inst.CheckCreate();
11285db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
11295db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
11305db71995Sopenharmony_ci    }
11315db71995Sopenharmony_ci    {
11325db71995Sopenharmony_ci        EnvVarWrapper vk_instance_layers{"VK_INSTANCE_LAYERS", explicit_layer_name};
11335db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
11345db71995Sopenharmony_ci
11355db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
11365db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
11375db71995Sopenharmony_ci        inst.CheckCreate();
11385db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
11395db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
11405db71995Sopenharmony_ci    }
11415db71995Sopenharmony_ci}
11425db71995Sopenharmony_ci// Make sure that layers disabled by settings file aren't enabled by VK_LOADER_LAYERS_ENABLE
11435db71995Sopenharmony_ciTEST(SettingsFile, EnvVarsWork_VK_LOADER_LAYERS_ENABLE) {
11445db71995Sopenharmony_ci    FrameworkEnvironment env{};
11455db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
11465db71995Sopenharmony_ci
11475db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_Regular_TestLayer1";
11485db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
11495db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
11505db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
11515db71995Sopenharmony_ci        "explicit_test_layer1.json"});
11525db71995Sopenharmony_ci
11535db71995Sopenharmony_ci    env.update_loader_settings(
11545db71995Sopenharmony_ci        env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
11555db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
11565db71995Sopenharmony_ci                .set_name(explicit_layer_name)
11575db71995Sopenharmony_ci                .set_control("off")
11585db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str()))));
11595db71995Sopenharmony_ci
11605db71995Sopenharmony_ci    EnvVarWrapper vk_instance_layers{"VK_LOADER_LAYERS_ENABLE", explicit_layer_name};
11615db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
11625db71995Sopenharmony_ci
11635db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11645db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
11655db71995Sopenharmony_ci    inst.CheckCreate();
11665db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
11675db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
11685db71995Sopenharmony_ci}
11695db71995Sopenharmony_ci// Make sure that layers enabled by settings file aren't disabled by VK_LOADER_LAYERS_ENABLE
11705db71995Sopenharmony_ciTEST(SettingsFile, EnvVarsWork_VK_LOADER_LAYERS_DISABLE) {
11715db71995Sopenharmony_ci    FrameworkEnvironment env{};
11725db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
11735db71995Sopenharmony_ci
11745db71995Sopenharmony_ci    const char* explicit_layer_name = "VK_LAYER_Regular_TestLayer1";
11755db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
11765db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
11775db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
11785db71995Sopenharmony_ci        "explicit_test_layer1.json"});
11795db71995Sopenharmony_ci
11805db71995Sopenharmony_ci    env.update_loader_settings(
11815db71995Sopenharmony_ci        env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
11825db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
11835db71995Sopenharmony_ci                .set_name(explicit_layer_name)
11845db71995Sopenharmony_ci                .set_control("on")
11855db71995Sopenharmony_ci                .set_path(env.get_shimmed_layer_manifest_path(0).str()))));
11865db71995Sopenharmony_ci
11875db71995Sopenharmony_ci    EnvVarWrapper vk_instance_layers{"VK_LOADER_LAYERS_DISABLE", explicit_layer_name};
11885db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
11895db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_name));
11905db71995Sopenharmony_ci
11915db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11925db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
11935db71995Sopenharmony_ci    inst.CheckCreate();
11945db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
11955db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
11965db71995Sopenharmony_ci}
11975db71995Sopenharmony_ci
11985db71995Sopenharmony_ci#if defined(WIN32)
11995db71995Sopenharmony_ciTEST(SettingsFile, MultipleKeysInRegistryInUnsecureLocation) {
12005db71995Sopenharmony_ci    FrameworkEnvironment env{};
12015db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
12025db71995Sopenharmony_ci    env.platform_shim->add_unsecured_manifest(ManifestCategory::settings, "jank_path");
12035db71995Sopenharmony_ci    env.platform_shim->add_unsecured_manifest(ManifestCategory::settings, "jank_path2");
12045db71995Sopenharmony_ci
12055db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer_0";
12065db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
12075db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
12085db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
12095db71995Sopenharmony_ci        "regular_test_layer.json"}
12105db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
12115db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
12125db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
12135db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
12145db71995Sopenharmony_ci                .set_name(regular_layer_name)
12155db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path().str())
12165db71995Sopenharmony_ci                .set_control("on"))));
12175db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
12185db71995Sopenharmony_ci
12195db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
12205db71995Sopenharmony_ci    EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
12215db71995Sopenharmony_ci
12225db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12235db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
12245db71995Sopenharmony_ci    inst.CheckCreate();
12255db71995Sopenharmony_ci
12265db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
12275db71995Sopenharmony_ci    env.debug_log.clear();
12285db71995Sopenharmony_ci    auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
12295db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(0).layerName, regular_layer_name));
12305db71995Sopenharmony_ci}
12315db71995Sopenharmony_ci
12325db71995Sopenharmony_ciTEST(SettingsFile, MultipleKeysInRegistryInSecureLocation) {
12335db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_secure_loader_settings(true)};
12345db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
12355db71995Sopenharmony_ci    env.platform_shim->add_manifest(ManifestCategory::settings, "jank_path");
12365db71995Sopenharmony_ci    env.platform_shim->add_manifest(ManifestCategory::settings, "jank_path2");
12375db71995Sopenharmony_ci
12385db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer_0";
12395db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
12405db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
12415db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
12425db71995Sopenharmony_ci        "regular_test_layer.json"}
12435db71995Sopenharmony_ci                               .set_discovery_type(ManifestDiscoveryType::override_folder));
12445db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
12455db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
12465db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
12475db71995Sopenharmony_ci                .set_name(regular_layer_name)
12485db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path().str())
12495db71995Sopenharmony_ci                .set_control("on"))));
12505db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
12515db71995Sopenharmony_ci
12525db71995Sopenharmony_ci    // Make sure it works if the settings file is in the HKEY_LOCAL_MACHINE
12535db71995Sopenharmony_ci    env.platform_shim->set_elevated_privilege(true);
12545db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
12555db71995Sopenharmony_ci    {
12565db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(1);
12575db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name));
12585db71995Sopenharmony_ci
12595db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
12605db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
12615db71995Sopenharmony_ci        inst.CheckCreate();
12625db71995Sopenharmony_ci
12635db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
12645db71995Sopenharmony_ci        env.debug_log.clear();
12655db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
12665db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers.at(0).layerName, regular_layer_name));
12675db71995Sopenharmony_ci    }
12685db71995Sopenharmony_ci}
12695db71995Sopenharmony_ci#endif
12705db71995Sopenharmony_ci
12715db71995Sopenharmony_ci// Preinstance functions respect the settings file
12725db71995Sopenharmony_ciTEST(SettingsFile, PreInstanceFunctions) {
12735db71995Sopenharmony_ci    FrameworkEnvironment env;
12745db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
12755db71995Sopenharmony_ci
12765db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
12775db71995Sopenharmony_ci
12785db71995Sopenharmony_ci    env.add_implicit_layer(
12795db71995Sopenharmony_ci        ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
12805db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}
12815db71995Sopenharmony_ci                .set_name(implicit_layer_name)
12825db71995Sopenharmony_ci                .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
12835db71995Sopenharmony_ci                .set_disable_environment("DISABLE_ME")
12845db71995Sopenharmony_ci                .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
12855db71995Sopenharmony_ci                                               .set_vk_func("vkEnumerateInstanceLayerProperties")
12865db71995Sopenharmony_ci                                               .set_override_name("test_preinst_vkEnumerateInstanceLayerProperties"))
12875db71995Sopenharmony_ci                .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
12885db71995Sopenharmony_ci                                               .set_vk_func("vkEnumerateInstanceExtensionProperties")
12895db71995Sopenharmony_ci                                               .set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties"))
12905db71995Sopenharmony_ci                .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
12915db71995Sopenharmony_ci                                               .set_vk_func("vkEnumerateInstanceVersion")
12925db71995Sopenharmony_ci                                               .set_override_name("test_preinst_vkEnumerateInstanceVersion"))),
12935db71995Sopenharmony_ci        "implicit_test_layer.json");
12945db71995Sopenharmony_ci
12955db71995Sopenharmony_ci    env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
12965db71995Sopenharmony_ci        LoaderSettingsLayerConfiguration{}
12975db71995Sopenharmony_ci            .set_name(implicit_layer_name)
12985db71995Sopenharmony_ci            .set_control("on")
12995db71995Sopenharmony_ci            .set_path(env.get_shimmed_layer_manifest_path(0).str())
13005db71995Sopenharmony_ci            .set_treat_as_implicit_manifest(true)));
13015db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
13025db71995Sopenharmony_ci    {
13035db71995Sopenharmony_ci        auto& layer = env.get_test_layer(0);
13045db71995Sopenharmony_ci        // Check layer props
13055db71995Sopenharmony_ci        uint32_t layer_props = 43;
13065db71995Sopenharmony_ci        layer.set_reported_layer_props(layer_props);
13075db71995Sopenharmony_ci
13085db71995Sopenharmony_ci        uint32_t count = 0;
13095db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr));
13105db71995Sopenharmony_ci        ASSERT_EQ(count, layer_props);
13115db71995Sopenharmony_ci
13125db71995Sopenharmony_ci        // check extension props
13135db71995Sopenharmony_ci        uint32_t ext_props = 52;
13145db71995Sopenharmony_ci        layer.set_reported_extension_props(ext_props);
13155db71995Sopenharmony_ci        count = 0;
13165db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr));
13175db71995Sopenharmony_ci        ASSERT_EQ(count, ext_props);
13185db71995Sopenharmony_ci
13195db71995Sopenharmony_ci        // check version
13205db71995Sopenharmony_ci        uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4);
13215db71995Sopenharmony_ci        layer.set_reported_instance_version(layer_version);
13225db71995Sopenharmony_ci
13235db71995Sopenharmony_ci        uint32_t version = 0;
13245db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version));
13255db71995Sopenharmony_ci        ASSERT_EQ(version, layer_version);
13265db71995Sopenharmony_ci    }
13275db71995Sopenharmony_ci    // control is set to off
13285db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off");
13295db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
13305db71995Sopenharmony_ci
13315db71995Sopenharmony_ci    {
13325db71995Sopenharmony_ci        auto& layer = env.get_test_layer(0);
13335db71995Sopenharmony_ci        // Check layer props
13345db71995Sopenharmony_ci        uint32_t layer_props = 43;
13355db71995Sopenharmony_ci        layer.set_reported_layer_props(layer_props);
13365db71995Sopenharmony_ci
13375db71995Sopenharmony_ci        uint32_t count = 0;
13385db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr));
13395db71995Sopenharmony_ci        ASSERT_EQ(count, 0U);  // dont use the intercepted count
13405db71995Sopenharmony_ci
13415db71995Sopenharmony_ci        // check extension props
13425db71995Sopenharmony_ci        uint32_t ext_props = 52;
13435db71995Sopenharmony_ci        layer.set_reported_extension_props(ext_props);
13445db71995Sopenharmony_ci        count = 0;
13455db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr));
13465db71995Sopenharmony_ci        ASSERT_EQ(count, 4U);  // dont use the intercepted count - use default count
13475db71995Sopenharmony_ci
13485db71995Sopenharmony_ci        // check version
13495db71995Sopenharmony_ci        uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4);
13505db71995Sopenharmony_ci        layer.set_reported_instance_version(layer_version);
13515db71995Sopenharmony_ci
13525db71995Sopenharmony_ci        uint32_t version = 0;
13535db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version));
13545db71995Sopenharmony_ci        ASSERT_EQ(version, VK_HEADER_VERSION_COMPLETE);
13555db71995Sopenharmony_ci    }
13565db71995Sopenharmony_ci
13575db71995Sopenharmony_ci    // control is set to auto
13585db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto");
13595db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
13605db71995Sopenharmony_ci
13615db71995Sopenharmony_ci    {
13625db71995Sopenharmony_ci        auto& layer = env.get_test_layer(0);
13635db71995Sopenharmony_ci        // Check layer props
13645db71995Sopenharmony_ci        uint32_t layer_props = 43;
13655db71995Sopenharmony_ci        layer.set_reported_layer_props(layer_props);
13665db71995Sopenharmony_ci
13675db71995Sopenharmony_ci        uint32_t count = 0;
13685db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr));
13695db71995Sopenharmony_ci        ASSERT_EQ(count, layer_props);
13705db71995Sopenharmony_ci
13715db71995Sopenharmony_ci        // check extension props
13725db71995Sopenharmony_ci        uint32_t ext_props = 52;
13735db71995Sopenharmony_ci        layer.set_reported_extension_props(ext_props);
13745db71995Sopenharmony_ci        count = 0;
13755db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr));
13765db71995Sopenharmony_ci        ASSERT_EQ(count, ext_props);
13775db71995Sopenharmony_ci
13785db71995Sopenharmony_ci        // check version
13795db71995Sopenharmony_ci        uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4);
13805db71995Sopenharmony_ci        layer.set_reported_instance_version(layer_version);
13815db71995Sopenharmony_ci
13825db71995Sopenharmony_ci        uint32_t version = 0;
13835db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version));
13845db71995Sopenharmony_ci        ASSERT_EQ(version, layer_version);
13855db71995Sopenharmony_ci    }
13865db71995Sopenharmony_ci}
13875db71995Sopenharmony_ci
13885db71995Sopenharmony_ci// If an implicit layer's disable environment variable is set, but the settings file says to turn the layer on, the layer should be
13895db71995Sopenharmony_ci// activated.
13905db71995Sopenharmony_ciTEST(SettingsFile, ImplicitLayerDisableEnvironmentVariableOverriden) {
13915db71995Sopenharmony_ci    auto check_log_for_insert_instance_layer_string = [](FrameworkEnvironment& env, const char* implicit_layer_name,
13925db71995Sopenharmony_ci                                                         bool check_for_enable) {
13935db71995Sopenharmony_ci        {
13945db71995Sopenharmony_ci            InstWrapper inst{env.vulkan_functions};
13955db71995Sopenharmony_ci            FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
13965db71995Sopenharmony_ci            inst.CheckCreate(VK_SUCCESS);
13975db71995Sopenharmony_ci            if (check_for_enable) {
13985db71995Sopenharmony_ci                ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name));
13995db71995Sopenharmony_ci                auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
14005db71995Sopenharmony_ci                ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name));
14015db71995Sopenharmony_ci            } else {
14025db71995Sopenharmony_ci                ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name));
14035db71995Sopenharmony_ci                ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
14045db71995Sopenharmony_ci            }
14055db71995Sopenharmony_ci        }
14065db71995Sopenharmony_ci        env.debug_log.clear();
14075db71995Sopenharmony_ci    };
14085db71995Sopenharmony_ci
14095db71995Sopenharmony_ci    FrameworkEnvironment env;
14105db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
14115db71995Sopenharmony_ci    const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
14125db71995Sopenharmony_ci
14135db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
14145db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
14155db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
14165db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
14175db71995Sopenharmony_ci                                                         .set_enable_environment("ENABLE_ME")),
14185db71995Sopenharmony_ci                           "implicit_test_layer.json");
14195db71995Sopenharmony_ci    env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
14205db71995Sopenharmony_ci        LoaderSettingsLayerConfiguration{}
14215db71995Sopenharmony_ci            .set_name(implicit_layer_name)
14225db71995Sopenharmony_ci            .set_path(env.get_shimmed_layer_manifest_path(0).str())
14235db71995Sopenharmony_ci            .set_treat_as_implicit_manifest(true)));
14245db71995Sopenharmony_ci
14255db71995Sopenharmony_ci    // control is set to on
14265db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("on");
14275db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
14285db71995Sopenharmony_ci    {
14295db71995Sopenharmony_ci        EnvVarWrapper enable_env_var{"ENABLE_ME"};
14305db71995Sopenharmony_ci        EnvVarWrapper disable_env_var{"DISABLE_ME"};
14315db71995Sopenharmony_ci
14325db71995Sopenharmony_ci        auto layers = env.GetLayerProperties(1);
14335db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name));
14345db71995Sopenharmony_ci
14355db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14365db71995Sopenharmony_ci
14375db71995Sopenharmony_ci        enable_env_var.set_new_value("0");
14385db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14395db71995Sopenharmony_ci
14405db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
14415db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14425db71995Sopenharmony_ci
14435db71995Sopenharmony_ci        enable_env_var.remove_value();
14445db71995Sopenharmony_ci
14455db71995Sopenharmony_ci        disable_env_var.set_new_value("0");
14465db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14475db71995Sopenharmony_ci
14485db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
14495db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14505db71995Sopenharmony_ci
14515db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
14525db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
14535db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
14545db71995Sopenharmony_ci    }
14555db71995Sopenharmony_ci
14565db71995Sopenharmony_ci    // control is set to off
14575db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off");
14585db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
14595db71995Sopenharmony_ci    {
14605db71995Sopenharmony_ci        EnvVarWrapper enable_env_var{"ENABLE_ME"};
14615db71995Sopenharmony_ci        EnvVarWrapper disable_env_var{"DISABLE_ME"};
14625db71995Sopenharmony_ci
14635db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
14645db71995Sopenharmony_ci
14655db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14665db71995Sopenharmony_ci
14675db71995Sopenharmony_ci        enable_env_var.set_new_value("0");
14685db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14695db71995Sopenharmony_ci
14705db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
14715db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14725db71995Sopenharmony_ci
14735db71995Sopenharmony_ci        enable_env_var.remove_value();
14745db71995Sopenharmony_ci
14755db71995Sopenharmony_ci        disable_env_var.set_new_value("0");
14765db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14775db71995Sopenharmony_ci
14785db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
14795db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14805db71995Sopenharmony_ci
14815db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
14825db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
14835db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14845db71995Sopenharmony_ci    }
14855db71995Sopenharmony_ci
14865db71995Sopenharmony_ci    // control is set to auto
14875db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto");
14885db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
14895db71995Sopenharmony_ci    {
14905db71995Sopenharmony_ci        EnvVarWrapper enable_env_var{"ENABLE_ME"};
14915db71995Sopenharmony_ci        EnvVarWrapper disable_env_var{"DISABLE_ME"};
14925db71995Sopenharmony_ci
14935db71995Sopenharmony_ci        auto layers = env.GetLayerProperties(1);
14945db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name));
14955db71995Sopenharmony_ci
14965db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
14975db71995Sopenharmony_ci
14985db71995Sopenharmony_ci        enable_env_var.set_new_value("0");
14995db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
15005db71995Sopenharmony_ci
15015db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
15025db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, true);
15035db71995Sopenharmony_ci
15045db71995Sopenharmony_ci        enable_env_var.remove_value();
15055db71995Sopenharmony_ci
15065db71995Sopenharmony_ci        disable_env_var.set_new_value("0");
15075db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
15085db71995Sopenharmony_ci
15095db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
15105db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
15115db71995Sopenharmony_ci
15125db71995Sopenharmony_ci        enable_env_var.set_new_value("1");
15135db71995Sopenharmony_ci        disable_env_var.set_new_value("1");
15145db71995Sopenharmony_ci        check_log_for_insert_instance_layer_string(env, implicit_layer_name, false);
15155db71995Sopenharmony_ci    }
15165db71995Sopenharmony_ci}
15175db71995Sopenharmony_ci
15185db71995Sopenharmony_ci// Settings can say which filters to use - make sure those are propagated & treated correctly
15195db71995Sopenharmony_ciTEST(SettingsFile, StderrLogFilters) {
15205db71995Sopenharmony_ci    FrameworkEnvironment env{};
15215db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
15225db71995Sopenharmony_ci    const char* explicit_layer_name = "Regular_TestLayer1";
15235db71995Sopenharmony_ci    env.add_explicit_layer(TestLayerDetails{
15245db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
15255db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
15265db71995Sopenharmony_ci        "explicit_test_layer1.json"});
15275db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
15285db71995Sopenharmony_ci        AppSpecificSettings{}
15295db71995Sopenharmony_ci            .add_layer_configuration(LoaderSettingsLayerConfiguration{}
15305db71995Sopenharmony_ci                                         .set_name(explicit_layer_name)
15315db71995Sopenharmony_ci                                         .set_path(env.get_shimmed_layer_manifest_path().str())
15325db71995Sopenharmony_ci                                         .set_control("on"))
15335db71995Sopenharmony_ci            .add_layer_configuration(
15345db71995Sopenharmony_ci                LoaderSettingsLayerConfiguration{}.set_name("VK_LAYER_missing").set_path("/road/to/nowhere").set_control("on"))));
15355db71995Sopenharmony_ci
15365db71995Sopenharmony_ci    std::string expected_output_verbose;
15375db71995Sopenharmony_ci    expected_output_verbose += "Layer Configurations count = 2\n";
15385db71995Sopenharmony_ci    expected_output_verbose += "---- Layer Configuration [0] ----\n";
15395db71995Sopenharmony_ci    expected_output_verbose += std::string("Name: ") + explicit_layer_name + "\n";
15405db71995Sopenharmony_ci    expected_output_verbose += "Path: " + env.get_shimmed_layer_manifest_path().str() + "\n";
15415db71995Sopenharmony_ci    expected_output_verbose += "Control: on\n";
15425db71995Sopenharmony_ci    expected_output_verbose += "---- Layer Configuration [1] ----\n";
15435db71995Sopenharmony_ci    expected_output_verbose += "Name: VK_LAYER_missing\n";
15445db71995Sopenharmony_ci    expected_output_verbose += "Path: /road/to/nowhere\n";
15455db71995Sopenharmony_ci    expected_output_verbose += "Control: on\n";
15465db71995Sopenharmony_ci    expected_output_verbose += "---------------------------------\n";
15475db71995Sopenharmony_ci
15485db71995Sopenharmony_ci    std::string expected_output_info = get_settings_location_log_message(env) + "\n";
15495db71995Sopenharmony_ci
15505db71995Sopenharmony_ci    std::string expected_output_warning =
15515db71995Sopenharmony_ci        "Layer name Regular_TestLayer1 does not conform to naming standard (Policy #LLP_LAYER_3)\n";
15525db71995Sopenharmony_ci
15535db71995Sopenharmony_ci    std::string expected_output_error = "loader_get_json: Failed to open JSON file /road/to/nowhere\n";
15545db71995Sopenharmony_ci
15555db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).stderr_log = {"all"};
15565db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
15575db71995Sopenharmony_ci    {
15585db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
15595db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
15605db71995Sopenharmony_ci        inst.CheckCreate();
15615db71995Sopenharmony_ci
15625db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_verbose));
15635db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_info));
15645db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_warning));
15655db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_error));
15665db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
15675db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, explicit_layer_name));
15685db71995Sopenharmony_ci    }
15695db71995Sopenharmony_ci    env.debug_log.clear();
15705db71995Sopenharmony_ci    env.debug_log.create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
15715db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).stderr_log = {"info"};
15725db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
15735db71995Sopenharmony_ci    {
15745db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
15755db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
15765db71995Sopenharmony_ci        inst.CheckCreate();
15775db71995Sopenharmony_ci
15785db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_verbose));
15795db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_info));
15805db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_warning));
15815db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_error));
15825db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
15835db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, explicit_layer_name));
15845db71995Sopenharmony_ci    }
15855db71995Sopenharmony_ci    env.debug_log.clear();
15865db71995Sopenharmony_ci    env.debug_log.create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
15875db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).stderr_log = {"debug"};
15885db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
15895db71995Sopenharmony_ci    {
15905db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
15915db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
15925db71995Sopenharmony_ci        inst.CheckCreate();
15935db71995Sopenharmony_ci
15945db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_verbose));
15955db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_info));
15965db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_warning));
15975db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_error));
15985db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
15995db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, explicit_layer_name));
16005db71995Sopenharmony_ci    }
16015db71995Sopenharmony_ci    env.debug_log.clear();
16025db71995Sopenharmony_ci    env.debug_log.create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
16035db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).stderr_log = {"warn"};
16045db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
16055db71995Sopenharmony_ci    {
16065db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16075db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16085db71995Sopenharmony_ci        inst.CheckCreate();
16095db71995Sopenharmony_ci
16105db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_verbose));
16115db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_info));
16125db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_warning));
16135db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_error));
16145db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
16155db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, explicit_layer_name));
16165db71995Sopenharmony_ci    }
16175db71995Sopenharmony_ci    env.debug_log.clear();
16185db71995Sopenharmony_ci    env.debug_log.create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
16195db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).stderr_log = {"error"};
16205db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
16215db71995Sopenharmony_ci    {
16225db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16235db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16245db71995Sopenharmony_ci        inst.CheckCreate();
16255db71995Sopenharmony_ci
16265db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_verbose));
16275db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_info));
16285db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(expected_output_warning));
16295db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(expected_output_error));
16305db71995Sopenharmony_ci        auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
16315db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(active_layer_props.at(0).layerName, explicit_layer_name));
16325db71995Sopenharmony_ci    }
16335db71995Sopenharmony_ci}
16345db71995Sopenharmony_ci
16355db71995Sopenharmony_ci// Enough layers exist that arrays need to be resized - make sure that works
16365db71995Sopenharmony_ciTEST(SettingsFile, TooManyLayers) {
16375db71995Sopenharmony_ci    FrameworkEnvironment env{};
16385db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
16395db71995Sopenharmony_ci    env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
16405db71995Sopenharmony_ci        AppSpecificSettings{}.add_stderr_log_filter("all"));
16415db71995Sopenharmony_ci    std::string layer_name = "VK_LAYER_regular_layer_name_";
16425db71995Sopenharmony_ci    uint32_t layer_count = 40;
16435db71995Sopenharmony_ci    for (uint32_t i = 0; i < layer_count; i++) {
16445db71995Sopenharmony_ci        env.add_explicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
16455db71995Sopenharmony_ci                                                                              .set_name(layer_name + std::to_string(i))
16465db71995Sopenharmony_ci                                                                              .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
16475db71995Sopenharmony_ci                                                layer_name + std::to_string(i) + ".json"}
16485db71995Sopenharmony_ci                                   .set_discovery_type(ManifestDiscoveryType::override_folder));
16495db71995Sopenharmony_ci        env.loader_settings.app_specific_settings.at(0).add_layer_configuration(LoaderSettingsLayerConfiguration{}
16505db71995Sopenharmony_ci                                                                                    .set_name(layer_name + std::to_string(i))
16515db71995Sopenharmony_ci                                                                                    .set_path(env.get_layer_manifest_path(i).str())
16525db71995Sopenharmony_ci                                                                                    .set_control("on"));
16535db71995Sopenharmony_ci    }
16545db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
16555db71995Sopenharmony_ci
16565db71995Sopenharmony_ci    {
16575db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(40);
16585db71995Sopenharmony_ci        for (uint32_t i = 0; i < layer_count; i++) {
16595db71995Sopenharmony_ci            std::string expected_layer_name = layer_name + std::to_string(i);
16605db71995Sopenharmony_ci            EXPECT_TRUE(string_eq(layer_props.at(i).layerName, expected_layer_name.c_str()));
16615db71995Sopenharmony_ci        }
16625db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16635db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16645db71995Sopenharmony_ci        inst.CheckCreate();
16655db71995Sopenharmony_ci
16665db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
16675db71995Sopenharmony_ci        env.debug_log.clear();
16685db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 40);
16695db71995Sopenharmony_ci        for (uint32_t i = 0; i < layer_count; i++) {
16705db71995Sopenharmony_ci            std::string expected_layer_name = layer_name + std::to_string(i);
16715db71995Sopenharmony_ci            EXPECT_TRUE(string_eq(layers.at(i).layerName, expected_layer_name.c_str()));
16725db71995Sopenharmony_ci        }
16735db71995Sopenharmony_ci    }
16745db71995Sopenharmony_ci    env.loader_settings.app_specific_settings.at(0).layer_configurations.clear();
16755db71995Sopenharmony_ci
16765db71995Sopenharmony_ci    // Now reverse the order to make sure adding the 'last' layer first works
16775db71995Sopenharmony_ci    for (uint32_t i = 0; i < layer_count; i++) {
16785db71995Sopenharmony_ci        env.loader_settings.app_specific_settings.at(0).add_layer_configuration(
16795db71995Sopenharmony_ci            LoaderSettingsLayerConfiguration{}
16805db71995Sopenharmony_ci                .set_name(layer_name + std::to_string(layer_count - i - 1))
16815db71995Sopenharmony_ci                .set_path(env.get_layer_manifest_path(layer_count - i - 1).str())
16825db71995Sopenharmony_ci                .set_control("on"));
16835db71995Sopenharmony_ci    }
16845db71995Sopenharmony_ci    env.update_loader_settings(env.loader_settings);
16855db71995Sopenharmony_ci
16865db71995Sopenharmony_ci    {
16875db71995Sopenharmony_ci        auto layer_props = env.GetLayerProperties(40);
16885db71995Sopenharmony_ci        for (uint32_t i = 0; i < layer_count; i++) {
16895db71995Sopenharmony_ci            std::string expected_layer_name = layer_name + std::to_string(layer_count - i - 1);
16905db71995Sopenharmony_ci            EXPECT_TRUE(string_eq(layer_props.at(i).layerName, expected_layer_name.c_str()));
16915db71995Sopenharmony_ci        }
16925db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16935db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16945db71995Sopenharmony_ci        inst.CheckCreate();
16955db71995Sopenharmony_ci
16965db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env)));
16975db71995Sopenharmony_ci        env.debug_log.clear();
16985db71995Sopenharmony_ci        auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 40);
16995db71995Sopenharmony_ci        for (uint32_t i = 0; i < layer_count; i++) {
17005db71995Sopenharmony_ci            std::string expected_layer_name = layer_name + std::to_string(layer_count - i - 1);
17015db71995Sopenharmony_ci            EXPECT_TRUE(string_eq(layers.at(i).layerName, expected_layer_name.c_str()));
17025db71995Sopenharmony_ci        }
17035db71995Sopenharmony_ci    }
17045db71995Sopenharmony_ci}
1705