Mangle(parent->val);
}
}
- ConfNode *n0 = ConfNodeLookupChild(parent, value);
- if (n0 != NULL) {
- node = n0;
+ ConfNode *existing = ConfNodeLookupChild(parent, value);
+ if (existing != NULL) {
+ if (!existing->final) {
+ SCLogInfo("Configuration node '%s' redefined.",
+ existing->name);
+ ConfNodePrune(existing);
+ }
+ node = existing;
}
else {
node = ConfNodeNew();
return ret;
}
+/**
+ * Test that a configuration section is overridden but subsequent
+ * occurrences.
+ */
+static int
+ConfYamlOverrideTest(void)
+{
+ char config[] =
+ "%YAML 1.1\n"
+ "---\n"
+ "some-log-dir: /var/log\n"
+ "some-log-dir: /tmp\n"
+ "\n"
+ "parent:\n"
+ " child0:\n"
+ " key: value\n"
+ "parent:\n"
+ " child1:\n"
+ " key: value\n"
+ ;
+ char *value;
+
+ ConfCreateContextBackup();
+ ConfInit();
+
+ if (ConfYamlLoadString(config, strlen(config)) != 0)
+ return 0;
+ if (!ConfGet("some-log-dir", &value))
+ return 0;
+ if (strcmp(value, "/tmp") != 0)
+ return 0;
+
+ /* Test that parent.child0 does not exist, but child1 does. */
+ if (ConfGetNode("parent.child0") != NULL)
+ return 0;
+ if (!ConfGet("parent.child1.key", &value))
+ return 0;
+ if (strcmp(value, "value") != 0)
+ return 0;
+
+ ConfDeInit();
+ ConfRestoreContextBackup();
+
+ return 1;
+}
+
+/**
+ * Test that a configuration parameter loaded from YAML doesn't
+ * override a 'final' value that may be set on the command line.
+ */
+static int
+ConfYamlOverrideFinalTest(void)
+{
+ ConfCreateContextBackup();
+ ConfInit();
+
+ char config[] =
+ "%YAML 1.1\n"
+ "---\n"
+ "default-log-dir: /var/log\n";
+
+ /* Set the log directory as if it was set on the command line. */
+ if (!ConfSetFinal("default-log-dir", "/tmp"))
+ return 0;
+ if (ConfYamlLoadString(config, strlen(config)) != 0)
+ return 0;
+
+ char *default_log_dir;
+
+ if (!ConfGet("default-log-dir", &default_log_dir))
+ return 0;
+ if (strcmp(default_log_dir, "/tmp") != 0) {
+ fprintf(stderr, "final value was reassigned\n");
+ return 0;
+ }
+
+ ConfDeInit();
+ ConfRestoreContextBackup();
+
+ return 1;
+}
+
#endif /* UNITTESTS */
void
UtRegisterTest("ConfYamlSecondLevelSequenceTest",
ConfYamlSecondLevelSequenceTest, 1);
UtRegisterTest("ConfYamlFileIncludeTest", ConfYamlFileIncludeTest, 1);
+ UtRegisterTest("ConfYamlOverrideTest", ConfYamlOverrideTest, 1);
+ UtRegisterTest("ConfYamlOverrideFinalTest", ConfYamlOverrideFinalTest, 1);
#endif /* UNITTESTS */
}