1 /*
2  *  Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License, version 2.0,
6  *  as published by the Free Software Foundation.
7  *
8  *  This program is also distributed with certain software (including
9  *  but not limited to OpenSSL) that is licensed under separate terms,
10  *  as designated in a particular file or component or in included license
11  *  documentation.  The authors of MySQL hereby grant you an additional
12  *  permission to link the program and your derivative works with the
13  *  separately licensed software that they have included with MySQL.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License, version 2.0, for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
23 */
24 
25 package testsuite.clusterj;
26 
27 import java.sql.PreparedStatement;
28 import java.sql.ResultSet;
29 import java.sql.SQLException;
30 import java.util.List;
31 
32 import testsuite.clusterj.model.IdBase;
33 import testsuite.clusterj.model.VarbinaryTypes;
34 
35 /** Test that Timestamps can be read and written.
36  * case 1: Write using JDBC, read using NDB.
37  * case 2: Write using NDB, read using JDBC.
38  * Schema
39  *
40 drop table if exists varbinarytypes;
41 create table varbinarytypes (
42  id int not null primary key,
43 
44  binary1 varbinary(1),
45  binary2 varbinary(2),
46  binary4 varbinary(4),
47  binary8 varbinary(8),
48  binary16 varbinary(16),
49  binary32 varbinary(32),
50  binary64 varbinary(64),
51  binary128 varbinary(128),
52  binary256 varbinary(256),
53  binary512 varbinary(512),
54  binary1024 varbinary(1024),
55  binary2048 varbinary(2048)
56 
57 ) ENGINE=ndbcluster DEFAULT CHARSET=latin1;
58 
59  */
60 public class VarbinaryTypesTest extends AbstractClusterJModelTest {
61 
62     static int NUMBER_OF_INSTANCES = 10;
63 
64     @Override
getDebug()65     protected boolean getDebug() {
66         return false;
67     }
68 
69     @Override
getNumberOfInstances()70     protected int getNumberOfInstances() {
71         return NUMBER_OF_INSTANCES;
72     }
73 
74     @Override
getTableName()75     protected String getTableName() {
76         return "varbinarytypes";
77     }
78 
79     /** Subclasses override this method to provide the model class for the test */
80     @Override
getModelClass()81     Class<? extends IdBase> getModelClass() {
82         return VarbinaryTypes.class;
83     }
84 
85     /** Subclasses override this method to provide values for rows (i) and columns (j) */
86     @Override
getColumnValue(int i, int j)87     protected Object getColumnValue(int i, int j) {
88         // first calculate the length of the data
89         int length = (int)Math.pow(2, j);
90         byte[] data = new byte[length];
91         // fill in the data, increasing by one for each row, column, and byte in the byte[]
92         for (int d = 0; d < length; ++d) {
93             data[d] = (byte)(i + j + d);
94         }
95         return data;
96     }
97 
98     /** Verify that the actual results match the expected results. If not, use the multiple error
99      * reporting method errorIfNotEqual defined in the superclass.
100      * @param where the location of the verification of results, normally the name of the test method
101      * @param expecteds the expected results
102      * @param actuals the actual results
103      */
104     @Override
verify(String where, List<Object[]> expecteds, List<Object[]> actuals)105     protected void verify(String where, List<Object[]> expecteds, List<Object[]> actuals) {
106         for (int i = 0; i < expecteds.size(); ++i) {
107             Object[] expected = expecteds.get(i);
108             Object[] actual = actuals.get(i);
109             errorIfNotEqual(where + " got failure on id for row " + i, i, actual[0]);
110             for (int j = 1; j < expected.length; ++j) {
111                 // verify each object in the array
112                 byte[] expectedColumn = (byte[])(expected)[j];
113                 byte[] actualColumn = (byte[])(actual)[j];
114                 errorIfNotEqual(where + " got failure on length of data for row " + i,
115                         expectedColumn.length, actualColumn.length);
116                 if (expectedColumn.length == actualColumn.length) {
117                     // now compare byte by byte
118                     for (j = 0; j < expectedColumn.length; ++j)
119                         errorIfNotEqual(where + " got failure on comparison of data for row "
120                                 + i + " column " + j,
121                                 expectedColumn[j], actualColumn[j]);
122                 }
123             }
124         }
125     }
126 
testWriteJDBCReadNDB()127     public void testWriteJDBCReadNDB() {
128         writeJDBCreadNDB();
129         failOnError();
130     }
131 
testWriteNDBReadJDBC()132     public void testWriteNDBReadJDBC() {
133         writeNDBreadJDBC();
134         failOnError();
135    }
136 
137    static ColumnDescriptor binary1 = new ColumnDescriptor
138             ("binary1", new InstanceHandler() {
139         public void setFieldValue(IdBase instance, Object value) {
140             ((VarbinaryTypes)instance).setBinary1((byte[])value);
141         }
142         public Object getFieldValue(IdBase instance) {
143             return ((VarbinaryTypes)instance).getBinary1();
144         }
145         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
146                 throws SQLException {
147             preparedStatement.setBytes(j, (byte[])value);
148         }
149         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
150             return rs.getBytes(j);
151         }
152     });
153 
154    static ColumnDescriptor binary2 = new ColumnDescriptor
155             ("binary2", new InstanceHandler() {
156         public void setFieldValue(IdBase instance, Object value) {
157             ((VarbinaryTypes)instance).setBinary2((byte[])value);
158         }
159         public Object getFieldValue(IdBase instance) {
160             return ((VarbinaryTypes)instance).getBinary2();
161         }
162         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
163                 throws SQLException {
164             preparedStatement.setBytes(j, (byte[])value);
165         }
166         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
167             return rs.getBytes(j);
168         }
169     });
170 
171    static ColumnDescriptor binary4 = new ColumnDescriptor
172             ("binary4", new InstanceHandler() {
173         public void setFieldValue(IdBase instance, Object value) {
174             ((VarbinaryTypes)instance).setBinary4((byte[])value);
175         }
176         public Object getFieldValue(IdBase instance) {
177             return ((VarbinaryTypes)instance).getBinary4();
178         }
179         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
180                 throws SQLException {
181             preparedStatement.setBytes(j, (byte[])value);
182         }
183         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
184             return rs.getBytes(j);
185         }
186     });
187 
188    static ColumnDescriptor binary8 = new ColumnDescriptor
189             ("binary8", new InstanceHandler() {
190         public void setFieldValue(IdBase instance, Object value) {
191             ((VarbinaryTypes)instance).setBinary8((byte[])value);
192         }
193         public Object getFieldValue(IdBase instance) {
194             return ((VarbinaryTypes)instance).getBinary8();
195         }
196         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
197                 throws SQLException {
198             preparedStatement.setBytes(j, (byte[])value);
199         }
200         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
201             return rs.getBytes(j);
202         }
203     });
204 
205     static ColumnDescriptor binary16 = new ColumnDescriptor
206             ("binary16", new InstanceHandler() {
207         public void setFieldValue(IdBase instance, Object value) {
208             ((VarbinaryTypes)instance).setBinary16((byte[])value);
209         }
210         public Object getFieldValue(IdBase instance) {
211             return ((VarbinaryTypes)instance).getBinary16();
212         }
213         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
214                 throws SQLException {
215             preparedStatement.setBytes(j, (byte[])value);
216         }
217         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
218             return rs.getBytes(j);
219         }
220     });
221 
222     static ColumnDescriptor binary32 = new ColumnDescriptor
223             ("binary32", new InstanceHandler() {
224         public void setFieldValue(IdBase instance, Object value) {
225             ((VarbinaryTypes)instance).setBinary32((byte[])value);
226         }
227         public Object getFieldValue(IdBase instance) {
228             return ((VarbinaryTypes)instance).getBinary32();
229         }
230         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
231                 throws SQLException {
232             preparedStatement.setBytes(j, (byte[])value);
233         }
234         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
235             return rs.getBytes(j);
236         }
237     });
238 
239     static ColumnDescriptor binary64 = new ColumnDescriptor
240             ("binary64", new InstanceHandler() {
241         public void setFieldValue(IdBase instance, Object value) {
242             ((VarbinaryTypes)instance).setBinary64((byte[])value);
243         }
244         public Object getFieldValue(IdBase instance) {
245             return ((VarbinaryTypes)instance).getBinary64();
246         }
247         public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
248                 throws SQLException {
249             preparedStatement.setBytes(j, (byte[])value);
250         }
251         public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
252             return rs.getBytes(j);
253         }
254     });
255 
256     static ColumnDescriptor binary128 = new ColumnDescriptor
257         ("binary128", new InstanceHandler() {
258             public void setFieldValue(IdBase instance, Object value) {
259                 ((VarbinaryTypes)instance).setBinary128((byte[])value);
260              }
261              public Object getFieldValue(IdBase instance) {
262                 return ((VarbinaryTypes)instance).getBinary128();
263              }
264              public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
265                     throws SQLException {
266                 preparedStatement.setBytes(j, (byte[])value);
267              }
268              public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
269                 return rs.getBytes(j);
270         }
271     });
272 
273     static ColumnDescriptor binary256 = new ColumnDescriptor
274        ("binary256", new InstanceHandler() {
275            public void setFieldValue(IdBase instance, Object value) {
276                ((VarbinaryTypes)instance).setBinary256((byte[])value);
277             }
278             public Object getFieldValue(IdBase instance) {
279                return ((VarbinaryTypes)instance).getBinary256();
280             }
281             public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
282                    throws SQLException {
283                preparedStatement.setBytes(j, (byte[])value);
284             }
285             public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
286                return rs.getBytes(j);
287         }
288     });
289 
290     static ColumnDescriptor binary512 = new ColumnDescriptor
291         ("binary512", new InstanceHandler() {
292             public void setFieldValue(IdBase instance, Object value) {
293                 ((VarbinaryTypes)instance).setBinary512((byte[])value);
294              }
295              public Object getFieldValue(IdBase instance) {
296                 return ((VarbinaryTypes)instance).getBinary512();
297              }
298              public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
299                     throws SQLException {
300                 preparedStatement.setBytes(j, (byte[])value);
301              }
302              public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
303                 return rs.getBytes(j);
304         }
305     });
306 
307     static ColumnDescriptor binary1024 = new ColumnDescriptor
308         ("binary1024", new InstanceHandler() {
309             public void setFieldValue(IdBase instance, Object value) {
310                 ((VarbinaryTypes)instance).setBinary1024((byte[])value);
311              }
312              public Object getFieldValue(IdBase instance) {
313                 return ((VarbinaryTypes)instance).getBinary1024();
314              }
315              public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
316                     throws SQLException {
317                 preparedStatement.setBytes(j, (byte[])value);
318              }
319              public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
320                 return rs.getBytes(j);
321          }
322      });
323 
324     static ColumnDescriptor binary2048 = new ColumnDescriptor
325         ("binary2048", new InstanceHandler() {
326             public void setFieldValue(IdBase instance, Object value) {
327                 ((VarbinaryTypes)instance).setBinary2048((byte[])value);
328              }
329              public Object getFieldValue(IdBase instance) {
330                 return ((VarbinaryTypes)instance).getBinary2048();
331              }
332              public void setPreparedStatementValue(PreparedStatement preparedStatement, int j, Object value)
333                     throws SQLException {
334                 preparedStatement.setBytes(j, (byte[])value);
335              }
336              public Object getResultSetValue(ResultSet rs, int j) throws SQLException {
337                 return rs.getBytes(j);
338         }
339     });
340 
341     protected static ColumnDescriptor[] columnDescriptors = new ColumnDescriptor[] {
342             binary1,
343             binary2,
344             binary4,
345             binary8,
346             binary16,
347             binary32,
348             binary64,
349             binary128,
350             binary256,
351             binary512,
352             binary1024,
353             binary2048
354         };
355 
356     @Override
getColumnDescriptors()357     protected ColumnDescriptor[] getColumnDescriptors() {
358         return columnDescriptors;
359     }
360 
361 }
362