Skip to content

Commit 9529b68

Browse files
committed
Rework pango tests for marshalling & unmarshalling of unknown elements
1 parent 303cca5 commit 9529b68

File tree

3 files changed

+214
-31
lines changed

3 files changed

+214
-31
lines changed

assets/pango/example/main.go

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"context"
5-
"encoding/xml"
65
"fmt"
76
"log"
87

@@ -1038,21 +1037,6 @@ func checkService(c *pango.Client, ctx context.Context) {
10381037
return
10391038
}
10401039

1041-
readDescription := ""
1042-
if serviceReply.Description != nil {
1043-
readDescription = *serviceReply.Description
1044-
}
1045-
1046-
keys := make([]string, 0, len(serviceReply.Misc))
1047-
xmls := make([]string, 0, len(serviceReply.Misc))
1048-
for key := range serviceReply.Misc {
1049-
keys = append(keys, key)
1050-
data, _ := xml.Marshal(serviceReply.Misc[key])
1051-
xmls = append(xmls, string(data))
1052-
}
1053-
log.Printf("Service '%s=%s, description: %s misc XML: %s, misc keys: %s' read",
1054-
serviceReply.Name, *serviceReply.Protocol.Tcp.Port, readDescription, xmls, keys)
1055-
10561040
// SERVICE - UPDATE 3
10571041
serviceReply.Description = util.String("some text changed now")
10581042

@@ -1061,21 +1045,6 @@ func checkService(c *pango.Client, ctx context.Context) {
10611045
log.Printf("Failed to update object: %s", err)
10621046
return
10631047
}
1064-
1065-
readDescription = ""
1066-
if serviceReply.Description != nil {
1067-
readDescription = *serviceReply.Description
1068-
}
1069-
1070-
keys = make([]string, 0, len(serviceReply.Misc))
1071-
xmls = make([]string, 0, len(serviceReply.Misc))
1072-
for key := range serviceReply.Misc {
1073-
keys = append(keys, key)
1074-
data, _ := xml.Marshal(serviceReply.Misc[key])
1075-
xmls = append(xmls, string(data))
1076-
}
1077-
log.Printf("Service '%s=%s, description: %s misc XML: %s, misc keys: %s' update",
1078-
serviceReply.Name, *serviceReply.Protocol.Tcp.Port, readDescription, xmls, keys)
10791048
}
10801049

10811050
func checkNtp(c *pango.Client, ctx context.Context) {
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package tests
2+
3+
import (
4+
"encoding/xml"
5+
"fmt"
6+
7+
. "github.com/onsi/ginkgo/v2"
8+
. "github.com/onsi/gomega"
9+
10+
"github.com/PaloAltoNetworks/pango/generic"
11+
"github.com/PaloAltoNetworks/pango/objects/application"
12+
"github.com/PaloAltoNetworks/pango/version"
13+
)
14+
15+
var _ = Describe("XML Marshalling and Unmarshalling tests", func() {
16+
version, _ := version.New("11.0.0")
17+
var specifier application.Specifier
18+
var normalizer application.Normalizer
19+
20+
JustBeforeEach(func() {
21+
specifier, normalizer, _ = application.Versioning(version)
22+
})
23+
Context("When unmarshalling XML document with no unknown nodes", func() {
24+
Context("within top-level object", func() {
25+
It("should return an Entry object with empty Misc field", func() {
26+
data := []byte(`<result><entry name="app-1"></entry></result>`)
27+
err := xml.Unmarshal(data, &normalizer)
28+
Expect(err).To(Not(HaveOccurred()))
29+
30+
entries, err := normalizer.Normalize()
31+
Expect(err).To(Not(HaveOccurred()))
32+
Expect(entries).To(HaveLen(1))
33+
34+
Expect(entries[0].Name).To(Equal("app-1"))
35+
Expect(entries[0].Misc).To(HaveLen(0))
36+
})
37+
})
38+
Context("within child object", func() {
39+
It("should return an Entry object with empty Misc field within child", func() {
40+
data := []byte(`<entry name="app-1"><default><ident-by-ip-protocol>test-protocol</ident-by-ip-protocol></default></entry>`)
41+
42+
marshalled := []byte(fmt.Sprintf("<result>%s</result>", string(data)))
43+
err := xml.Unmarshal(marshalled, &normalizer)
44+
Expect(err).To(Not(HaveOccurred()))
45+
46+
entries, err := normalizer.Normalize()
47+
Expect(err).To(Not(HaveOccurred()))
48+
Expect(entries).To(HaveLen(1))
49+
50+
Expect(entries[0].Name).To(Equal("app-1"))
51+
Expect(entries[0].Misc).To(HaveLen(0))
52+
53+
Expect(entries[0].Default.IdentByIpProtocol).To(Not(BeNil()))
54+
Expect(*entries[0].Default.IdentByIpProtocol).To(Equal("test-protocol"))
55+
Expect(entries[0].Default.Misc).To(HaveLen(0))
56+
57+
specified, err := specifier(entries[0])
58+
Expect(err).To(Not(HaveOccurred()))
59+
60+
marshalled, err = xml.Marshal(specified)
61+
Expect(err).To(Not(HaveOccurred()))
62+
Expect(marshalled).To(Equal(data))
63+
})
64+
})
65+
Context("within a list child object", func() {
66+
It("should return an Entry object with empty Misc field within a list child", func() {
67+
data := []byte(`<entry name="app-1"><signature><entry name="signature-1"><order-free>yes</order-free></entry></signature></entry>`)
68+
69+
marshalled := []byte(fmt.Sprintf("<result>%s</result>", string(data)))
70+
err := xml.Unmarshal(marshalled, &normalizer)
71+
Expect(err).To(Not(HaveOccurred()))
72+
73+
entries, err := normalizer.Normalize()
74+
Expect(err).To(Not(HaveOccurred()))
75+
Expect(entries).To(HaveLen(1))
76+
77+
Expect(entries[0].Name).To(Equal("app-1"))
78+
Expect(entries[0].Misc).To(HaveLen(0))
79+
80+
Expect(entries[0].Signature).To(HaveLen(1))
81+
Expect(entries[0].Signature[0].OrderFree).To(Not(BeNil()))
82+
Expect(*entries[0].Signature[0].OrderFree).To(BeTrue())
83+
Expect(entries[0].Signature[0].Misc).To(HaveLen(0))
84+
85+
specified, err := specifier(entries[0])
86+
Expect(err).To(Not(HaveOccurred()))
87+
88+
marshalled, err = xml.Marshal(specified)
89+
Expect(err).To(Not(HaveOccurred()))
90+
Expect(marshalled).To(Equal(data))
91+
})
92+
})
93+
})
94+
Context("When unmarshalling XML document with no unknown nodes", func() {
95+
var expectedXmlNodes []generic.Xml
96+
97+
JustBeforeEach(func() {
98+
fakeTextString := "fake-text"
99+
expectedXmlNodes = []generic.Xml{
100+
{
101+
XMLName: xml.Name{Local: "fake-node"},
102+
Text: []byte("fake-text"),
103+
TrimmedText: &fakeTextString,
104+
},
105+
}
106+
})
107+
Context("within top-level object", func() {
108+
It("should return an Entry object with a non-empty Misc field", func() {
109+
data := []byte(`<result><entry name="address-1"><fake-node>fake-text</fake-node></entry></result>`)
110+
err := xml.Unmarshal(data, &normalizer)
111+
Expect(err).To(Not(HaveOccurred()))
112+
113+
entries, err := normalizer.Normalize()
114+
Expect(err).To(Not(HaveOccurred()))
115+
Expect(entries).To(HaveLen(1))
116+
117+
Expect(entries[0].Name).To(Equal("address-1"))
118+
Expect(entries[0].Misc).To(HaveExactElements(expectedXmlNodes))
119+
})
120+
})
121+
Context("within child object", func() {
122+
It("should return an Entry object with a non-empty Misc field within child", func() {
123+
data := []byte(`<entry name="app-1"><default><ident-by-ip-protocol>test-protocol</ident-by-ip-protocol><fake-node>fake-text</fake-node></default></entry>`)
124+
125+
marshalled := []byte(fmt.Sprintf("<result>%s</result>", string(data)))
126+
err := xml.Unmarshal(marshalled, &normalizer)
127+
Expect(err).To(Not(HaveOccurred()))
128+
129+
entries, err := normalizer.Normalize()
130+
Expect(err).To(Not(HaveOccurred()))
131+
Expect(entries).To(HaveLen(1))
132+
133+
Expect(entries[0].Name).To(Equal("app-1"))
134+
Expect(entries[0].Misc).To(HaveLen(0))
135+
136+
Expect(entries[0].Default.IdentByIpProtocol).To(Not(BeNil()))
137+
Expect(*entries[0].Default.IdentByIpProtocol).To(Equal("test-protocol"))
138+
Expect(entries[0].Default.Misc).To(HaveExactElements(expectedXmlNodes))
139+
140+
specified, err := specifier(entries[0])
141+
Expect(err).To(Not(HaveOccurred()))
142+
143+
marshalled, err = xml.Marshal(specified)
144+
Expect(err).To(Not(HaveOccurred()))
145+
Expect(marshalled).To(Equal(data))
146+
})
147+
})
148+
Context("within a list child object", func() {
149+
It("should return an Entry object with a non-empty Misc field within a list child, one for each element", func() {
150+
data := []byte(`<entry name="app-1"><signature><entry name="signature-1"><order-free>yes</order-free><fake-node>fake-text1</fake-node></entry><entry name="signature-2"><order-free>no</order-free><fake-node>fake-text2</fake-node></entry></signature></entry>`)
151+
152+
marshalled := []byte(fmt.Sprintf("<result>%s</result>", string(data)))
153+
err := xml.Unmarshal(marshalled, &normalizer)
154+
Expect(err).To(Not(HaveOccurred()))
155+
156+
entries, err := normalizer.Normalize()
157+
Expect(err).To(Not(HaveOccurred()))
158+
Expect(entries).To(HaveLen(1))
159+
160+
Expect(entries[0].Name).To(Equal("app-1"))
161+
Expect(entries[0].Misc).To(HaveLen(0))
162+
163+
Expect(entries[0].Signature).To(HaveLen(2))
164+
Expect(entries[0].Signature[0].OrderFree).To(Not(BeNil()))
165+
Expect(*entries[0].Signature[0].OrderFree).To(BeTrue())
166+
167+
fakeTextString := "fake-text1"
168+
expectedXmlNodes = []generic.Xml{
169+
{
170+
XMLName: xml.Name{Local: "fake-node"},
171+
Text: []byte(fakeTextString),
172+
TrimmedText: &fakeTextString,
173+
},
174+
}
175+
Expect(entries[0].Signature[0].Misc).To(HaveExactElements())
176+
177+
fakeTextString = "fake-text2"
178+
expectedXmlNodes = []generic.Xml{
179+
{
180+
XMLName: xml.Name{Local: "fake-node"},
181+
Text: []byte(fakeTextString),
182+
TrimmedText: &fakeTextString,
183+
},
184+
}
185+
Expect(entries[0].Signature[1].Misc).To(HaveExactElements())
186+
187+
specified, err := specifier(entries[0])
188+
Expect(err).To(Not(HaveOccurred()))
189+
190+
marshalled, err = xml.Marshal(specified)
191+
Expect(err).To(Not(HaveOccurred()))
192+
Expect(marshalled).To(Equal(data))
193+
})
194+
})
195+
})
196+
})
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package tests
2+
3+
import (
4+
"log/slog"
5+
"testing"
6+
7+
. "github.com/onsi/ginkgo/v2"
8+
. "github.com/onsi/gomega"
9+
)
10+
11+
func TestMovement(t *testing.T) {
12+
handler := slog.NewTextHandler(GinkgoWriter, &slog.HandlerOptions{
13+
Level: slog.LevelDebug,
14+
})
15+
slog.SetDefault(slog.New(handler))
16+
RegisterFailHandler(Fail)
17+
RunSpecs(t, "Translate Suite")
18+
}

0 commit comments

Comments
 (0)