package libvirt
import (
"bytes"
"encoding/xml"
"errors"
"testing"
"github.com/davecgh/go-spew/spew"
"github.com/libvirt/libvirt-go-xml"
)
func init() {
spew.Config.Indent = "\t"
}
func TestDefaultNetworkMarshall(t *testing.T) {
b := newNetworkDef()
buf := new(bytes.Buffer)
enc := xml.NewEncoder(buf)
enc.Indent(" ", " ")
if err := enc.Encode(b); err != nil {
t.Fatalf("could not marshall this:\n%s", spew.Sdump(b))
}
}
func TestNetworkDefUnmarshall(t *testing.T) {
// some testing XML from the official docs (some unsupported attrs will be just ignored)
text := `
my-network
myhost
myhostalias
`
b, err := newDefNetworkFromXML(text)
if err != nil {
t.Errorf("could not parse: %s", err)
}
if b.Name != "my-network" {
t.Errorf("wrong network name: '%s'", b.Name)
}
if b.Domain.Name != "example.com" {
t.Errorf("wrong domain name: '%s'", b.Domain.Name)
}
if b.Forward.Mode != "nat" {
t.Errorf("wrong forward mode: '%s'", b.Forward.Mode)
}
if len(b.Forward.NAT.Addresses) == 0 {
t.Errorf("wrong number of addresses: %s", b.Forward.NAT.Addresses)
}
if b.Forward.NAT.Addresses[0].Start != "1.2.3.4" {
t.Errorf("wrong forward start address: %s", b.Forward.NAT.Addresses[0].Start)
}
if len(b.IPs) == 0 {
t.Errorf("wrong number of IPs: %d", len(b.IPs))
}
_, err2 := xmlMarshallIndented(b)
if err2 != nil {
t.Fatalf("marshalling error\n%s", spew.Sdump(b))
}
}
func TestBrokenNetworkDefUnmarshall(t *testing.T) {
// Try unmarshalling some broken xml
text := `
`
_, err := newDefNetworkFromXML(text)
if err == nil {
t.Error("Unmarshal was supposed to fail")
}
}
func TestHasDHCPNoForwardSet(t *testing.T) {
net := libvirtxml.Network{}
if HasDHCP(net) {
t.Error("Expected to not have forward enabled")
}
}
func TestHasDHCPForwardSet(t *testing.T) {
createNet := func(mode string) libvirtxml.Network {
return libvirtxml.Network{
Forward: &libvirtxml.NetworkForward{
Mode: mode,
},
}
}
for _, mode := range []string{"nat", "route", ""} {
net := createNet(mode)
if !HasDHCP(net) {
t.Errorf(
"Expected to have forward enabled with forward set to be '%s'",
mode)
}
}
}
func TestNetworkFromLibvirtError(t *testing.T) {
net := NetworkMock{
GetXMLDescError: errors.New("boom"),
}
_, err := newDefNetworkfromLibvirt(net)
if err == nil {
t.Error("Expected error")
}
}
func TestNetworkFromLibvirtWrongResponse(t *testing.T) {
net := NetworkMock{
GetXMLDescReply: "wrong xml",
}
_, err := newDefNetworkfromLibvirt(net)
if err == nil {
t.Error("Expected error")
}
}
func TestNetworkFromLibvirt(t *testing.T) {
net := NetworkMock{
GetXMLDescReply: `
default
`,
}
dn, err := newDefNetworkfromLibvirt(net)
if err != nil {
t.Errorf("Unexpected error %v", err)
}
if dn.Forward.Mode != "nat" {
t.Errorf("Wrong forward mode: %s", dn.Forward.Mode)
}
}