diff --git a/test/proxy.test b/test/proxy.test new file mode 100644 index 0000000..1ba1b8a --- /dev/null +++ b/test/proxy.test @@ -0,0 +1,52 @@ +package require tcltest +set auto_path [list ../lib {*}$auto_path] +package require -exact zmq 3.3 + +tcltest::test proxy-1 {zmq proxy} -body { + zmq proxy +} -returnCodes {error} -result {wrong # args: should be "zmq proxy frontend backend ?capture?"} + +tcltest::test proxy-2 {zmq proxy} -setup { + zmq context ctx +} -body { + zmq proxy b c d +} -cleanup { + ctx term +} -returnCodes {error} -result {socket "b" does not exists} + +tcltest::test proxy-3 {zmq proxy} -setup { + zmq context ctx + zmq socket b ctx REQ +} -body { + zmq proxy b c d +} -cleanup { + b close + ctx term +} -returnCodes {error} -result {socket "c" does not exists} + +tcltest::test proxy-4 {zmq proxy} -setup { + zmq context ctx + zmq socket b ctx REQ + zmq socket c ctx REP +} -body { + zmq proxy b c d +} -cleanup { + b close + c close + ctx term +} -returnCodes {error} -result {socket "d" does not exists} + +tcltest::test proxy-5 {zmq proxy} -setup { + zmq context ctx + zmq socket b ctx REQ + zmq socket c ctx REP + zmq socket d ctx PUB +} -body { +# Can't do this test, call will not return +# zmq proxy b c d +} -cleanup { + b close + c close + d close + ctx term +} -returnCodes {ok} -result {} diff --git a/zmq.tcl b/zmq.tcl index 2f00ee8..995ab68 100644 --- a/zmq.tcl +++ b/zmq.tcl @@ -2314,6 +2314,30 @@ critcl::ccommand ::zmq::device {cd ip objc objv} { return TCL_OK; } -clientdata zmqClientDataInitVar +critcl::ccommand ::zmq::proxy {cd ip objc objv} { + void* frontendsocket = 0; + void* backendsocket = 0; + void* capturesocket = 0; + if (objc < 3 || objc > 4) { + Tcl_WrongNumArgs(ip, 1, objv, "frontend backend ?capture?"); + return TCL_ERROR; + } + frontendsocket = known_socket(ip, objv[1]); + if (!frontendsocket) + return TCL_ERROR; + backendsocket = known_socket(ip, objv[2]); + if (!backendsocket) + return TCL_ERROR; + if (objc > 3) { + capturesocket = known_socket(ip, objv[3]); + if (!capturesocket) + return TCL_ERROR; + } + zmq_proxy(frontendsocket, backendsocket, capturesocket); + last_zmq_errno = zmq_errno(); + return TCL_OK; +} -clientdata zmqClientDataInitVar + critcl::ccommand ::zmq::zframe_strhex {cd ip objc objv} { char* data = 0; int size = -1;