xmlconfig: Add unit tests for recent bugs in the driconf rewrite.

This covers:
7fb4ab9ec1 ("driconf: Restore the ability to override driconf with the environment.")
2b977adff8 ("xmlconfig: fix scandir_filter")

and touches a bit more of drirc logic while I'm here.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7048>
This commit is contained in:
Eric Anholt 2020-10-07 09:59:43 -07:00 committed by Marge Bot
parent aacf309c8d
commit 1618bd1bee
7 changed files with 244 additions and 9 deletions

View File

@ -243,6 +243,10 @@ if with_tests
cpp_args: ['-Wno-write-strings']
),
suite : ['util'],
env: ['HOME=' + join_paths(meson.current_source_dir(),
'tests', 'drirc_home'),
'DRIRC_CONFIGDIR=' + join_paths(meson.current_source_dir(),
'tests', 'drirc_configdir')]
)
endif

View File

@ -0,0 +1,51 @@
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE driconf [
<!ELEMENT driconf (device+)>
<!ELEMENT device (application | engine)+>
<!ATTLIST device driver CDATA #IMPLIED>
<!ELEMENT application (option+)>
<!ATTLIST application name CDATA #REQUIRED
executable CDATA #IMPLIED
sha1 CDATA #IMPLIED
application_name_match CDATA #IMPLIED
application_versions CDATA #IMPLIED>
<!ELEMENT engine (option+)>
<!-- engine_name_match: A regexp matching the engine name -->
<!-- engine_versions: A version in range format
(version 1 to 4 : "1:4") -->
<!ATTLIST engine engine_name_match CDATA #REQUIRED
engine_versions CDATA #REQUIRED>
<!ELEMENT option EMPTY>
<!ATTLIST option name CDATA #REQUIRED
value CDATA #REQUIRED>
]>
<driconf>
<device>
<application name="Application 1" executable="app1">
<option name="mesa_drirc_option" value="1" />
</application>
<application name="Application 2" executable="app2">
<option name="mesa_drirc_option" value="2" />
</application>
<application name="Application 2" application_name_match="Versioned App.*" application_versions="0:1">
<option name="mesa_drirc_option" value="3" />
</application>
<application name="Application 2" application_name_match="Versioned App.*" application_versions="2:3">
<option name="mesa_drirc_option" value="4" />
</application>
<engine engine_name_match="Versioned Engine.*" engine_versions="0:1">
<option name="mesa_drirc_option" value="5" />
</engine>
<engine engine_name_match="Versioned Engine.*" engine_versions="2:3">
<option name="mesa_drirc_option" value="6" />
</engine>
</device>
</driconf>

View File

@ -0,0 +1,34 @@
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE driconf [
<!ELEMENT driconf (device+)>
<!ELEMENT device (application | engine)+>
<!ATTLIST device driver CDATA #IMPLIED>
<!ELEMENT application (option+)>
<!ATTLIST application name CDATA #REQUIRED
executable CDATA #IMPLIED
sha1 CDATA #IMPLIED
application_name_match CDATA #IMPLIED
application_versions CDATA #IMPLIED>
<!ELEMENT engine (option+)>
<!-- engine_name_match: A regexp matching the engine name -->
<!-- engine_versions: A version in range format
(version 1 to 4 : "1:4") -->
<!ATTLIST engine engine_name_match CDATA #REQUIRED
engine_versions CDATA #REQUIRED>
<!ELEMENT option EMPTY>
<!ATTLIST option name CDATA #REQUIRED
value CDATA #REQUIRED>
]>
<!-- since this file lacks its extension, it shouldn't be parsed. -->
<driconf>
<device>
<application name="Application 1" executable="app1">
<option name="mesa_drirc_option" value="100" />
</application>
</device>
</driconf>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE driconf [
<!ELEMENT driconf (device+)>
<!ELEMENT device (application | engine)+>
<!ATTLIST device driver CDATA #IMPLIED>
<!ELEMENT application (option+)>
<!ATTLIST application name CDATA #REQUIRED
executable CDATA #IMPLIED
sha1 CDATA #IMPLIED
application_name_match CDATA #IMPLIED
application_versions CDATA #IMPLIED>
<!ELEMENT engine (option+)>
<!-- engine_name_match: A regexp matching the engine name -->
<!-- engine_versions: A version in range format
(version 1 to 4 : "1:4") -->
<!ATTLIST engine engine_name_match CDATA #REQUIRED
engine_versions CDATA #REQUIRED>
<!ELEMENT option EMPTY>
<!ATTLIST option name CDATA #REQUIRED
value CDATA #REQUIRED>
]>
<driconf>
<device>
<application name="Application 3" executable="app3">
<option name="mesa_drirc_option" value="10" />
</application>
</device>
</driconf>

View File

@ -30,6 +30,11 @@ protected:
xmlconfig_test();
~xmlconfig_test();
driOptionCache drirc_init(const char *driver, const char *drm,
const char *exec_name,
const char *app, int appver,
const char *engine, int enginever);
driOptionCache options;
};
@ -153,3 +158,93 @@ TEST_F(xmlconfig_test, copy_cache)
driDestroyOptionCache(&cache);
}
driOptionCache
xmlconfig_test::drirc_init(const char *driver, const char *drm,
const char *exec_name,
const char *app, int appver,
const char *engine, int enginever)
{
/* Make the parser look in the directory of config files for the test,
* passed in by meson.build.
*/
driInjectDataDir(getenv("DRIRC_CONFIGDIR"));
driInjectExecName(exec_name);
driOptionDescription driconf[] = {
DRI_CONF_SECTION_MISCELLANEOUS
DRI_CONF_OPT_I(mesa_drirc_option, 0, 0, 200, "description")
};
driParseOptionInfo(&options, driconf, ARRAY_SIZE(driconf));
driOptionCache cache;
/* This should parse the "user" drirc files under ./tests/drirc_test/,
* based on the setting of $HOME by meson.build.
*/
driParseConfigFiles(&cache, &options,
0, driver, drm,
app, appver,
engine, enginever);
return cache;
}
TEST_F(xmlconfig_test, drirc_app)
{
driOptionCache cache = drirc_init("driver", "drm",
"app1",
NULL, 0,
NULL, 0);
#if WITH_XMLCONFIG
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 1);
#else
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 0);
#endif
}
TEST_F(xmlconfig_test, drirc_user_app)
{
driOptionCache cache = drirc_init("driver", "drm",
"app3",
NULL, 0,
NULL, 0);
#if WITH_XMLCONFIG
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 10);
#else
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 0);
#endif
}
TEST_F(xmlconfig_test, drirc_env_override)
{
setenv("mesa_drirc_option", "7", 1);
driOptionCache cache = drirc_init("driver", "drm",
"app1",
NULL, 0,
NULL, 0);
/* env var takes precedence over config files */
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 7);
unsetenv("mesa_drirc_option");
}
#if WITH_XMLCONFIG
TEST_F(xmlconfig_test, drirc_app_versioned)
{
driOptionCache cache = drirc_init("driver", "drm",
NULL,
"Versioned App Name", 1,
NULL, 0);
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 3);
}
TEST_F(xmlconfig_test, drirc_engine_versioned)
{
driOptionCache cache = drirc_init("driver", "drm",
NULL,
"unknownapp", 0,
"Versioned Engine Name", 1);
EXPECT_EQ(driQueryOptioni(&cache, "mesa_drirc_option"), 5);
}
#endif

View File

@ -27,12 +27,7 @@
* \author Felix Kuehling
*/
#if defined(ANDROID) || defined(_WIN32)
#define WITH_XMLCONFIG 0
#else
#define WITH_XMLCONFIG 1
#endif
#include "xmlconfig.h"
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
@ -52,7 +47,6 @@
#include <fcntl.h>
#include <math.h>
#include "strndup.h"
#include "xmlconfig.h"
#include "u_process.h"
#include "os_file.h"
@ -1036,6 +1030,21 @@ initOptionCache(driOptionCache *cache, const driOptionCache *info)
#define DATADIR "/usr/share"
#endif
static const char *datadir = DATADIR "/drirc.d";
static const char *execname;
void
driInjectDataDir(const char *dir)
{
datadir = dir;
}
void
driInjectExecName(const char *exec)
{
execname = exec;
}
void
driParseConfigFiles(driOptionCache *cache, const driOptionCache *info,
int screenNum, const char *driverName,
@ -1057,9 +1066,9 @@ driParseConfigFiles(driOptionCache *cache, const driOptionCache *info,
userData.applicationVersion = applicationVersion;
userData.engineName = engineName ? engineName : "";
userData.engineVersion = engineVersion;
userData.execName = util_get_process_name();
userData.execName = execname ?: util_get_process_name();
parseConfigDir(&userData, DATADIR "/drirc.d");
parseConfigDir(&userData, datadir);
parseOneConfigFile(&userData, SYSCONFDIR "/drirc");
if ((home = getenv("HOME"))) {

View File

@ -39,6 +39,12 @@
extern "C" {
#endif
#ifdef ANDROID
#define WITH_XMLCONFIG 0
#else
#define WITH_XMLCONFIG 1
#endif
#define STRING_CONF_MAXLEN 1024
/** \brief Option data types */
@ -157,6 +163,10 @@ float driQueryOptionf(const driOptionCache *cache, const char *name);
/** \brief Query a string option value */
char *driQueryOptionstr(const driOptionCache *cache, const char *name);
/* Overrides for the unit tests to control drirc parsing. */
void driInjectDataDir(const char *dir);
void driInjectExecName(const char *exec);
/**
* Returns a hash of the options for this application.
*/