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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
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;
};
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
* \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>
#include <fcntl.h>
#include <math.h>
#include "strndup.h"
-#include "xmlconfig.h"
#include "u_process.h"
#include "os_file.h"
#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,
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"))) {
extern "C" {
#endif
+#ifdef ANDROID
+#define WITH_XMLCONFIG 0
+#else
+#define WITH_XMLCONFIG 1
+#endif
+
#define STRING_CONF_MAXLEN 1024
/** \brief Option data types */
/** \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.
*/