THRIFT-3578 Make THeaderTransport detect TCompact framed and unframed
Client: C++
Patch: Nobuaki Sukegawa

This closes #819
diff --git a/test/features/tests.json b/test/features/tests.json
index f726dad..cfcb4b6 100644
--- a/test/features/tests.json
+++ b/test/features/tests.json
@@ -4,7 +4,9 @@
     "name": "theader_unframed_binary",
     "command": [
       "python",
-      "theader_binary.py"
+      "theader_binary.py",
+      "--override-protocol=binary",
+      "--override-transport=buffered"
     ],
     "protocols": ["header"],
     "transports": ["buffered"],
@@ -17,6 +19,35 @@
     "command": [
       "python",
       "theader_binary.py",
+      "--override-protocol=binary",
+      "--override-transport=framed"
+    ],
+    "protocols": ["header"],
+    "transports": ["buffered"],
+    "sockets": ["ip"],
+    "workdir": "features"
+  },
+  {
+    "description": "THeader detects unframed compact wire format",
+    "name": "theader_unframed_compact",
+    "command": [
+      "python",
+      "theader_binary.py",
+      "--override-protocol=compact",
+      "--override-transport=buffered"
+    ],
+    "protocols": ["header"],
+    "transports": ["buffered"],
+    "sockets": ["ip"],
+    "workdir": "features"
+  },
+  {
+    "description": "THeader detects framed compact wire format",
+    "name": "theader_framed_compact",
+    "command": [
+      "python",
+      "theader_binary.py",
+      "--override-protocol=compact",
       "--override-transport=framed"
     ],
     "protocols": ["header"],
diff --git a/test/features/theader_binary.py b/test/features/theader_binary.py
index 0316741..62a2671 100644
--- a/test/features/theader_binary.py
+++ b/test/features/theader_binary.py
@@ -10,6 +10,24 @@
 from thrift.transport.TSocket import TSocket
 from thrift.transport.TTransport import TBufferedTransport, TFramedTransport
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.protocol.TCompactProtocol import TCompactProtocol
+
+
+def test_void(proto):
+  proto.writeMessageBegin('testVoid', TMessageType.CALL, 3)
+  proto.writeStructBegin('testVoid_args')
+  proto.writeFieldStop()
+  proto.writeStructEnd()
+  proto.writeMessageEnd()
+  proto.trans.flush()
+
+  _, mtype, _ = proto.readMessageBegin()
+  assert mtype == TMessageType.REPLY
+  proto.readStructBegin()
+  _, ftype, _ = proto.readFieldBegin()
+  assert ftype == TType.STOP
+  proto.readStructEnd()
+  proto.readMessageEnd()
 
 
 # THeader stack should accept binary protocol with optionally framed transport
@@ -19,6 +37,7 @@
   # Since THeaderTransport acts as framed transport when detected frame, we
   # cannot use --transport=framed as it would result in 2 layered frames.
   p.add_argument('--override-transport')
+  p.add_argument('--override-protocol')
   args = p.parse_args()
   assert args.protocol == 'header'
   assert args.transport == 'buffered'
@@ -28,26 +47,21 @@
   if not args.override_transport or args.override_transport == 'buffered':
     trans = TBufferedTransport(sock)
   elif args.override_transport == 'framed':
+    print('TFRAMED')
     trans = TFramedTransport(sock)
   else:
     raise ValueError('invalid transport')
   trans.open()
-  proto = TBinaryProtocol(trans)
-  proto.writeMessageBegin('testVoid', TMessageType.CALL, 3)
-  proto.writeStructBegin('testVoid_args')
-  proto.writeFieldStop()
-  proto.writeStructEnd()
-  proto.writeMessageEnd()
-  trans.flush()
 
-  _, mtype, _ = proto.readMessageBegin()
-  assert mtype == TMessageType.REPLY
-  proto.readStructBegin()
-  _, ftype, _ = proto.readFieldBegin()
-  assert ftype == TType.STOP
-  proto.readFieldEnd()
-  proto.readStructEnd()
-  proto.readMessageEnd()
+  if not args.override_protocol or args.override_protocol == 'binary':
+    proto = TBinaryProtocol(trans)
+  elif args.override_protocol == 'compact':
+    proto = TCompactProtocol(trans)
+  else:
+    raise ValueError('invalid transport')
+
+  test_void(proto)
+  test_void(proto)
 
   trans.close()