Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / derby-10.3.2.1 / java / drda / org / apache / derby / impl / drda / TestProto.java
diff --git a/JMCR-Stable/real-world application/derby-10.3.2.1/java/drda/org/apache/derby/impl/drda/TestProto.java b/JMCR-Stable/real-world application/derby-10.3.2.1/java/drda/org/apache/derby/impl/drda/TestProto.java
new file mode 100644 (file)
index 0000000..ab9f0f1
--- /dev/null
@@ -0,0 +1,1041 @@
+/*\r
+\r
+   Derby - Class org.apache.derby.impl.drda.TestProto\r
+\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+      http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.impl.drda;\r
+\r
+import java.io.BufferedReader;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+import java.io.OutputStream;\r
+import java.io.StreamTokenizer;\r
+import java.io.UnsupportedEncodingException;\r
+import java.net.Socket;\r
+import java.net.UnknownHostException;\r
+import java.util.Enumeration;\r
+import java.util.Hashtable;\r
+import java.util.Locale;\r
+import java.util.Vector;\r
+\r
+/**\r
+       This class is used to test error conditions in the protocol.\r
+       The protocol to send to the Net server is contained in a file encoded\r
+       as calls to routines in ddmreader and ddmwriter.\r
+       Additional commands have been added for testing purposes.\r
+       To add tests, modify the file protocol.tests.\r
+       Tests can also be done as separate files and given as an argument to\r
+       this class.\r
+*/\r
+\r
+public class TestProto {\r
+\r
+       private static final CodePointNameTable codePointNameTable = new CodePointNameTable();\r
+       private static final Hashtable codePointValueTable = new Hashtable();\r
+       private static final Hashtable commandTable = new Hashtable();\r
+       private static final CcsidManager ccsidManager = new EbcdicCcsidManager();\r
+       //commands\r
+       private static final int CREATE_DSS_REQUEST = 1;\r
+       private static final int CREATE_DSS_OBJECT = 2;\r
+       private static final int END_DSS = 3;\r
+       private static final int END_DDM_AND_DSS = 4;\r
+       private static final int START_DDM = 5;\r
+       private static final int END_DDM = 6;\r
+       private static final int WRITE_BYTE = 7;\r
+       private static final int WRITE_NETWORK_SHORT = 8;\r
+       private static final int WRITE_NETWORK_INT = 9;\r
+       private static final int WRITE_BYTES = 10;\r
+       private static final int WRITE_CODEPOINT_4BYTES = 11;\r
+       private static final int WRITE_SCALAR_1BYTE = 12;\r
+       private static final int WRITE_SCALAR_2BYTES = 13;\r
+       private static final int WRITE_SCALAR_BYTES = 14;\r
+       private static final int WRITE_SCALAR_HEADER = 15;\r
+       private static final int WRITE_SCALAR_STRING = 16;\r
+       private static final int WRITE_SCALAR_PADDED_STRING = 17;\r
+       private static final int WRITE_SCALAR_PADDED_BYTES = 18;\r
+       private static final int WRITE_SHORT = 19;\r
+       private static final int WRITE_INT = 20;\r
+       private static final int WRITE_LONG = 21;\r
+       private static final int WRITE_FLOAT = 22;\r
+       private static final int WRITE_DOUBLE = 23;\r
+       private static final int READ_REPLY_DSS = 24;\r
+       private static final int READ_LENGTH_AND_CODEPOINT = 25;\r
+       private static final int READ_CODEPOINT = 26;\r
+       private static final int MARK_COLLECTION = 27;\r
+       private static final int GET_CODEPOINT = 28;\r
+       private static final int READ_BYTE = 29;\r
+       private static final int READ_NETWORK_SHORT = 30;\r
+       private static final int READ_SHORT = 31;\r
+       private static final int READ_NETWORK_INT = 32;\r
+       private static final int READ_INT = 33;\r
+       private static final int READ_LONG = 34;\r
+       private static final int READ_BOOLEAN = 35;\r
+       private static final int READ_STRING = 36;\r
+       private static final int READ_BYTES = 37;\r
+       private static final int FLUSH = 38;\r
+       private static final int DISPLAY = 39;\r
+       private static final int CHECKERROR = 40;\r
+       private static final int RESET = 41;\r
+       private static final int CREATE_DSS_REPLY = 42;\r
+       private static final int SKIP_DSS = 43;\r
+       private static final int READ_SCALAR_2BYTES = 44;\r
+       private static final int READ_SCALAR_1BYTE = 45;\r
+       private static final int END_TEST = 46;\r
+       private static final int SKIP_DDM = 47;\r
+       private static final int INCLUDE = 48;\r
+       private static final int SKIP_BYTES = 49;\r
+       private static final int WRITE_PADDED_STRING = 50;\r
+       private static final int WRITE_STRING = 51;\r
+       private static final int WRITE_ENCODED_STRING = 52;\r
+       private static final int WRITE_ENCODED_LDSTRING = 53;\r
+       private static final int CHECK_SQLCARD = 54;\r
+       private static final int MORE_DATA = 55;\r
+       private static final int COMPLETE_TEST = 56;\r
+    private static final int READ_SECMEC_SECCHKCD = 57;\r
+\r
+       private static final String MULTIVAL_START = "MULTIVALSTART";\r
+       private static final String MULTIVAL_SEP = "SEP";\r
+       private static final String MULTIVAL_END = "MULTIVALEND";\r
+       // initialize hash tables\r
+       static {\r
+                       init();\r
+                       }\r
+\r
+\r
+       private Socket monitorSocket = null;\r
+       private InputStream monitorIs = null;\r
+       private OutputStream monitorOs = null;\r
+       private DDMWriter writer = new DDMWriter(ccsidManager, null, null);\r
+       private DDMReader reader;\r
+       private boolean failed = false;\r
+       private StreamTokenizer tkn;\r
+       private String current_filename;\r
+    private int port;\r
+\r
+       // constructors\r
+    public TestProto(String filename, int port) \r
+    {\r
+               current_filename = filename;\r
+        this.port = port;\r
+               getConnection();\r
+\r
+               try \r
+               {\r
+                       reader = new DDMReader(ccsidManager, monitorIs);\r
+                       processFile(filename);\r
+               }\r
+               catch (Exception e)\r
+               {\r
+                       int line = 0;\r
+                       if (tkn != null)\r
+                               line = tkn.lineno();\r
+                       System.err.println("Unexpected exception in line " + line + " file: " + current_filename);\r
+                       e.printStackTrace();\r
+               }\r
+               finally\r
+               {\r
+                       closeConnection();\r
+               }\r
+    }\r
+\r
+       /**\r
+        * Process include file\r
+        *\r
+        * @exception   IOException, DRDAProtocolException      error reading file or protocol\r
+        */\r
+       private void processIncludeFile()\r
+               throws IOException, DRDAProtocolException\r
+       {\r
+               String fileName = getString();\r
+               StreamTokenizer saveTkn = tkn;\r
+               processFile(fileName);\r
+               tkn = saveTkn;\r
+       }\r
+       /**\r
+        * Process a command file\r
+        *\r
+        * @param  filename\r
+        * @exception   IOException, DRDAProtocolException      error reading file or protocol\r
+        */\r
+       private void processFile(String filename)\r
+               throws IOException, DRDAProtocolException\r
+       {\r
+               String prev_filename = current_filename;\r
+               current_filename = filename;\r
+               String hostName=getHostName();\r
+               BufferedReader fr;\r
+        try {\r
+                       fr = new BufferedReader(new InputStreamReader(new FileInputStream(filename),"UTF-8"));\r
+               } catch (FileNotFoundException fnfe) {\r
+                       // if useprocess=false & we're running in a suite, \r
+                       // the location is different, try it\r
+                       String userdir =  System.getProperty("user.dir");\r
+                       String sep =  System.getProperty("file.separator");\r
+                       fr = new BufferedReader (new InputStreamReader(new FileInputStream(userdir + sep + filename),"UTF-8"));\r
+               }\r
+               tkn = new StreamTokenizer(fr);\r
+               int val;\r
+               while ( (val = tkn.nextToken()) != StreamTokenizer.TT_EOF)\r
+               {\r
+                       switch(val)\r
+                       {\r
+                               case StreamTokenizer.TT_NUMBER:\r
+                                       break;\r
+                               case StreamTokenizer.TT_WORD:\r
+                                       processCommand();\r
+                                       break;\r
+                               case StreamTokenizer.TT_EOL:\r
+                                       break;\r
+                       }\r
+               }\r
+               current_filename = prev_filename;\r
+       }\r
+       /**\r
+        * Set up a connection to the Network server\r
+        */\r
+       private void getConnection() \r
+       {\r
+        String hostName=getHostName();\r
+               try {\r
+            monitorSocket = new Socket(hostName, port);\r
+        } catch (UnknownHostException e) {\r
+            System.err.println("Don't know about host: " + hostName);\r
+            System.exit(1);\r
+        } catch (IOException e) {\r
+            System.err.println("Couldn't get I/O for the connection to: " + hostName);\r
+            System.exit(1);\r
+        }\r
+        try\r
+        {\r
+              monitorIs = monitorSocket.getInputStream();\r
+              monitorOs = monitorSocket.getOutputStream();\r
+               }\r
+               catch (IOException e)\r
+        {\r
+            System.err.println("Couldn't get I/O for the connection to: " + hostName);\r
+            System.exit(1);\r
+        }\r
+       }\r
+       /**\r
+        * Close connection to the network server\r
+        */\r
+       private void closeConnection()\r
+       {\r
+               try {\r
+                       monitorIs.close();\r
+                       monitorOs.close();\r
+                       monitorSocket.close();\r
+               }\r
+               catch (Exception e) {} //Ignore exceptions when closing the connection\r
+       }\r
+       /**\r
+        * Reset connection for another test\r
+        */\r
+       private void reset()\r
+       {\r
+               closeConnection();\r
+               getConnection();\r
+               reader.initialize(monitorIs);\r
+               writer.reset(null);\r
+       }\r
+       /**\r
+        * finish by cleaning up the last connection\r
+        */\r
+       private void completeTest()\r
+       {\r
+               closeConnection();\r
+       }\r
+       /**\r
+        * Initialize hashtable for commands and set up a table to translate from\r
+        * the codepoint name to the codepoint value\r
+        */\r
+       private static void init()\r
+       {\r
+               commandTable.put("createdssrequest", new Integer(CREATE_DSS_REQUEST));\r
+               commandTable.put("createdssobject", new Integer(CREATE_DSS_OBJECT));\r
+               commandTable.put("createdssreply", new Integer(CREATE_DSS_REPLY));\r
+               commandTable.put("enddss", new Integer(END_DSS));\r
+               commandTable.put("enddss", new Integer(END_DSS));\r
+               commandTable.put("endddmanddss", new Integer(END_DDM_AND_DSS));\r
+               commandTable.put("startddm", new Integer(START_DDM));\r
+               commandTable.put("endddm", new Integer(END_DDM));\r
+               commandTable.put("writebyte", new Integer(WRITE_BYTE));\r
+               commandTable.put("writenetworkshort", new Integer(WRITE_NETWORK_SHORT));\r
+               commandTable.put("writenetworkint", new Integer(WRITE_NETWORK_INT));\r
+               commandTable.put("writebytes", new Integer(WRITE_BYTES));\r
+               commandTable.put("writecodepoint4bytes", new Integer(WRITE_CODEPOINT_4BYTES));\r
+               commandTable.put("writescalar1byte", new Integer(WRITE_SCALAR_1BYTE));\r
+               commandTable.put("writescalar2bytes", new Integer(WRITE_SCALAR_2BYTES));\r
+               commandTable.put("writescalarbytes", new Integer(WRITE_SCALAR_BYTES));\r
+               commandTable.put("writescalarheader", new Integer(WRITE_SCALAR_HEADER));\r
+               commandTable.put("writescalarstring", new Integer(WRITE_SCALAR_STRING));\r
+               commandTable.put("writescalarpaddedstring", new Integer(WRITE_SCALAR_PADDED_STRING));\r
+               commandTable.put("writescalarpaddedbytes", new Integer(WRITE_SCALAR_PADDED_BYTES));\r
+               commandTable.put("writeshort", new Integer(WRITE_SHORT));\r
+               commandTable.put("writeint", new Integer(WRITE_INT));\r
+               commandTable.put("writelong", new Integer(WRITE_LONG));\r
+               commandTable.put("writefloat", new Integer(WRITE_FLOAT));\r
+               commandTable.put("writedouble", new Integer(WRITE_DOUBLE));\r
+               commandTable.put("readreplydss", new Integer(READ_REPLY_DSS));\r
+               commandTable.put("readlengthandcodepoint", new Integer(READ_LENGTH_AND_CODEPOINT));\r
+               commandTable.put("readcodepoint", new Integer(READ_CODEPOINT));\r
+               commandTable.put("markcollection", new Integer(MARK_COLLECTION));\r
+               commandTable.put("getcodepoint", new Integer(GET_CODEPOINT));\r
+               commandTable.put("readbyte", new Integer(READ_BYTE));\r
+               commandTable.put("readnetworkshort", new Integer(READ_NETWORK_SHORT));\r
+               commandTable.put("readshort", new Integer(READ_SHORT));\r
+               commandTable.put("readint", new Integer(READ_INT));\r
+               commandTable.put("readlong", new Integer(READ_LONG));\r
+               commandTable.put("readboolean", new Integer(READ_BOOLEAN));\r
+               commandTable.put("readstring", new Integer(READ_STRING));\r
+               commandTable.put("readbytes", new Integer(READ_BYTES));\r
+               commandTable.put("flush", new Integer(FLUSH));\r
+               commandTable.put("display", new Integer(DISPLAY));\r
+               commandTable.put("checkerror", new Integer(CHECKERROR));\r
+               commandTable.put("reset", new Integer(RESET));\r
+               commandTable.put("skipdss", new Integer(SKIP_DSS));\r
+               commandTable.put("skipddm", new Integer(SKIP_DDM));\r
+               commandTable.put("readscalar2bytes", new Integer(READ_SCALAR_2BYTES));\r
+               commandTable.put("readscalar1byte", new Integer(READ_SCALAR_1BYTE));\r
+               commandTable.put("endtest", new Integer(END_TEST));\r
+               commandTable.put("include", new Integer(INCLUDE));\r
+               commandTable.put("skipbytes", new Integer(SKIP_BYTES));\r
+               commandTable.put("writepaddedstring", new Integer(WRITE_PADDED_STRING));\r
+               commandTable.put("writestring", new Integer(WRITE_STRING));\r
+               commandTable.put("writeencodedstring", new Integer(WRITE_ENCODED_STRING));\r
+               commandTable.put("writeencodedldstring", new Integer(WRITE_ENCODED_LDSTRING));\r
+               commandTable.put("checksqlcard", new Integer(CHECK_SQLCARD));\r
+               commandTable.put("moredata", new Integer(MORE_DATA));\r
+               commandTable.put("completetest", new Integer(COMPLETE_TEST));\r
+        commandTable.put("readsecmecandsecchkcd", new Integer(READ_SECMEC_SECCHKCD));\r
+               \r
+               Integer key;\r
+               for (Enumeration e = codePointNameTable.keys(); e.hasMoreElements(); )\r
+               {\r
+                       key = (Integer)e.nextElement();\r
+                       codePointValueTable.put(codePointNameTable.get(key), key);\r
+               }\r
+               \r
+       }\r
+       /**\r
+        * Process a command\r
+        */\r
+       private void processCommand()\r
+               throws IOException, DRDAProtocolException\r
+       {\r
+               Integer icmd  = (Integer)commandTable.get(tkn.sval.toLowerCase(Locale.ENGLISH));\r
+               if (icmd == null)\r
+               {\r
+                       System.err.println("Unknown command, " + tkn.sval + " in line " +\r
+                               tkn.lineno());\r
+                       System.exit(1);\r
+               }\r
+               int cmd  = icmd.intValue();\r
+               int codepoint;\r
+               int val;\r
+               int reqVal;\r
+               String str;\r
+\r
+               switch (cmd)\r
+               {\r
+                       case INCLUDE:\r
+                               processIncludeFile();\r
+                               break;\r
+                       case CREATE_DSS_REQUEST:\r
+                               writer.createDssRequest();\r
+                               break;\r
+                       case CREATE_DSS_OBJECT:\r
+                               writer.createDssObject();\r
+                               break;\r
+                       case CREATE_DSS_REPLY:\r
+                               writer.createDssReply();\r
+                               break;\r
+                       case END_DSS:\r
+                               tkn.nextToken();\r
+                               tkn.pushBack();\r
+                               if ((tkn.sval != null) && tkn.sval.startsWith("0x"))\r
+                               // use specified chaining.\r
+                                       writer.endDss((getBytes())[0]);\r
+                               else\r
+                               // use default chaining\r
+                                       writer.endDss();\r
+                               break;\r
+                       case END_DDM:\r
+                               writer.endDdm();\r
+                               break;\r
+                       case END_DDM_AND_DSS:\r
+                               writer.endDdmAndDss();\r
+                               break;\r
+                       case START_DDM:\r
+                               writer.startDdm(getCP());\r
+                               break;\r
+                       case WRITE_SCALAR_STRING:\r
+                               writer.writeScalarString(getCP(), getString());\r
+                               break;\r
+                       case WRITE_SCALAR_2BYTES:\r
+                               writer.writeScalar2Bytes(getCP(),getIntOrCP());\r
+                               break;\r
+                       case WRITE_SCALAR_1BYTE:\r
+                               writer.writeScalar1Byte(getCP(),getInt());\r
+                               break;\r
+                       case WRITE_SCALAR_BYTES:\r
+                               writer.writeScalarBytes(getCP(),getBytes());\r
+                               break;\r
+                       case WRITE_SCALAR_PADDED_BYTES:\r
+                               writer.writeScalarPaddedBytes(getCP(), getBytes(), getInt(),\r
+                                       ccsidManager.space);\r
+                               break;\r
+                       case WRITE_BYTE:\r
+                               writer.writeByte(getInt());\r
+                               break;\r
+                       case WRITE_BYTES:\r
+                               writer.writeBytes(getBytes());\r
+                               break;\r
+                       case WRITE_SHORT:\r
+                               writer.writeShort(getInt());\r
+                               break;\r
+                       case WRITE_INT:\r
+                               writer.writeInt(getInt());\r
+                               break;\r
+                       case WRITE_CODEPOINT_4BYTES:\r
+                               writer.writeCodePoint4Bytes(getCP(), getInt());\r
+                               break;\r
+                       case WRITE_STRING:\r
+                               str = getString();\r
+                               writer.writeBytes(getEBCDIC(str));\r
+                               break;\r
+                       case WRITE_ENCODED_STRING:\r
+                               writeEncodedString(getString(), getString());\r
+                               break;\r
+                       case WRITE_ENCODED_LDSTRING:\r
+                               writeEncodedLDString(getString(), getString(), getInt());\r
+                               break;\r
+                       case WRITE_PADDED_STRING:\r
+                               str = getString();\r
+                               writer.writeBytes(getEBCDIC(str));\r
+                               int reqLen = getInt();\r
+                               int strLen = str.length();\r
+                               if (strLen < reqLen)\r
+                                       writer.padBytes(ccsidManager.space, reqLen-strLen);\r
+                               break;\r
+                       case READ_REPLY_DSS:\r
+                               reader.readReplyDss();\r
+                               break;\r
+                       case SKIP_DSS:\r
+                               skipDss();\r
+                               break;\r
+                       case SKIP_DDM:\r
+                               skipDdm();\r
+                               break;\r
+                       case MORE_DATA:\r
+                               boolean expbool;\r
+                               str = getString();\r
+                               if (str.equalsIgnoreCase("true"))\r
+                                       expbool = true;\r
+                               else\r
+                                       expbool = false;\r
+                               if (reader.moreData() && expbool == false )\r
+                                       fail("Failed - more data left");\r
+                               if (!reader.moreData() && expbool == true )\r
+                                       fail("Failed - no data left");\r
+                               break;\r
+                       case READ_LENGTH_AND_CODEPOINT:\r
+                               readLengthAndCodePoint();\r
+                               break;\r
+                       case READ_SCALAR_2BYTES:\r
+                               readLengthAndCodePoint();\r
+                               val = reader.readNetworkShort();\r
+                               checkIntOrCP(val);\r
+                               break;\r
+                       case READ_SCALAR_1BYTE:\r
+                               readLengthAndCodePoint();\r
+                               val = reader.readByte();\r
+                               checkIntOrCP(val);\r
+                               break;\r
+            case READ_SECMEC_SECCHKCD:\r
+                readSecMecAndSECCHKCD();\r
+                break;\r
+                       case READ_BYTES:\r
+                               byte[] byteArray = reader.readBytes();\r
+                               byte[] reqArray = getBytes();\r
+                               if (byteArray.length != reqArray.length)\r
+                                               fail("Failed - byte array didn't match");\r
+                               for (int i = 0; i < byteArray.length; i++)\r
+                                       if (byteArray[i] != reqArray[i])\r
+                                               fail("Failed - byte array didn't match");\r
+                               break;\r
+                       case READ_NETWORK_SHORT:\r
+                               val = reader.readNetworkShort();\r
+                               checkIntOrCP(val);\r
+                               break;\r
+                       case FLUSH:\r
+                               writer.finalizeChain(reader.getCurrChainState(), monitorOs);\r
+                               writer.reset(null);\r
+                               break;\r
+                       case DISPLAY:\r
+                               System.out.println(getString());\r
+                               break;\r
+                       case CHECKERROR:\r
+                               checkError();\r
+                               break;\r
+                       case CHECK_SQLCARD:\r
+                               checkSQLCARD(getInt(), getString());\r
+                               break;\r
+                       case COMPLETE_TEST:\r
+                               completeTest();\r
+                               break;\r
+                       case END_TEST:\r
+                               // print that we passed the test if we haven't failed\r
+                               if (failed == false)\r
+                                       System.out.println("PASSED");\r
+                               failed = false;\r
+                               reset();\r
+                               break;\r
+                       case RESET:\r
+                               reset();\r
+                               break;\r
+                       case SKIP_BYTES:\r
+                               reader.skipBytes();\r
+                               break;\r
+                       default:\r
+                               System.out.println("unknown command in line " + tkn.lineno());\r
+                               // skip remainder of line\r
+                               while (tkn.nextToken() !=  StreamTokenizer.TT_EOL)\r
+                                               ;\r
+       \r
+               }\r
+       }\r
+       /**\r
+        * Skip a DSS communication \r
+        */\r
+       private void skipDss() throws DRDAProtocolException\r
+       {\r
+               reader.readReplyDss();\r
+               reader.skipDss();\r
+       }\r
+       /**\r
+        * Skip the a Ddm communication\r
+        */\r
+       private void skipDdm() throws DRDAProtocolException\r
+       {\r
+               reader.readLengthAndCodePoint( false );\r
+               reader.skipBytes();\r
+       }\r
+       /**\r
+        * Read an int from the command file\r
+        * Negative numbers are preceded by "-"\r
+        */\r
+       private int getInt() throws IOException\r
+       {\r
+               int mult = 1;\r
+               int val = tkn.nextToken();\r
+               if (tkn.sval != null && tkn.sval.equals("-"))\r
+               {\r
+                       mult = -1;\r
+                       val = tkn.nextToken();\r
+               }\r
+\r
+               if (val != StreamTokenizer.TT_NUMBER)\r
+               {\r
+                       if (tkn.sval == null)\r
+                       {\r
+                               System.err.println("Invalid string on line " + tkn.lineno());\r
+                               System.exit(1);\r
+                       }\r
+                       String str = tkn.sval.toLowerCase(Locale.ENGLISH);\r
+                       if (!str.startsWith("0x"))\r
+                       {\r
+                               System.err.println("Expecting number, got " + tkn.sval + " on line " + tkn.lineno());\r
+                               System.exit(1);\r
+                       }\r
+                       else\r
+                               return convertHex(str);\r
+               }\r
+               return (new Double(tkn.nval).intValue() * mult);\r
+       }\r
+       /**\r
+        * Convert a token in hex format to int from the command file\r
+        */\r
+       private int convertHex(String str) throws IOException\r
+       {\r
+               int retval = 0;\r
+               int len = str.length(); \r
+               if ((len % 2) == 1 || len > 10)\r
+               {\r
+                       System.err.println("Invalid length for byte string, " + len + \r
+                       " on line " + tkn.lineno());\r
+                       System.exit(1);\r
+               }\r
+               for (int i = 2; i < len; i++)\r
+               {\r
+                       retval = retval << 4;\r
+                       retval += Byte.valueOf(str.substring(i, i+1), 16).byteValue();\r
+               }\r
+               return retval;\r
+       }\r
+\r
+       /**\r
+        * checks if value matches next int or cp.  \r
+        * Handles multiple legal values in protocol test file\r
+        * FORMAT for Multiple Values \r
+        * MULTIVALSTART 10 SEP 32 SEP 40 MULTIVALEND\r
+        **/\r
+       private boolean checkIntOrCP(int val)  throws IOException\r
+       {\r
+               boolean rval = false;\r
+               int tknType  = tkn.nextToken();\r
+               String reqVal = " ";\r
+\r
+               \r
+               if (tknType == StreamTokenizer.TT_WORD && tkn.sval.trim().equals(MULTIVAL_START))\r
+               {\r
+                       do {\r
+                               int nextVal = getIntOrCP();\r
+                               reqVal = reqVal + nextVal + " ";\r
+                               // System.out.println("Checking MULTIVAL (" + val + "==" + nextVal + ")");\r
+                               rval = rval || (val == nextVal);\r
+                               tkn.nextToken();\r
+                       }\r
+                       while(tkn.sval.trim().equals(MULTIVAL_SEP));\r
+                       \r
+                       if (! (tkn.sval.trim().equals(MULTIVAL_END)))\r
+                               fail("Invalid test file format requires " + MULTIVAL_END + \r
+                                        " got: " + tkn.sval);\r
+                       \r
+               }\r
+               else\r
+               {\r
+                       tkn.pushBack();\r
+                       int nextVal = getIntOrCP();\r
+                       reqVal = " " + nextVal;\r
+                       // System.out.println("Checking Single Value (" + val + "==" + nextVal + ")");\r
+                       rval = (val == nextVal);\r
+               }\r
+               if (rval == false)\r
+                       fail("Failed - wrong val = " + val + " Required Value: " + reqVal);\r
+\r
+               return rval;\r
+       }\r
+\r
+\r
+       /**\r
+        * Read an int or codepoint - codepoint is given as a string\r
+        */\r
+       private int getIntOrCP() throws IOException\r
+       {\r
+               int val = tkn.nextToken();\r
+               if (val == StreamTokenizer.TT_NUMBER)\r
+               {\r
+                       return new Double(tkn.nval).intValue();\r
+               }\r
+               else if (val == StreamTokenizer.TT_WORD)\r
+               {\r
+                       return decodeCP(tkn.sval);\r
+               }\r
+               else\r
+               {\r
+                       fail("Expecting number, got " + tkn.sval + " on line "\r
+                                                          + tkn.lineno());\r
+                       System.exit(1);\r
+               }\r
+               return 0;\r
+       }\r
+       /**\r
+        * Read an array of bytes from the command file\r
+        * A byte string can start with 0x in which case the bytes are interpreted\r
+        * in hex format or it can just be a string, in which case each char is\r
+        * interpreted as  2 byte UNICODE\r
+        *\r
+        * @return byte array\r
+        */\r
+       private byte []  getBytes() throws IOException\r
+       {\r
+               byte[] retval = null;\r
+               int val = tkn.nextToken();\r
+               if (tkn.sval == null)\r
+               {\r
+                       System.err.println("Invalid string on line " + tkn.lineno());\r
+                       System.exit(1);\r
+               }\r
+               String str = tkn.sval.toLowerCase(Locale.ENGLISH);\r
+               if (!str.startsWith("0x"))\r
+               {\r
+                       //just convert the string to ebcdic byte array\r
+                       return ccsidManager.convertFromUCS2(str);\r
+               }\r
+               else\r
+               {\r
+                       int len = str.length(); \r
+                       if ((len % 2) == 1)\r
+                       {\r
+                               System.err.println("Invalid length for byte string, " + len + \r
+                               " on line " + tkn.lineno());\r
+                               System.exit(1);\r
+                       }\r
+                       retval = new byte[(len-2)/2]; \r
+                       int j = 0;\r
+                       for (int i = 2; i < len; i+=2, j++)\r
+                       {\r
+                               retval[j] = (byte)(Byte.valueOf(str.substring(i, i+1), 16).byteValue() << 4);\r
+                               retval[j] += Byte.valueOf(str.substring(i+1, i+2), 16).byteValue();\r
+                       }\r
+               }\r
+               return retval;\r
+       }\r
+       /**\r
+        * Read a string from the command file\r
+        *\r
+        * @return string found in file\r
+        * @exception   IOException     error reading file\r
+        */\r
+       private String getString() throws IOException\r
+       {\r
+               int val = tkn.nextToken();\r
+               if (val == StreamTokenizer.TT_NUMBER)\r
+               {\r
+                       System.err.println("Expecting word, got " + tkn.nval + " on line " + tkn.lineno());\r
+                       System.exit(1);\r
+               }\r
+               return tkn.sval;\r
+       }\r
+       /**\r
+        * Read the string version of a CodePoint\r
+        *\r
+        * @exception   IOException     error reading file\r
+        */\r
+       private int getCP() throws IOException\r
+       {\r
+               String strval = getString();\r
+               return decodeCP(strval);\r
+       }\r
+       /**\r
+        * Translate a string codepoint such as ACCSEC to the equivalent int value\r
+        *\r
+        * @param strval        string codepoint\r
+        * @return              integer value of codepoint\r
+        */\r
+       private int decodeCP(String strval) \r
+       {\r
+               Integer cp = (Integer)codePointValueTable.get(strval);\r
+               if (cp == null)\r
+               {\r
+                  System.err.println("Unknown codepoint, "+ strval + " in line " \r
+                               + tkn.lineno());\r
+                  Exception e = new Exception();\r
+                  e.printStackTrace();\r
+                       System.exit(1);\r
+               }\r
+               return cp.intValue();\r
+       }\r
+       /**\r
+        * Print failure message and skip to the next test\r
+        *\r
+        * @exception   IOException     error reading file\r
+        */\r
+       private void fail(String msg) throws IOException\r
+       {\r
+               System.out.println("FAILED - " + msg + " in line " + tkn.lineno());\r
+               // skip remainder of the test look for endtest or end of file\r
+               int val = tkn.nextToken();\r
+               while (val != StreamTokenizer.TT_EOF)\r
+               {\r
+                       if (val == StreamTokenizer.TT_WORD && tkn.sval.toLowerCase(Locale.ENGLISH).equals("endtest"))\r
+                               break;\r
+\r
+                       val = tkn.nextToken();\r
+               }\r
+               failed = true;\r
+               // get ready for next test\r
+               reset();\r
+               // print out stack trace so we know where the failure occurred\r
+               Exception e = new Exception();\r
+               e.printStackTrace();\r
+       }\r
+       /**\r
+        * Check error sent back to application requester\r
+        *\r
+        * @exception   IOException, DRDAProtocolException      error reading file or protocol\r
+        */\r
+       private void checkError() throws IOException, DRDAProtocolException\r
+       {\r
+               int svrcod = 0;\r
+               int invalidCodePoint = 0;\r
+               int prccnvcd = 0;\r
+               int synerrcd = 0;\r
+               int codepoint;\r
+               int reqVal;\r
+               Vector manager = new Vector(), managerLevel = new Vector() ;\r
+               reader.readReplyDss();\r
+               int error = reader.readLengthAndCodePoint( false );\r
+               int reqCP = getCP();\r
+               if (error != reqCP)\r
+               {\r
+                       cpError(error, reqCP);\r
+                       return;\r
+               }\r
+               while (reader.moreDssData())\r
+               {\r
+                       codepoint = reader.readLengthAndCodePoint( false );\r
+                       switch (codepoint)\r
+                       {\r
+                               case CodePoint.SVRCOD:\r
+                                       svrcod = reader.readNetworkShort();\r
+                                       break;\r
+                               case CodePoint.CODPNT:\r
+                                       invalidCodePoint = reader.readNetworkShort();\r
+                                       break;\r
+                               case CodePoint.PRCCNVCD:\r
+                                       prccnvcd = reader.readByte();\r
+                                       break;\r
+                               case CodePoint.SYNERRCD:\r
+                                       synerrcd = reader.readByte();\r
+                                       break;\r
+                               case CodePoint.MGRLVLLS:\r
+                                       while (reader.moreDdmData())\r
+                                       {\r
+                                               manager.addElement(new Integer(reader.readNetworkShort()));\r
+                                               managerLevel.addElement(new Integer(reader.readNetworkShort()));\r
+                                       }\r
+                                       break;\r
+                               default:\r
+                                       //ignore codepoints we don't understand\r
+                                       reader.skipBytes();\r
+       \r
+                       }\r
+               }\r
+               reqVal = getInt();\r
+               if (svrcod != reqVal)\r
+               {\r
+                       fail("wrong svrcod val = " + Integer.toHexString(svrcod)\r
+                                       + ", required val = " + Integer.toHexString(reqVal));\r
+                       return;\r
+               }\r
+               if (error == CodePoint.PRCCNVRM)\r
+               {\r
+                       reqVal = getInt();\r
+                       if (prccnvcd != reqVal)\r
+                       {\r
+                               fail("wrong prccnvd, val = " + Integer.toHexString(prccnvcd)\r
+                                       + ", required val = " + Integer.toHexString(reqVal));\r
+                               return;\r
+                       }\r
+               }\r
+               if (error == CodePoint.SYNTAXRM)\r
+               {\r
+                       reqVal = getInt();\r
+                       if (synerrcd != reqVal)\r
+                       {\r
+                               fail("wrong synerrcd, val = " + Integer.toHexString(synerrcd)\r
+                                       + ", required val = " + Integer.toHexString(reqVal));\r
+                               return;\r
+                       }\r
+                       reqVal = getIntOrCP();\r
+                       if (invalidCodePoint != reqVal)\r
+                       {\r
+                               cpError(invalidCodePoint, reqVal);\r
+                               return;\r
+                       }\r
+               }\r
+               if (error == CodePoint.MGRLVLRM)\r
+               {\r
+                       int mgr, mgrLevel;\r
+                       for (int i = 0; i < manager.size(); i++)\r
+                       {\r
+                               reqVal = getCP();\r
+                               mgr = ((Integer)(manager.elementAt(i))).intValue();\r
+                               if (mgr != reqVal)\r
+                               {\r
+                                       cpError(mgr, reqVal);\r
+                                       return;\r
+                               }\r
+                               mgrLevel = ((Integer)(managerLevel.elementAt(i))).intValue();\r
+                               reqVal = getInt();\r
+                               if (mgrLevel != reqVal)\r
+                               {\r
+                                       fail("wrong manager level, level = " + Integer.toHexString(mgrLevel)\r
+                                       + ", required val = " + Integer.toHexString(reqVal));\r
+                                       return;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       /**\r
+        * Read length and codepoint and check against required values\r
+        *\r
+        * @exception   IOException, DRDAProtocolException      error reading file or protocol\r
+        */\r
+       private void readLengthAndCodePoint() throws IOException, DRDAProtocolException\r
+       {\r
+               int codepoint = reader.readLengthAndCodePoint( false );\r
+               int reqCP = getCP();\r
+               if (codepoint != reqCP)\r
+                       cpError(codepoint, reqCP);\r
+       }\r
+    \r
+    /**\r
+     * Handle the case of testing the reading of SECMEC and SECCHKCD, \r
+     * where on an invalid SECMEC value for ACCSEC, the server can send \r
+     * valid supported SECMEC values. One of the valid supported value can be \r
+     * EUSRIDPWD (secmec value of 9) depending on if the server JVM \r
+     * can actually support it or not.\r
+     * @exception   IOException, DRDAProtocolException  error reading file or protocol\r
+     */\r
+    private void readSecMecAndSECCHKCD() throws IOException, DRDAProtocolException\r
+    {\r
+        int codepoint;\r
+        boolean notDone = true;\r
+        int val = -1;\r
+        do\r
+        {\r
+            codepoint = reader.readLengthAndCodePoint( false );\r
+            switch(codepoint)\r
+            {\r
+              case CodePoint.SECMEC:\r
+              {\r
+                  System.out.print("SECMEC=");\r
+                  val = reader.readNetworkShort();\r
+                  System.out.print(val+" ");\r
+              }\r
+              break;\r
+              case CodePoint.SECCHKCD:\r
+              {\r
+                  System.out.print("SECCHKCD=");\r
+                  val = reader.readByte();\r
+                  System.out.println(val);\r
+                  notDone = false;\r
+              }\r
+              break;\r
+              default:\r
+                  notDone=false;\r
+            }\r
+        }while(notDone);\r
+    }\r
+\r
+    \r
+       /**\r
+        * Codepoint error\r
+        *\r
+        * @exception IOException error reading command file\r
+        */\r
+       private void cpError(int cp, int reqCP) throws IOException\r
+       {\r
+               String cpName = codePointNameTable.lookup(cp);\r
+               String reqCPName = codePointNameTable.lookup(reqCP);\r
+               fail("wrong codepoint val = " + Integer.toHexString(cp) + \r
+                        "("+cpName+")" +\r
+                        ", required codepoint = " + Integer.toHexString(reqCP) +\r
+                        "("+reqCPName+")");\r
+       }\r
+       /**\r
+        * Translate a string to EBCDIC for use in the protocol\r
+        *\r
+        * @param str   string to transform\r
+        * @return EBCDIC string\r
+        */\r
+       private byte[] getEBCDIC(String str)\r
+       {\r
+               byte [] buf = new byte[str.length()];\r
+               ccsidManager.convertFromUCS2(str, buf, 0);\r
+               return buf;\r
+       }\r
+       /**\r
+        * Write an encoded string\r
+        *\r
+        * @param str   string to write\r
+        * @param encoding      Java encoding to use\r
+        * @exception IOException\r
+        */\r
+       private void writeEncodedString(String str, String encoding)\r
+               throws IOException\r
+       {\r
+               try {\r
+                       byte [] buf = str.getBytes(encoding);\r
+                       writer.writeBytes(buf);\r
+               } catch (UnsupportedEncodingException e) {\r
+                       fail("Unsupported encoding " + encoding);       \r
+               }\r
+       }\r
+       /**\r
+        * Write length and encoded string\r
+        *\r
+        * @param str string to write\r
+        * @param encoding      Java encoding to use\r
+        * @param len                   Size of length value (2 or 4 bytes)\r
+        * @exception IOException\r
+        */\r
+       private void writeEncodedLDString(String str, String encoding, int len)\r
+               throws IOException\r
+       {\r
+               try {\r
+                       byte [] buf = str.getBytes(encoding);\r
+                       if (len == 2)\r
+                               writer.writeShort(buf.length);\r
+                       else\r
+                               writer.writeInt(buf.length);\r
+                       writer.writeBytes(buf);\r
+               } catch (UnsupportedEncodingException e) {\r
+                       fail("Unsupported encoding " + encoding);       \r
+               }\r
+       }\r
+       /**\r
+        * Check the value of SQLCARD\r
+        *\r
+        * @param sqlCode       SQLCODE value\r
+        * @param sqlState      SQLSTATE value\r
+        * @exception IOException, DRDAProtocolException\r
+        */\r
+       private void checkSQLCARD(int sqlCode, String sqlState)\r
+               throws IOException, DRDAProtocolException\r
+       {\r
+               reader.readReplyDss();\r
+               int codepoint = reader.readLengthAndCodePoint( false );\r
+               if (codepoint != CodePoint.SQLCARD)\r
+               {\r
+                       fail("Expecting SQLCARD got "+ Integer.toHexString(codepoint));\r
+                       return;\r
+               }\r
+               int nullind = reader.readByte();\r
+               //cheating here and using readNetworkInt since the byteorder is the same\r
+               int code = reader.readNetworkInt();\r
+               if (code != sqlCode)\r
+               {\r
+                       fail("Expecting sqlCode " + sqlCode + " got "+ Integer.toHexString(code));\r
+                       return;\r
+               }\r
+               String state = reader.readString(5, "UTF-8");\r
+               if (!state.equals(sqlState))\r
+               {\r
+                       fail("Expecting sqlState " + sqlState + " got "+ state);\r
+                       return;\r
+               }\r
+               // skip the rest of the SQLCARD\r
+               reader.skipBytes();\r
+       }\r
+\r
+       private static String getHostName()\r
+       {\r
+               String hostName = (System.getProperty("hostName"));\r
+               if (hostName == null)\r
+                       hostName="localhost";\r
+               return hostName;\r
+       }\r
+}\r