From: "Daniel P. Berrange" <[email protected]>

This is a copy of the Red Hat driver, but with the schema files
changed to reflect the Debian style.

NB, this test won't pass without the following patch which
removes all the peerdns / slave MAC address info from the
tests/interface files
---
 tests/Makefile.am                                 |   16 ++-
 tests/debian/fsroot/etc/network/interfaces        |   27 +++
 tests/debian/fsroot/sys/class/net/br0/address     |    1 +
 tests/debian/fsroot/sys/class/net/eth4/address    |    1 +
 tests/debian/schema/bond-arp.xml                  |   20 ++
 tests/debian/schema/bond-defaults.xml             |   20 ++
 tests/debian/schema/bond.xml                      |   24 ++
 tests/debian/schema/bridge-bond.xml               |   31 +++
 tests/debian/schema/bridge-empty.xml              |   19 ++
 tests/debian/schema/bridge-no-address.xml         |   22 ++
 tests/debian/schema/bridge-vlan.xml               |   25 ++
 tests/debian/schema/bridge.xml                    |   23 ++
 tests/debian/schema/ethernet-dhcp.xml             |   17 ++
 tests/debian/schema/ethernet-static-no-prefix.xml |   22 ++
 tests/debian/schema/ethernet-static.xml           |   23 ++
 tests/debian/schema/ipv6-autoconf-dhcp.xml        |   16 ++
 tests/debian/schema/ipv6-autoconf.xml             |   16 ++
 tests/debian/schema/ipv6-dhcp.xml                 |   18 ++
 tests/debian/schema/ipv6-local.xml                |   18 ++
 tests/debian/schema/ipv6-static-multi.xml         |   24 ++
 tests/debian/schema/ipv6-static.xml               |   21 ++
 tests/debian/schema/schemas.xml                   |    4 +
 tests/debian/schema/vlan.xml                      |   18 ++
 tests/test-debian.c                               |  249 +++++++++++++++++++++
 24 files changed, 674 insertions(+), 1 deletions(-)
 create mode 100644 tests/debian/fsroot/etc/modprobe.d/netcf.conf
 create mode 100644 tests/debian/fsroot/etc/network/interfaces
 create mode 100644 tests/debian/fsroot/sys/class/net/br0/address
 create mode 100644 tests/debian/fsroot/sys/class/net/eth4/address
 create mode 100644 tests/debian/schema/bond-arp.xml
 create mode 100644 tests/debian/schema/bond-defaults.xml
 create mode 100644 tests/debian/schema/bond.xml
 create mode 100644 tests/debian/schema/bridge-bond.xml
 create mode 100644 tests/debian/schema/bridge-empty.xml
 create mode 100644 tests/debian/schema/bridge-no-address.xml
 create mode 100644 tests/debian/schema/bridge-vlan.xml
 create mode 100644 tests/debian/schema/bridge.xml
 create mode 100644 tests/debian/schema/ethernet-dhcp.xml
 create mode 100644 tests/debian/schema/ethernet-static-no-prefix.xml
 create mode 100644 tests/debian/schema/ethernet-static.xml
 create mode 100644 tests/debian/schema/ipv6-autoconf-dhcp.xml
 create mode 100644 tests/debian/schema/ipv6-autoconf.xml
 create mode 100644 tests/debian/schema/ipv6-dhcp.xml
 create mode 100644 tests/debian/schema/ipv6-local.xml
 create mode 100644 tests/debian/schema/ipv6-static-multi.xml
 create mode 100644 tests/debian/schema/ipv6-static.xml
 create mode 100644 tests/debian/schema/schemas.xml
 create mode 100644 tests/debian/schema/vlan.xml
 create mode 100644 tests/test-debian.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 247d6b1..010addc 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -21,9 +21,11 @@ check_PROGRAMS=
 
 DRIVER_SOURCES_SHARED =  cutest.c cutest.h tutil.c tutil.h
 DRIVER_SOURCES_REDHAT = test-redhat.c
+DRIVER_SOURCES_DEBIAN = test-debian.c
 EXTRA_DIST += \
        $(DRIVER_SOURCES_SHARED) \
-       $(DRIVER_SOURCES_REDHAT)
+       $(DRIVER_SOURCES_REDHAT) \
+       $(DRIVER_SOURCES_DEBIAN)
 
 if NETCF_DRIVER_REDHAT
 TESTS += test-redhat
@@ -33,6 +35,14 @@ test_redhat_SOURCES = $(DRIVER_SOURCES_REDHAT) 
$(DRIVER_SOURCES_SHARED)
 test_redhat_LDADD = $(top_builddir)/src/libnetcf.la $(GNULIB)
 endif
 
+if NETCF_DRIVER_DEBIAN
+TESTS += test-debian
+check_PROGRAMS+=test-debian
+
+test_debian_SOURCES = $(DRIVER_SOURCES_DEBIAN) $(DRIVER_SOURCES_SHARED)
+test_debian_LDADD = $(top_builddir)/src/libnetcf.la $(GNULIB)
+endif
+
 
 # Clean up files generated by test programs
 distclean-local:
@@ -40,6 +50,10 @@ if NETCF_DRIVER_REDHAT
        @chmod -R u+w $(top_builddir)/build/test_redhat || :
        @rm -rf $(top_builddir)/build/test_redhat
 endif
+if NETCF_DRIVER_DEBIAN
+       @chmod -R u+w $(top_builddir)/build/test_debian || :
+       @rm -rf $(top_builddir)/build/test_debian
+endif
 
 xmllint:
        @(for f in interface/*.xml; do                       \
diff --git a/tests/debian/fsroot/etc/modprobe.d/netcf.conf 
b/tests/debian/fsroot/etc/modprobe.d/netcf.conf
new file mode 100644
index 0000000..e69de29
diff --git a/tests/debian/fsroot/etc/network/interfaces 
b/tests/debian/fsroot/etc/network/interfaces
new file mode 100644
index 0000000..3b75bc5
--- /dev/null
+++ b/tests/debian/fsroot/etc/network/interfaces
@@ -0,0 +1,27 @@
+auto lo
+iface lo inet loopback
+iface lo inet6 loopback
+
+auto br0
+iface br0 inet dhcp
+        bridge_ports eth0
+        bridge_maxwait 0
+        hwaddress ether 00:1c:c0:89:dd:01
+
+auto bond0
+iface bond0 inet static
+        netmask 255.255.255.0
+        network 10.0.1.0
+        address 10.0.1.27
+        bond_slaves eth1 eth2
+        bond_mode active-backup
+        bond_primary eth2
+iface bond0 inet6 dhcp
+auto eth3
+iface eth3 inet dhcp
+
+auto eth4
+iface eth4 inet dhcp
+
+auto eth4
+iface eth4 inet dhcp
diff --git a/tests/debian/fsroot/sys/class/net/br0/address 
b/tests/debian/fsroot/sys/class/net/br0/address
new file mode 100644
index 0000000..ccc6a30
--- /dev/null
+++ b/tests/debian/fsroot/sys/class/net/br0/address
@@ -0,0 +1 @@
+aa:bb:cc:dd:ee:ff
diff --git a/tests/debian/fsroot/sys/class/net/eth4/address 
b/tests/debian/fsroot/sys/class/net/eth4/address
new file mode 100644
index 0000000..a445a1b
--- /dev/null
+++ b/tests/debian/fsroot/sys/class/net/eth4/address
@@ -0,0 +1 @@
+00:00:00:00:00:01
diff --git a/tests/debian/schema/bond-arp.xml b/tests/debian/schema/bond-arp.xml
new file mode 100644
index 0000000..a6cd963
--- /dev/null
+++ b/tests/debian/schema/bond-arp.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="iface">
+      <element key="bond0">
+       <node label="family" value="inet"/>
+       <node label="method" value="static"/>
+       <node label="address" value="192.168.50.7"/>
+       <node label="netmask" value="255.255.255.0"/>
+       <node label="gateway" value="192.168.50.1"/>
+        <node label="bond_slaves" value="eth1 eth0"/>
+       <node label="bond_primary" value="eth1"/>
+       <node label="bond_mode" value="active-backup"/>
+       <node label="bond_arp_interval" value="100"/>
+       <node label="bond_arp_ip_target" value="192.168.50.1"/>
+       <node label="bond_arp_validate" value="active"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bond-defaults.xml 
b/tests/debian/schema/bond-defaults.xml
new file mode 100644
index 0000000..9e5676c
--- /dev/null
+++ b/tests/debian/schema/bond-defaults.xml
@@ -0,0 +1,20 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="iface">
+      <element key="bond0">
+       <node label="family" value="inet"/>
+       <node label="method" value="static"/>
+       <node label="address" value="192.168.50.7"/>
+       <node label="netmask" value="255.255.255.0"/>
+       <node label="gateway" value="192.168.50.1"/>
+       <node label="bond_slaves" value="eth1 eth0"/>
+       <node label="bond_primary" value="eth1"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bond.xml b/tests/debian/schema/bond.xml
new file mode 100644
index 0000000..7a7f75c
--- /dev/null
+++ b/tests/debian/schema/bond.xml
@@ -0,0 +1,24 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="iface">
+      <element key="bond0">
+       <node label="family" value="inet"/>
+       <node label="method" value="static"/>
+       <node label="address" value="192.168.50.7"/>
+       <node label="netmask" value="255.255.255.0"/>
+       <node label="gateway" value="192.168.50.1"/>
+        <node label="bond_slaves" value="eth1 eth0"/>
+       <node label="bond_primary" value="eth1"/>
+       <node label="bond_mode" value="active-backup"/>
+       <node label="bond_miimon" value="100"/>
+       <node label="bond_updelay" value="10"/>
+       <node label="bond_use_carrier" value="0"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bridge-bond.xml 
b/tests/debian/schema/bridge-bond.xml
new file mode 100644
index 0000000..9915e03
--- /dev/null
+++ b/tests/debian/schema/bridge-bond.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="br0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="br0">
+       <node label="family" value="inet"/>
+       <node label="method" value="manual"/>
+       <node label="mtu" value="1500"/>
+       <node label="bridge_ports" value="eth2 bond0"/>
+       <node label="bridge_stp" value="off"/>
+       <node label="pre-up" value="ifup bond0"/>
+       <node label="post-down" value="ifdown bond0"/>
+      </element>
+      <element key="bond0">
+       <node label="family" value="inet"/>
+       <node label="method" value="manual"/>
+        <node label="bond_slaves" value="eth1 eth0"/>
+       <node label="bond_primary" value="eth1"/>
+       <node label="bond_mode" value="active-backup"/>
+       <node label="bond_miimon" value="100"/>
+       <node label="bond_updelay" value="10"/>
+       <node label="bond_use_carrier" value="0"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bridge-empty.xml 
b/tests/debian/schema/bridge-empty.xml
new file mode 100644
index 0000000..4496611
--- /dev/null
+++ b/tests/debian/schema/bridge-empty.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="br0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="br0">
+       <node label="family" value="inet"/>
+       <node label="method" value="manual"/>
+       <node label="mtu" value="1500"/>
+       <node label="bridge_ports" value="none"/>
+       <node label="bridge_stp" value="off"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bridge-no-address.xml 
b/tests/debian/schema/bridge-no-address.xml
new file mode 100644
index 0000000..5389de6
--- /dev/null
+++ b/tests/debian/schema/bridge-no-address.xml
@@ -0,0 +1,22 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="br0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="br0">
+       <node label="family" value="inet"/>
+       <node label="method" value="manual"/>
+       <node label="mtu" value="1500"/>
+       <node label="bridge_ports" value="eth0 eth1"/>
+       <node label="bridge_stp" value="off"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bridge-vlan.xml 
b/tests/debian/schema/bridge-vlan.xml
new file mode 100644
index 0000000..90b689a
--- /dev/null
+++ b/tests/debian/schema/bridge-vlan.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="br0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="br0">
+       <node label="family" value="inet"/>
+       <node label="method" value="dhcp"/>
+       <node label="bridge_ports" value="eth0.42"/>
+       <node label="bridge_stp" value="off"/>
+       <node label="pre-up" value="ifup eth0.42"/>
+       <node label="post-down" value="ifdown eth0.42"/>
+      </element>
+      <element key="eth0.42">
+       <node label="family" value="inet"/>
+       <node label="method" value="manual"/>
+       <node label="vlan_raw_device" value="eth0"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/bridge.xml b/tests/debian/schema/bridge.xml
new file mode 100644
index 0000000..1d3c0f5
--- /dev/null
+++ b/tests/debian/schema/bridge.xml
@@ -0,0 +1,23 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="br0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="br0">
+       <node label="family" value="inet"/>
+       <node label="method" value="dhcp"/>
+       <node label="mtu" value="1500"/>
+       <node label="bridge_ports" value="eth0 eth1"/>
+       <node label="bridge_stp" value="off"/>
+       <node label="bridge_fd" value="0.01"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ethernet-dhcp.xml 
b/tests/debian/schema/ethernet-dhcp.xml
new file mode 100644
index 0000000..16ba2a1
--- /dev/null
+++ b/tests/debian/schema/ethernet-dhcp.xml
@@ -0,0 +1,17 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet"/>
+       <node label="method" value="dhcp"/>
+       <node label="hwaddress" value="ether aa:bb:cc:dd:ee:ff"/>
+       <node label="mtu" value="1492"/>
+<!--XXX        <node label="PEERDNS" value="no"/>-->
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ethernet-static-no-prefix.xml 
b/tests/debian/schema/ethernet-static-no-prefix.xml
new file mode 100644
index 0000000..2f5166c
--- /dev/null
+++ b/tests/debian/schema/ethernet-static-no-prefix.xml
@@ -0,0 +1,22 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth1"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth1">
+       <node label="family" value="inet"/>
+       <node label="method" value="static"/>
+       <node label="address" value="192.168.0.5"/>
+       <node label="gateway" value="192.168.0.1"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ethernet-static.xml 
b/tests/debian/schema/ethernet-static.xml
new file mode 100644
index 0000000..6779968
--- /dev/null
+++ b/tests/debian/schema/ethernet-static.xml
@@ -0,0 +1,23 @@
+<!-- A sketch of how the ethernet-static.xml example would be
+     turned into actual files.
+
+     The XML notation is close to what would turn up in a Augeas tree -->
+
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth1"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth1">
+       <node label="family" value="inet"/>
+       <node label="method" value="static"/>
+       <node label="address" value="192.168.0.5"/>
+       <node label="netmask" value="255.255.255.0"/>
+       <node label="gateway" value="192.168.0.1"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-autoconf-dhcp.xml 
b/tests/debian/schema/ipv6-autoconf-dhcp.xml
new file mode 100644
index 0000000..cc69744
--- /dev/null
+++ b/tests/debian/schema/ipv6-autoconf-dhcp.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="dhcp"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-autoconf.xml 
b/tests/debian/schema/ipv6-autoconf.xml
new file mode 100644
index 0000000..df09a3a
--- /dev/null
+++ b/tests/debian/schema/ipv6-autoconf.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="manual"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-dhcp.xml 
b/tests/debian/schema/ipv6-dhcp.xml
new file mode 100644
index 0000000..ee326c5
--- /dev/null
+++ b/tests/debian/schema/ipv6-dhcp.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="dhcp"/>
+       <node label="pre-up" value="echo 0 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+       <node label="post-down" value="echo 1 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-local.xml 
b/tests/debian/schema/ipv6-local.xml
new file mode 100644
index 0000000..07fd75a
--- /dev/null
+++ b/tests/debian/schema/ipv6-local.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="manual"/>
+       <node label="pre-up" value="echo 0 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+       <node label="post-down" value="echo 1 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-static-multi.xml 
b/tests/debian/schema/ipv6-static-multi.xml
new file mode 100644
index 0000000..d8ff694
--- /dev/null
+++ b/tests/debian/schema/ipv6-static-multi.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="static"/>
+       <node label="address" value="3ffe:ffff:0:5::1"/>
+       <node label="netmask" value="128"/>
+       <node label="pre-up" value="echo 0 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+       <node label="post-down" value="echo 1 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+       <node label="up" value="/sbin/ifconfig eth0 inet6 add 
3ffe:ffff:0:5::3/128"/>
+       <node label="up" value="/sbin/ifconfig eth0 inet6 add 
3ffe:ffff:0:5::5/128"/>
+       <node label="down" value="/sbin/ifconfig eth0 inet6 del 
3ffe:ffff:0:5::3/128"/>
+       <node label="down" value="/sbin/ifconfig eth0 inet6 del 
3ffe:ffff:0:5::5/128"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/ipv6-static.xml 
b/tests/debian/schema/ipv6-static.xml
new file mode 100644
index 0000000..83fc0f4
--- /dev/null
+++ b/tests/debian/schema/ipv6-static.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0">
+       <node label="family" value="inet6"/>
+       <node label="method" value="static"/>
+       <node label="address" value="3ffe:ffff:0:5::1"/>
+       <node label="netmask" value="128"/>
+       <node label="gateway" value="3ffe:ffff:1234:5678::1"/>
+       <node label="pre-up" value="echo 0 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+       <node label="post-down" value="echo 1 > 
/proc/sys/net/ipv6/conf/eth0/autoconf"/>
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/debian/schema/schemas.xml b/tests/debian/schema/schemas.xml
new file mode 100644
index 0000000..a970597
--- /dev/null
+++ b/tests/debian/schema/schemas.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0";>
+  <include rules="../../data/xml/schemas.xml"/>
+</locatingRules>
diff --git a/tests/debian/schema/vlan.xml b/tests/debian/schema/vlan.xml
new file mode 100644
index 0000000..1f40404
--- /dev/null
+++ b/tests/debian/schema/vlan.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<forest>
+  <tree path="/files/etc/network/interfaces">
+    <array label="auto">
+      <element>
+       <node value="eth0.42"/>
+      </element>
+    </array>
+    <array label="iface">
+      <element key="eth0.42">
+       <node label="family" value="inet"/>
+       <node label="method" value="dhcp"/>
+       <node label="vlan_raw_device" value="eth0"/>
+<!--XXX        <node label="PEERDNS" value="no"/>-->
+      </element>
+    </array>
+  </tree>
+</forest>
diff --git a/tests/test-debian.c b/tests/test-debian.c
new file mode 100644
index 0000000..4d12830
--- /dev/null
+++ b/tests/test-debian.c
@@ -0,0 +1,249 @@
+/*
+ * test-debian.c:
+ *
+ * Copyright (C) 2009-2011 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Author: David Lutterkort <[email protected]>
+ * Author: Daniel Berrange <[email protected]>
+ */
+
+#include <config.h>
+#include "netcf.h"
+#include "internal.h"
+#include "cutest.h"
+#include "safe-alloc.h"
+#include "read-file.h"
+
+#include "tutil.h"
+
+#include <stdio.h>
+
+#include <libxml/tree.h>
+
+extern const char *abs_top_srcdir;
+extern const char *abs_top_builddir;
+extern char *driver_name;
+extern char *root, *src_root;
+extern struct netcf *ncf;
+
+static void testListInterfaces(CuTest *tc) {
+    int nint;
+    char **names;
+    static const char *const exp_names[] =
+        { "br0", "bond0", "lo", "eth3", "eth4" };
+    static const int exp_nint = ARRAY_CARDINALITY(exp_names);
+
+    nint = ncf_num_of_interfaces(ncf, NETCF_IFACE_ACTIVE|NETCF_IFACE_INACTIVE);
+    CuAssertIntEquals(tc, exp_nint, nint);
+    if (ALLOC_N(names, nint) < 0)
+        die("allocation failed");
+    nint = ncf_list_interfaces(ncf, nint, names, 
NETCF_IFACE_ACTIVE|NETCF_IFACE_INACTIVE);
+    CuAssertIntEquals(tc, exp_nint, nint);
+    for (int i=0; i < exp_nint; i++) {
+        int found = 0;
+        for (int j=0; j < nint; j++) {
+            if (STREQ(names[j], exp_names[i]))
+                found = 1;
+        }
+        CuAssert(tc, "Unknown interface name", found);
+    }
+}
+
+static void testLookupByName(CuTest *tc) {
+    struct netcf_if *nif;
+
+    nif = ncf_lookup_by_name(ncf, "br0");
+    CuAssertPtrNotNull(tc, nif);
+    CuAssertStrEquals(tc, "br0", nif->name);
+    ncf_if_free(nif);
+    CuAssertIntEquals(tc, 1, ncf->ref);
+}
+
+
+static void testLookupByMAC(CuTest *tc) {
+    static const char *const good_mac = "aa:bb:cc:dd:ee:ff";
+    static const char *const good_mac_caps = "AA:bb:cc:DD:Ee:ff";
+    struct netcf_if *nif;
+    int r;
+
+    r = ncf_lookup_by_mac_string(ncf, "00:00:00:00:00:00", 1, &nif);
+    CuAssertIntEquals(tc, 0, r);
+    CuAssertPtrEquals(tc, NULL, nif);
+
+    r = ncf_lookup_by_mac_string(ncf, good_mac, 1, &nif);
+    CuAssertIntEquals(tc, 1, r);
+    CuAssertPtrNotNull(tc, nif);
+    CuAssertStrEquals(tc, "br0", nif->name);
+    CuAssertStrEquals(tc, good_mac, ncf_if_mac_string(nif));
+    ncf_if_free(nif);
+    CuAssertIntEquals(tc, 1, ncf->ref);
+
+    r = ncf_lookup_by_mac_string(ncf, good_mac_caps, 1, &nif);
+    CuAssertIntEquals(tc, 1, r);
+    CuAssertPtrNotNull(tc, nif);
+    CuAssertStrEquals(tc, "br0", nif->name);
+    CuAssertStrEquals(tc, good_mac, ncf_if_mac_string(nif));
+    ncf_if_free(nif);
+    CuAssertIntEquals(tc, 1, ncf->ref);
+}
+
+static void testDefineUndefine(CuTest *tc) {
+    char *bridge_xml = NULL;
+    struct netcf_if *nif = NULL;
+    int r;
+
+    bridge_xml = read_test_file(tc, "interface/bridge42.xml");
+    CuAssertPtrNotNull(tc, bridge_xml);
+
+    nif = ncf_define(ncf, bridge_xml);
+    CuAssertPtrNotNull(tc, nif);
+    assert_ncf_no_error(tc);
+
+    r = ncf_if_undefine(nif);
+    CuAssertIntEquals(tc, 0, r);
+    assert_ncf_no_error(tc);
+
+    ncf_close(ncf);
+    r = ncf_init(&ncf, root);
+    CuAssertIntEquals(tc, 0, r);
+
+    nif = ncf_lookup_by_name(ncf, "br42");
+    CuAssertPtrEquals(tc, NULL, nif);
+}
+
+static void assert_transforms(CuTest *tc, const char *base) {
+    char *aug_fname = NULL, *ncf_fname = NULL;
+    char *aug_xml_exp = NULL, *ncf_xml_exp = NULL;
+    char *aug_xml_act = NULL, *ncf_xml_act = NULL;
+    int r;
+
+    r = asprintf(&aug_fname, "debian/schema/%s.xml", base);
+    r = asprintf(&ncf_fname, "interface/%s.xml", base);
+
+    aug_xml_exp = read_test_file(tc, aug_fname);
+    ncf_xml_exp = read_test_file(tc, ncf_fname);
+
+    /* Convert a NCF XML desc into an intermediate augeas XML */
+    r = ncf_get_aug(ncf, ncf_xml_exp, &aug_xml_act);
+    CuAssertIntEquals(tc, 0, r);
+
+    if (!aug_xml_act)
+        die("Intermediate XML is null");
+
+    /* Convert a intermediate augeas XML into NCF XML */
+    r = ncf_put_aug(ncf, aug_xml_exp, &ncf_xml_act);
+    CuAssertIntEquals(tc, 0, r);
+
+    // fprintf(stderr, "[%s]\n", aug_xml_exp);
+    // fprintf(stderr, "[%s]\n", ncf_xml_act);
+
+    if (!ncf_xml_act)
+        die("NCF XML is null");
+
+    assert_xml_equals(tc, ncf_fname, ncf_xml_exp, ncf_xml_act);
+    assert_xml_equals(tc, aug_fname, aug_xml_exp, aug_xml_act);
+
+    free(ncf_xml_exp);
+    free(ncf_xml_act);
+    free(aug_xml_exp);
+    free(aug_xml_act);
+}
+
+static void testTransforms(CuTest *tc) {
+    assert_transforms(tc, "bond");
+    assert_transforms(tc, "bond-arp");
+    assert_transforms(tc, "bond-defaults");
+    assert_transforms(tc, "bridge");
+
+    assert_transforms(tc, "bridge-no-address");
+    assert_transforms(tc, "bridge-vlan");
+    assert_transforms(tc, "bridge-empty");
+    assert_transforms(tc, "bridge-bond");
+    assert_transforms(tc, "ethernet-static");
+    assert_transforms(tc, "ethernet-static-no-prefix");
+    assert_transforms(tc, "ethernet-dhcp");
+    assert_transforms(tc, "vlan");
+
+    assert_transforms(tc, "ipv6-local");
+    assert_transforms(tc, "ipv6-static");
+    assert_transforms(tc, "ipv6-dhcp");
+    assert_transforms(tc, "ipv6-autoconf");
+    assert_transforms(tc, "ipv6-autoconf-dhcp");
+    assert_transforms(tc, "ipv6-static-multi");
+}
+
+static void testCorruptedSetup(CuTest *tc) {
+    int r;
+
+    ncf_close(ncf);
+    ncf = NULL;
+
+    r = ncf_init(&ncf, "/dev/null");
+    CuAssertIntEquals(tc, -1, r);
+    CuAssertPtrNotNull(tc, ncf);
+    r = ncf_error(ncf, NULL, NULL);
+    CuAssertIntEquals(tc, NETCF_EFILE, r);
+}
+
+int main(void) {
+    char *output = NULL;
+    CuSuite* suite = CuSuiteNew();
+
+    abs_top_srcdir = getenv("abs_top_srcdir");
+    if (abs_top_srcdir == NULL)
+        die("env var abs_top_srcdir must be set");
+
+    abs_top_builddir = getenv("abs_top_builddir");
+    if (abs_top_builddir == NULL)
+        die("env var abs_top_builddir must be set");
+
+    if (asprintf(&src_root, "%s/tests/debian/fsroot", abs_top_srcdir) < 0) {
+        die("failed to set src_root");
+    }
+
+    driver_name = strdup("debian");
+    if (driver_name == NULL) {
+        die("failed to set driver name");
+    }
+
+    CuSuiteSetup(suite, setup, teardown);
+
+    SUITE_ADD_TEST(suite, testListInterfaces);
+    SUITE_ADD_TEST(suite, testLookupByName);
+    SUITE_ADD_TEST(suite, testLookupByMAC);
+    SUITE_ADD_TEST(suite, testDefineUndefine);
+    SUITE_ADD_TEST(suite, testTransforms);
+    SUITE_ADD_TEST(suite, testCorruptedSetup);
+
+    CuSuiteRun(suite);
+    CuSuiteSummary(suite, &output);
+    CuSuiteDetails(suite, &output);
+    printf("%s\n", output);
+    free(output);
+    free(driver_name);
+    return suite->failCount;
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  tab-width: 4
+ * End:
+ */
+/* vim: set ts=4 sw=4 et: */
-- 
1.7.6.2

_______________________________________________
netcf-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/netcf-devel

Reply via email to