Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
126838d
Probably need to change the packaging for pebbe-zmq4, but let's see i…
mcrawforddt May 6, 2025
e7ad0df
Update build dep
mcrawforddt May 8, 2025
c6c5712
Add libzmq
mcrawforddt May 8, 2025
b71e6de
Skip tests?
mcrawforddt May 8, 2025
ecc8285
Don't skip tests
mcrawforddt May 8, 2025
8c59ba8
Disable cgo
mcrawforddt May 9, 2025
d4e3319
Try without the other package
mcrawforddt May 9, 2025
eb111a1
Delete install file
mcrawforddt May 9, 2025
342e19d
Try env variable in more specific place
mcrawforddt May 9, 2025
c1b4d11
Try adding miekg-dns, just for fun
mcrawforddt May 9, 2025
5602564
No rules
mcrawforddt May 9, 2025
b2a625f
Try enabling it explicitly
mcrawforddt May 9, 2025
6d4f816
Disable CGO again
mcrawforddt May 9, 2025
ef9635e
Exclude cgo-nmsg (pebbe/zmq4 needs cgo)
mcrawforddt May 9, 2025
b07355b
Commenting out a test - discuss how to handle this before landing
mcrawforddt May 9, 2025
cdccfdf
Try with two commented out
mcrawforddt May 9, 2025
ae86588
Try syncing version
mcrawforddt May 9, 2025
5afe06b
Separate tests
mcrawforddt May 12, 2025
d1dc311
Remove some imports
mcrawforddt May 12, 2025
f9065bd
Remove from correct file
mcrawforddt May 12, 2025
45e9342
Remove more cnmsg
mcrawforddt May 12, 2025
c4e18ec
Another bonus import
mcrawforddt May 13, 2025
4d9e4aa
Try to fail
mcrawforddt May 13, 2025
772884d
Copy definitions
mcrawforddt May 13, 2025
b5943da
Try copying generated file. I may be getting out of my depth
mcrawforddt May 13, 2025
991102b
Don't need to go nuts
mcrawforddt May 13, 2025
b511634
Comment out first failing test
mcrawforddt May 13, 2025
9a06886
Comment out other failure
mcrawforddt May 13, 2025
5144b0b
Make it build again
mcrawforddt May 13, 2025
c86d928
Add changelog updates
mcrawforddt May 29, 2025
d9e4d7d
Update dev package dependencies
mcrawforddt May 29, 2025
acb442f
Bump version
mcrawforddt May 29, 2025
ee0cca2
Removed extra dev build deps
mcrawforddt May 29, 2025
7bf4aa2
yaml is only used for testing
mcrawforddt May 29, 2025
873be6f
Need pkg-config for libzmq3-dev
mcrawforddt May 29, 2025
4d59285
Remove dependencies that are now provided by golang-github-pebbe-zmq4…
mcrawforddt May 29, 2025
edf2ebd
Update control
mcrawforddt Jun 24, 2025
77d3b0d
Deps for building included in -dev package
mcrawforddt Jul 10, 2025
aa9a15b
Wrong place
mcrawforddt Jul 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
284 changes: 284 additions & 0 deletions cgo-nmsg/zmq_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
package nmsg_test

import (
"errors"
"github.com/farsightsec/go-nmsg"
cnmsg "github.com/farsightsec/go-nmsg/cgo-nmsg"
"io"
"log"
"strconv"
"testing"
)

type tester func(*testing.T, io.Reader, io.Writer)
type testerCgo func(*testing.T, cnmsg.Input, cnmsg.Output)
type testerMixed func(*testing.T, cnmsg.Input, cnmsg.Output, nmsg.Input, nmsg.Output)

func compare(a, b []byte) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}

func PayloadIsEqual(c *nmsg.NmsgPayload, d *nmsg.NmsgPayload) bool {
if *c.Vid != *d.Vid || *c.Msgtype != *d.Msgtype {
return false
}

return compare(c.Payload, d.Payload)
}

func MessageIsEqual(c *cnmsg.Message, d *cnmsg.Message) bool {
ct, cv := c.GetMsgtype()
dt, dv := d.GetMsgtype()
if ct != dt || cv != dv {
return false
}

cp, err := c.GetBytesField("payload", 0)
if err != nil {
return false
}

dp, err := d.GetBytesField("payload", 0)
if err != nil {
return false
}

return compare(cp, dp)
}

func getCgoMessage(t *testing.T, size int) *cnmsg.Message {
mod := cnmsg.MessageModLookupByName("base", "encode")
if mod == nil {
log.Fatal("module not found")
}
msg := cnmsg.NewMessage(mod)
if err := msg.SetEnumField("type", 0, "TEXT"); err != nil {
log.Fatal(err)
}

payload := make([]byte, size)
for i := range payload {
payload[i] = '0'
}

if err := msg.SetBytesField("payload", 0, payload); err != nil {
log.Fatal(err)
}

return msg
}

func doWriteCgo(t *testing.T, s chan bool, o cnmsg.Output) error {
for {
select {
case _ = <-s:
return nil
default:
msg := getCgoMessage(t, 500)
err := o.Write(msg)
if err != nil {
return err
}
}
}
}

func doReadCGo(s chan bool, i cnmsg.Input) (*cnmsg.Message, error) {
var rmsg *cnmsg.Message
var err error
for {
rmsg, err = i.Read()
if err != nil {
if cnmsg.ErrorRetry(err) == false {
return nil, err
}
} else if rmsg == nil {
return nil, errors.New("receive nil message")
} else {
break
}
}
s <- true
return rmsg, nil
}

func doWriteNmsg(s chan bool, msg *nmsg.NmsgPayload, o nmsg.Output) error {
for {
select {
case _ = <-s:
return nil
default:
err := o.Send(msg)
if err != nil {
return err
}
}
}
}

func doReadNmsg(s chan bool, i nmsg.Input) (*nmsg.NmsgPayload, error) {
var rmsg *nmsg.NmsgPayload
var err error
for {
rmsg, err = i.Recv()
if err != nil {
return nil, err
} else if rmsg == nil {
return nil, errors.New("receive nil message")
} else {
break
}
}
s <- true
return rmsg, nil
}

func doTestCgoDo(t *testing.T, i cnmsg.Input, o cnmsg.Output) {
signal := make(chan bool)

go func() {
err := doWriteCgo(t, signal, o)
if err != nil {
t.Fatal(err.Error())
}
}()

rmsg, err := doReadCGo(signal, i)

if err != nil {
t.Fatal(err.Error())
}

msg_ref := getCgoMessage(t, 500)
if MessageIsEqual(rmsg, msg_ref) == false {
log.Fatal("messages do not match")
}
}

func doTestForCGo(t *testing.T, ep string, tp string, fn testerCgo) {
writer, err := cnmsg.NewZMQOutput(ep+",accept,"+tp, 2000)

if err != nil {
t.Error(err.Error())
return
}

reader, err := cnmsg.NewZMQInput(ep + ",connect," + tp)

if err != nil {
t.Error(err.Error())
return
}

fn(t, reader, writer)
}

func doTestMixedDo(t *testing.T, ci cnmsg.Input, co cnmsg.Output, ni nmsg.Input, no nmsg.Output) {
// Write to co, read for ni, write to no, read from ci
signal1 := make(chan bool)
signal2 := make(chan bool)

go func() {
err := doWriteCgo(t, signal1, co)
if err != nil {
log.Fatal(err.Error())
}
}()
pin, err := doReadNmsg(signal1, ni)
if err != nil {
log.Fatal(err.Error())
}
go func() {
err := doWriteNmsg(signal2, pin, no)
if err != nil {
log.Fatal(err.Error())
}
}()
rmsg, err := doReadCGo(signal2, ci)
if err != nil {
log.Fatal(err.Error())
}

msg_ref := getCgoMessage(t, 500)

if MessageIsEqual(rmsg, msg_ref) == false {
log.Fatal("messages do not match")
}
}

func doTestForMixed(t *testing.T, ep string, num int, tp string, fn testerMixed) {
ep1 := ep + strconv.Itoa(num)
ep2 := ep + strconv.Itoa(num+1)

co, err := cnmsg.NewZMQOutput(ep1+",accept,"+tp, 1000)

if err != nil {
t.Error(err.Error() + " " + ep1)
return
}

nw, err := nmsg.NewZMQWriter(ep2 + ",accept," + tp)
if err != nil {
t.Error(err.Error() + " " + ep2)
return
}

nr, err := nmsg.NewZMQReader(ep1 + ",connect," + tp)
if err != nil {
t.Error(err.Error() + " " + ep1)
return
}

ci, err := cnmsg.NewZMQInput(ep2 + ",connect," + tp)

if err != nil {
t.Error(err.Error() + " " + ep2)
return
}

ni := nmsg.NewInput(nr, 1000)
no := nmsg.UnbufferedOutput(nw)

fn(t, ci, co, ni, no)
}

func TestZMQ_CGo_Local(t *testing.T) {
doTestForCGo(t, "tcp://127.0.0.1:6555", "pushpull", doTestCgoDo)
doTestForCGo(t, "tcp://127.0.0.1:6557", "pubsub", doTestCgoDo)
}

func TestZMQ_CGo_Inproc(t *testing.T) {
doTestForCGo(t, "inproc://TestZMQInproc10", "pushpull", doTestCgoDo)
doTestForCGo(t, "inproc://TestZMQInproc30", "pubsub", doTestCgoDo)
}

func TestZMQ_CGo_IPC(t *testing.T) {
doTestForCGo(t, "ipc:///tmp/TestZMQIpc10", "pushpull", doTestCgoDo)
doTestForCGo(t, "ipc:///tmp/TestZMQIpc20", "pubsub", doTestCgoDo)
}

# This test is currently failing with a segfault
func TestZmq_Mixed_Local(t *testing.T) {
doTestForMixed(t, "tcp://127.0.0.1:", 7555, "pushpull", doTestMixedDo)
doTestForMixed(t, "tcp://127.0.0.1:", 7557, "pubsub", doTestMixedDo)
}

//// Inproc cgo-nmsg side fill writer buffer and hangs
//func TestZmq_Mixed_Inproc(t *testing.T) {
// doTestForMixed(t, "inproc://TestZMQInproc", 100, "pushpull", doTestMixedDo)
// doTestForMixed(t, "inproc://TestZMQInproc", 200, "pubsub", doTestMixedDo)
//}

# This test is currently failing with a segfault
func TestZmq_Mixed_IPC(t *testing.T) {
doTestForMixed(t, "ipc:///tmp/TestZMQIpc", 100, "pushpull", doTestMixedDo)
doTestForMixed(t, "ipc:///tmp/TestZMQIpc", 200, "pubsub", doTestMixedDo)
}
8 changes: 8 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
go-nmsg (0.3.1-1) debian-fsi; urgency=medium

* Update dependencies for package building.
* Skip building cgo-nmsg.
* Move cgo-nmsg tests into that directory so they are also skipped.

-- Farsight Security Inc <[email protected]> Thu, 29 May 2025 13:05:44 -0400

go-nmsg (0.3.0-1) debian-fsi; urgency=medium

* Add support for dnsobs message type.
Expand Down
18 changes: 4 additions & 14 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ Build-Depends:
debhelper-compat (= 13),
dh-golang,
golang-any,
golang-google-protobuf-dev,
golang-github-dnstap-go-dnstap-dev,
golang-github-pebbe-zmq4-dev,
golang-google-protobuf-dev,
golang-gopkg-yaml.v2-dev,
libnmsg-dev (>= 1.1.0~),
pkg-config,
Expand All @@ -19,6 +20,8 @@ XS-Go-Import-Path: github.com/farsightsec/go-nmsg
Package: golang-github-farsightsec-go-nmsg-dev
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends},
golang-github-dnstap-go-dnstap-dev,
golang-github-pebbe-zmq4-dev,
golang-google-protobuf-dev,
Description: Pure Golang NMSG Library
go-nmsg is a pure go implementation of the NMSG container and payload
Expand All @@ -33,20 +36,7 @@ Package: golang-github-farsightsec-go-nmsg-base-dev
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends},
golang-github-farsightsec-go-nmsg-dev (= ${binary:Version}),
golang-github-dnstap-go-dnstap-dev,
golang-google-protobuf-dev,
Description: NMSG vendor base encoding modules for Golang
This package provides generated Go code from Protocol Buffers Version 2
specifications for NMSG vendor base encoding modules: Dns, DnsQR, Email,
Encode, Http, IPConn, Linkpair, LogLine, Ncap, Packet, Pkt, and Xml.

Package: golang-github-farsightsec-go-nmsg-cgo-nmsg-dev
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends},
pkg-config,
libnmsg-dev,
libxs-dev
Description: Golang bindings to the C libnmsg library
The NMSG network message encapsulation library format is an efficient
encoding of typed, structured data into payloads which are packed into
containers which can be transmitted over the network or stored to disk.

This file was deleted.

2 changes: 2 additions & 0 deletions debian/rules
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/make -f

export DH_GOLANG_EXCLUDES := cgo-nmsg

%:
dh $@ --with=golang --builddirectory=_build --buildsystem=golang
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.18

require (
github.com/dnstap/golang-dnstap v0.4.0
github.com/pebbe/zmq4 v1.2.10
github.com/pebbe/zmq4 v1.4.0
google.golang.org/protobuf v1.25.0
gopkg.in/yaml.v2 v2.4.0
)
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/miekg/dns v1.1.31 h1:sJFOl9BgwbYAWOGEwr61FU28pqsBNdpRBnhGXtO06Oo=
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/pebbe/zmq4 v1.2.10 h1:wQkqRZ3CZeABIeidr3e8uQZMMH5YAykA/WN0L5zkd1c=
github.com/pebbe/zmq4 v1.2.10/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
github.com/pebbe/zmq4 v1.4.0 h1:gO5P92Ayl8GXpPZdYcD62Cwbq0slSBVVQRIXwGSJ6eQ=
github.com/pebbe/zmq4 v1.4.0/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
Expand Down
Loading