summaryrefslogtreecommitdiff
path: root/test/crosslang.cc
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-06-01 04:47:28 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-06-01 04:47:28 +0900
commit062ed8a4c46be31da26538a4144fd441e453f30c (patch)
treebf1a84818b5395b20a74b7d6965bafa9f623b004 /test/crosslang.cc
parentf5a7d444e202f47f65b72459677fcd3c8b31bcfd (diff)
downloadmsgpack-python-062ed8a4c46be31da26538a4144fd441e453f30c.tar.gz
add test/cases.mpac and test/cases_compact.mpac
Diffstat (limited to 'test/crosslang.cc')
-rw-r--r--test/crosslang.cc133
1 files changed, 133 insertions, 0 deletions
diff --git a/test/crosslang.cc b/test/crosslang.cc
new file mode 100644
index 0000000..be521b3
--- /dev/null
+++ b/test/crosslang.cc
@@ -0,0 +1,133 @@
+//
+// MessagePack cross-language test tool
+//
+// $ cd ../cpp && ./configure && make && make install
+// or
+// $ port install msgpack # MacPorts
+//
+// $ g++ -Wall -lmsgpack crosslang.cc
+//
+#include <msgpack.hpp>
+#include <iostream>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+static int run(int infd, int outfd)
+try {
+ msgpack::unpacker pac;
+
+ while(true) {
+ pac.reserve_buffer(32*1024);
+
+ ssize_t count =
+ read(infd, pac.buffer(), pac.buffer_capacity());
+
+ if(count <= 0) {
+ if(count == 0) {
+ return 0;
+ }
+ if(errno == EAGAIN || errno == EINTR) {
+ continue;
+ }
+ return 1;
+ }
+
+ pac.buffer_consumed(count);
+
+ msgpack::unpacked result;
+ while(pac.next(&result)) {
+ msgpack::sbuffer sbuf;
+ msgpack::pack(sbuf, result.get());
+
+ const char* p = sbuf.data();
+ const char* const pend = p + sbuf.size();
+ while(p < pend) {
+ ssize_t bytes = write(outfd, p, pend-p);
+
+ if(bytes <= 0) {
+ if(count == 0) {
+ return 0;
+ }
+ if(errno == EAGAIN || errno == EINTR) {
+ continue;
+ }
+ return 1;
+ }
+
+ p += bytes;
+ }
+
+ }
+ }
+
+ return 0;
+
+} catch (std::exception& e) {
+ std::cerr << e.what() << std::endl;
+ return 1;
+}
+
+static void usage(const char* prog)
+{
+ printf(
+ "Usage: %s [in-file] [out-file]\n"
+ "\n"
+ "This tool is for testing of MessagePack implementation.\n"
+ "This does following behavior:\n"
+ "\n"
+ " 1. Reads objects serialized by MessagePack from <in-file> (default: stdin)\n"
+ " 2. Re-serializes the objects using C++ implementation of MessagePack (Note that C++ implementation is considered valid)\n"
+ " 3. Writes the re-serialized objects into <out-file> (default: stdout)\n"
+ "\n"
+ , prog);
+ exit(1);
+}
+
+int main(int argc, char* argv[])
+{
+ int infd = 0;
+ int outfd = 1;
+
+ if(argc < 1 || argc > 3) {
+ usage(argv[0]);
+ }
+
+ for(int i=1; i < argc; ++i) {
+ if(strlen(argv[i]) > 1 && argv[i][0] == '-') {
+ usage(argv[0]);
+ }
+ }
+
+ if(argc >= 2) {
+ const char* fname = argv[1];
+ if(strcmp(fname, "-") != 0) {
+ infd = open(fname, O_RDONLY);
+ if(infd < 0) {
+ perror("can't open input file");
+ exit(1);
+ }
+ }
+ }
+
+ if(argc >= 3) {
+ const char* fname = argv[2];
+ if(strcmp(fname, "-") != 0) {
+ outfd = open(fname, O_WRONLY | O_CREAT| O_TRUNC, 0666);
+ if(outfd < 0) {
+ perror("can't open output file");
+ exit(1);
+ }
+ }
+ }
+
+ int code = run(infd, outfd);
+
+ close(infd);
+ close(outfd);
+
+ return code;
+}
+