4 "git.fd.io/govpp.git/api"
5 interfaces "git.fd.io/govpp.git/binapi/interface"
6 "git.fd.io/govpp.git/binapi/ip"
7 "git.fd.io/govpp.git/binapi/l2"
8 "git.fd.io/govpp.git/binapi/memif"
9 "git.fd.io/govpp.git/binapi/vpe"
10 "git.fd.io/govpp.git/core"
11 . "github.com/onsi/gomega"
16 func TestTraceEnabled(t *testing.T) {
17 ctx := setupTest(t, false)
18 defer ctx.teardownTest()
20 Expect(ctx.conn.Trace()).ToNot(BeNil())
21 ctx.conn.Trace().Enable(true)
23 request := []api.Message{
24 &interfaces.CreateLoopback{},
26 &l2.BridgeDomainAddDel{},
29 reply := []api.Message{
30 &interfaces.CreateLoopbackReply{},
31 &memif.MemifCreateReply{},
32 &l2.BridgeDomainAddDelReply{},
33 &ip.IPTableAddDelReply{},
36 for i := 0; i < len(request); i++ {
37 ctx.mockVpp.MockReply(reply[i])
38 err := ctx.ch.SendRequest(request[i]).ReceiveReply(reply[i])
39 Expect(err).To(BeNil())
42 traced := ctx.conn.Trace().GetRecords()
43 Expect(traced).ToNot(BeNil())
44 Expect(traced).To(HaveLen(8))
45 for i, entry := range traced {
46 Expect(entry.Timestamp).ToNot(BeNil())
47 Expect(entry.Message.GetMessageName()).ToNot(Equal(""))
48 if strings.HasSuffix(entry.Message.GetMessageName(), "_reply") ||
49 strings.HasSuffix(entry.Message.GetMessageName(), "_details") {
50 Expect(entry.IsReceived).To(BeTrue())
52 Expect(entry.IsReceived).To(BeFalse())
55 Expect(request[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
57 Expect(reply[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
62 func TestMultiRequestTraceEnabled(t *testing.T) {
63 ctx := setupTest(t, false)
64 defer ctx.teardownTest()
66 ctx.conn.Trace().Enable(true)
68 request := []api.Message{
69 &interfaces.SwInterfaceDump{},
71 reply := []api.Message{
72 &interfaces.SwInterfaceDetails{
75 &interfaces.SwInterfaceDetails{
78 &interfaces.SwInterfaceDetails{
81 &vpe.ControlPingReply{},
84 ctx.mockVpp.MockReply(reply...)
85 multiCtx := ctx.ch.SendMultiRequest(request[0])
89 last, err := multiCtx.ReceiveReply(reply[i])
90 Expect(err).ToNot(HaveOccurred())
97 traced := ctx.conn.Trace().GetRecords()
98 Expect(traced).ToNot(BeNil())
99 Expect(traced).To(HaveLen(6))
100 for i, entry := range traced {
101 Expect(entry.Timestamp).ToNot(BeNil())
102 Expect(entry.Message.GetMessageName()).ToNot(Equal(""))
103 if strings.HasSuffix(entry.Message.GetMessageName(), "_reply") ||
104 strings.HasSuffix(entry.Message.GetMessageName(), "_details") {
105 Expect(entry.IsReceived).To(BeTrue())
107 Expect(entry.IsReceived).To(BeFalse())
110 Expect(request[0].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
111 } else if i == len(traced)-1 {
112 msg := vpe.ControlPing{}
113 Expect(msg.GetMessageName()).To(Equal(entry.Message.GetMessageName()))
115 Expect(reply[i-1].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
120 func TestTraceDisabled(t *testing.T) {
121 ctx := setupTest(t, false)
122 defer ctx.teardownTest()
124 ctx.conn.Trace().Enable(false)
126 request := []api.Message{
127 &interfaces.CreateLoopback{},
128 &memif.MemifCreate{},
129 &l2.BridgeDomainAddDel{},
132 reply := []api.Message{
133 &interfaces.CreateLoopbackReply{},
134 &memif.MemifCreateReply{},
135 &l2.BridgeDomainAddDelReply{},
136 &ip.IPTableAddDelReply{},
139 for i := 0; i < len(request); i++ {
140 ctx.mockVpp.MockReply(reply[i])
141 err := ctx.ch.SendRequest(request[i]).ReceiveReply(reply[i])
142 Expect(err).To(BeNil())
145 traced := ctx.conn.Trace().GetRecords()
146 Expect(traced).To(BeNil())
149 func TestTracePerChannel(t *testing.T) {
150 ctx := setupTest(t, false)
151 defer ctx.teardownTest()
153 ctx.conn.Trace().Enable(true)
156 ch2, err := ctx.conn.NewAPIChannel()
157 Expect(err).ToNot(HaveOccurred())
159 requestCh1 := []api.Message{
160 &interfaces.CreateLoopback{},
161 &memif.MemifCreate{},
162 &l2.BridgeDomainAddDel{},
164 replyCh1 := []api.Message{
165 &interfaces.CreateLoopbackReply{},
166 &memif.MemifCreateReply{},
167 &l2.BridgeDomainAddDelReply{},
169 requestCh2 := []api.Message{
172 replyCh2 := []api.Message{
173 &ip.IPTableAddDelReply{},
176 for i := 0; i < len(requestCh1); i++ {
177 ctx.mockVpp.MockReply(replyCh1[i])
178 err := ch1.SendRequest(requestCh1[i]).ReceiveReply(replyCh1[i])
179 Expect(err).To(BeNil())
181 for i := 0; i < len(requestCh2); i++ {
182 ctx.mockVpp.MockReply(replyCh2[i])
183 err := ch2.SendRequest(requestCh2[i]).ReceiveReply(replyCh2[i])
184 Expect(err).To(BeNil())
187 trace := ctx.conn.Trace().GetRecords()
188 Expect(trace).ToNot(BeNil())
189 Expect(trace).To(HaveLen(8))
192 channel1, ok := ch1.(*core.Channel)
193 Expect(ok).To(BeTrue())
194 channel2, ok := ch2.(*core.Channel)
195 Expect(ok).To(BeTrue())
197 tracedCh1 := ctx.conn.Trace().GetRecordsForChannel(channel1.GetID())
198 Expect(tracedCh1).ToNot(BeNil())
199 Expect(tracedCh1).To(HaveLen(6))
200 for i, entry := range tracedCh1 {
201 Expect(entry.Timestamp).ToNot(BeNil())
202 Expect(entry.Message.GetMessageName()).ToNot(Equal(""))
203 if strings.HasSuffix(entry.Message.GetMessageName(), "_reply") ||
204 strings.HasSuffix(entry.Message.GetMessageName(), "_details") {
205 Expect(entry.IsReceived).To(BeTrue())
207 Expect(entry.IsReceived).To(BeFalse())
210 Expect(requestCh1[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
212 Expect(replyCh1[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
216 tracedCh2 := ctx.conn.Trace().GetRecordsForChannel(channel2.GetID())
217 Expect(tracedCh2).ToNot(BeNil())
218 Expect(tracedCh2).To(HaveLen(2))
219 for i, entry := range tracedCh2 {
220 Expect(entry.Timestamp).ToNot(BeNil())
221 Expect(entry.Message.GetMessageName()).ToNot(Equal(""))
222 if strings.HasSuffix(entry.Message.GetMessageName(), "_reply") ||
223 strings.HasSuffix(entry.Message.GetMessageName(), "_details") {
224 Expect(entry.IsReceived).To(BeTrue())
226 Expect(entry.IsReceived).To(BeFalse())
229 Expect(requestCh2[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
231 Expect(replyCh2[i/2].GetMessageName()).To(Equal(entry.Message.GetMessageName()))
236 func TestTraceClear(t *testing.T) {
237 ctx := setupTest(t, false)
238 defer ctx.teardownTest()
240 ctx.conn.Trace().Enable(true)
242 request := []api.Message{
243 &interfaces.CreateLoopback{},
244 &memif.MemifCreate{},
246 reply := []api.Message{
247 &interfaces.CreateLoopbackReply{},
248 &memif.MemifCreateReply{},
251 for i := 0; i < len(request); i++ {
252 ctx.mockVpp.MockReply(reply[i])
253 err := ctx.ch.SendRequest(request[i]).ReceiveReply(reply[i])
254 Expect(err).To(BeNil())
257 traced := ctx.conn.Trace().GetRecords()
258 Expect(traced).ToNot(BeNil())
259 Expect(traced).To(HaveLen(4))
261 ctx.conn.Trace().Clear()
262 traced = ctx.conn.Trace().GetRecords()
263 Expect(traced).To(BeNil())
264 Expect(traced).To(BeEmpty())