Commit dc33e6e4a5a5d42 introduces iptables/ebtables to adding locking
flags if/when these are available. However, the nwfilter testcases
list outputs without taking into account whether locking flags have been passed.
This shows up false testcase failures such as :
2) ebiptablesTearOldRules ...
Offset 1035
Expect [t nat -D PREROUTING -i vnet0 -j libvirt-I-vnet0
ebtables -t nat -D POSTROUTING -o vnet0 -j libvirt-O-vnet0
ebtables -t nat -L libvirt-I-vnet0
ebtables -t nat -L libvirt-O-vnet0
...snip...]
Actual [-concurrent -t nat -D PREROUTING -i vnet0 -j libvirt-I-vnet0
ebtables --concurrent -t nat -D POSTROUTING -o vnet0 -j libvirt-O-vnet0
ebtables --concurrent -t nat -L libvirt-I-vnet0
ebtables --concurrent -t nat -L libvirt-O-vnet0
...snip...]
This scrubs all reference to locking flags from test results buffer,
so that achieved output matches the expected results.
Signed-off-by: Prerna Saxena <prerna(a)linux.vnet.ibm.com>
---
tests/nwfilterebiptablestest.c | 7 +++++
tests/nwfilterxml2firewalltest.c | 3 ++
tests/testutils.c | 62 ++++++++++++++++++++++++++++++++++++++++
tests/testutils.h | 6 ++++
4 files changed, 78 insertions(+)
diff --git a/tests/nwfilterebiptablestest.c b/tests/nwfilterebiptablestest.c
index f62e046..8bf7d53 100644
--- a/tests/nwfilterebiptablestest.c
+++ b/tests/nwfilterebiptablestest.c
@@ -112,6 +112,7 @@ testNWFilterEBIPTablesAllTeardown(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -183,6 +184,7 @@ testNWFilterEBIPTablesTearOldRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -232,6 +234,7 @@ testNWFilterEBIPTablesRemoveBasicRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -266,6 +269,7 @@ testNWFilterEBIPTablesTearNewRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -338,6 +342,7 @@ testNWFilterEBIPTablesApplyBasicRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -428,6 +433,7 @@ testNWFilterEBIPTablesApplyDHCPOnlyRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
@@ -501,6 +507,7 @@ testNWFilterEBIPTablesApplyDropAllRules(const void *opaque
ATTRIBUTE_UNUSED)
goto cleanup;
actual = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actual, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actual);
if (STRNEQ_NULLABLE(expected, actual)) {
diff --git a/tests/nwfilterxml2firewalltest.c b/tests/nwfilterxml2firewalltest.c
index 01527f4..b8c895c 100644
--- a/tests/nwfilterxml2firewalltest.c
+++ b/tests/nwfilterxml2firewalltest.c
@@ -402,6 +402,9 @@ static int testCompareXMLToArgvFiles(const char *xml,
goto cleanup;
actualargv = virBufferContentAndReset(&buf);
+ virtTestClearLockingArgs(actualargv, VIR_TEST_IPTABLES);
+ virtTestClearLockingArgs(actualargv, VIR_TEST_IP6TABLES);
+ virtTestClearLockingArgs(actualargv, VIR_TEST_EBTABLES);
virtTestClearCommandPath(actualargv);
virCommandSetDryRun(NULL, NULL, NULL);
diff --git a/tests/testutils.c b/tests/testutils.c
index 9a79f98..fbb41b6 100644
--- a/tests/testutils.c
+++ b/tests/testutils.c
@@ -930,6 +930,68 @@ void virtTestClearCommandPath(char *cmdset)
cmdset[offset] = '\0';
}
+/*
+ * Scrub all reference to arguments that allow iptables to be locked.
+ * This is a newer iptables change that is unavailable with older distros.
+ * For seamless comparison of test results between 'expected'
&'actual' values,
+ * it makes sense to *not* compare :
+ * EXPECTED : /path/to/ebtables -ARG1 -ARG2 -ARG3
+ * vs
+ * ACTUAL : /path/to/iptables --LOCKFLAG -ARG1 -ARG2 -ARG3
+ */
+void virtTestClearLockingArgs(char *cmdset, virTestNwFilter filter)
+{
+ const char *iptables_str = "iptables -w";
+ const char *ip6tables_str = "ip6tables -w";
+ const char *ebtables_str = "ebtables --concurrent";
+
+ char *lineStart = cmdset;
+ char *lineEnd = strchr(cmdset, '\n');
+ char *filter_str = NULL, *next;
+ size_t filterArgLen, movelen;
+ char *movedest, *movestart;
+
+ switch (filter) {
+ case VIR_TEST_IPTABLES:
+ if (VIR_STRDUP(filter_str, iptables_str) < 0)
+ goto error;
+ break;
+ case VIR_TEST_IP6TABLES:
+ if (VIR_STRDUP(filter_str, ip6tables_str) < 0)
+ goto error;
+ break;
+ case VIR_TEST_EBTABLES:
+ if (VIR_STRDUP(filter_str, ebtables_str) < 0)
+ goto error;
+ break;
+ default:
+ goto error;
+ }
+
+ /*
+ * Replace all references of filter_str with just the base command
+ * Eg, 'iptables -w' is replaced with 'iptables'
+ */
+ next = strchr(filter_str, ' ');
+ filterArgLen = strlen(next+1);
+
+ while (lineStart) {
+ next = strstr(lineStart, filter_str);
+ if (next) {
+ movedest = strchr(next, ' ');
+ movestart = movedest + filterArgLen + 1;
+ movelen = strlen(movestart);
+ memmove(movedest, movestart, movelen + 1);
+ }
+
+ lineEnd = strchr(lineStart, '\n');
+ lineStart = lineEnd ? lineEnd + 1 : NULL;
+ }
+
+ VIR_FREE(filter_str);
+ error:
+ return;
+}
virCapsPtr virTestGenericCapsInit(void)
{
diff --git a/tests/testutils.h b/tests/testutils.h
index d78818d..6a0a00f 100644
--- a/tests/testutils.h
+++ b/tests/testutils.h
@@ -40,6 +40,11 @@
# endif
extern char *progname;
+typedef enum {
+ VIR_TEST_IPTABLES,
+ VIR_TEST_IP6TABLES,
+ VIR_TEST_EBTABLES
+} virTestNwFilter;
/* Makefile.am provides these two definitions */
# if !defined(abs_srcdir) || !defined(abs_builddir)
@@ -60,6 +65,7 @@ int virtTestClearLineRegex(const char *pattern,
char *string);
void virtTestClearCommandPath(char *cmdset);
+void virtTestClearLockingArgs(char *cmdset, virTestNwFilter filter);
int virtTestDifference(FILE *stream,
const char *expect,
--
1.9.3
--
Prerna Saxena
Linux Technology Centre,
IBM Systems and Technology Lab,
Bangalore, India