|
33 | 33 | import static oracle.nosql.driver.util.LogUtil.logTrace; |
34 | 34 | import static oracle.nosql.driver.util.LogUtil.logWarning; |
35 | 35 |
|
| 36 | +import java.io.DataOutputStream; |
| 37 | +import java.io.FileOutputStream; |
36 | 38 | import java.io.IOException; |
37 | 39 | import java.net.URL; |
38 | 40 | import java.util.HashSet; |
39 | 41 | import java.util.Iterator; |
40 | 42 | import java.util.Map; |
| 43 | +import java.util.Properties; |
41 | 44 | import java.util.concurrent.ConcurrentHashMap; |
42 | 45 | import java.util.concurrent.ConcurrentLinkedQueue; |
43 | 46 | import java.util.concurrent.ExecutionException; |
@@ -216,6 +219,9 @@ public class Client { |
216 | 219 |
|
217 | 220 | private volatile TopologyInfo topology; |
218 | 221 |
|
| 222 | + /* for internal testing */ |
| 223 | + private final String prepareFilename; |
| 224 | + |
219 | 225 | public Client(Logger logger, |
220 | 226 | NoSQLHandleConfig httpConfig) { |
221 | 227 |
|
@@ -300,6 +306,9 @@ public Client(Logger logger, |
300 | 306 | } else { |
301 | 307 | this.userAgent = HttpConstants.userAgent; |
302 | 308 | } |
| 309 | + |
| 310 | + /* for internal testing */ |
| 311 | + prepareFilename = System.getProperty("test.preparefilename"); |
303 | 312 | } |
304 | 313 |
|
305 | 314 | /** |
@@ -1245,6 +1254,9 @@ Result processOKResponse(ByteInputStream in, Request kvRequest, |
1245 | 1254 | Serializer ser = kvRequest.createDeserializer(factory); |
1246 | 1255 | if (kvRequest instanceof QueryRequest || |
1247 | 1256 | kvRequest instanceof PrepareRequest) { |
| 1257 | + prepareResponseTestHook(kvRequest, in, |
| 1258 | + serialVersionUsed, |
| 1259 | + queryVersionUsed); |
1248 | 1260 | res = ser.deserialize(kvRequest, |
1249 | 1261 | in, |
1250 | 1262 | serialVersionUsed, |
@@ -1892,4 +1904,60 @@ private synchronized void setTopology(TopologyInfo topo) { |
1892 | 1904 | trace("New topology: " + topo, 1); |
1893 | 1905 | } |
1894 | 1906 | } |
| 1907 | + |
| 1908 | + /* |
| 1909 | + * @hidden |
| 1910 | + * Test hook for collecting prepare responses |
| 1911 | + */ |
| 1912 | + private void prepareResponseTestHook(Request kvReq, |
| 1913 | + ByteInputStream in, |
| 1914 | + short serialVersion, |
| 1915 | + short queryVersion) throws IOException { |
| 1916 | + if (prepareFilename == null || |
| 1917 | + !(kvReq instanceof PrepareRequest) || |
| 1918 | + !(in instanceof NettyByteInputStream)) { |
| 1919 | + return; |
| 1920 | + } |
| 1921 | + int offset = in.getOffset(); |
| 1922 | + try { |
| 1923 | + PrepareRequest pReq = (PrepareRequest) kvReq; |
| 1924 | + NettyByteInputStream nis = (NettyByteInputStream) in; |
| 1925 | + ByteBuf buf = nis.buffer(); |
| 1926 | + int numBytes = buf.readableBytes(); |
| 1927 | + byte[] bytes = new byte[numBytes]; |
| 1928 | + for (int x = 0; x < numBytes; x++) { |
| 1929 | + bytes[x] = in.readByte(); |
| 1930 | + } |
| 1931 | + try (DataOutputStream dos = new DataOutputStream( |
| 1932 | + new FileOutputStream(prepareFilename))) { |
| 1933 | + logFine(logger, "Serializing prepare response to " + |
| 1934 | + prepareFilename); |
| 1935 | + dos.write(bytes, 0, numBytes); |
| 1936 | + } catch (Exception e) { |
| 1937 | + System.err.println("Error writing serialized " + |
| 1938 | + "prepared result: " + e); |
| 1939 | + } |
| 1940 | + /* write statement, etc to properties file */ |
| 1941 | + Properties props = new Properties(); |
| 1942 | + props.setProperty("statement", pReq.getStatement()); |
| 1943 | + props.setProperty("getplan", |
| 1944 | + String.valueOf(pReq.getQueryPlan())); |
| 1945 | + props.setProperty("serialversion", |
| 1946 | + String.valueOf(serialVersion)); |
| 1947 | + props.setProperty("queryversion", |
| 1948 | + String.valueOf(queryVersion)); |
| 1949 | + String fName = prepareFilename + ".props"; |
| 1950 | + try (FileOutputStream fos = new FileOutputStream(fName)) { |
| 1951 | + logFine(logger, "Writing property file " + fName); |
| 1952 | + props.store(fos, ""); |
| 1953 | + } catch (Exception e) { |
| 1954 | + System.err.println("Error writing serialized " + |
| 1955 | + "prepared result: " + e); |
| 1956 | + } |
| 1957 | + } catch (IOException e) { |
| 1958 | + System.err.println("Error writing serialized " + |
| 1959 | + "prepared result: " + e); |
| 1960 | + } |
| 1961 | + in.setOffset(offset); |
| 1962 | + } |
1895 | 1963 | } |
0 commit comments