/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.jdbc; import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.Arrays; import java.util.UUID; import org.h2.constant.SysProperties; import org.h2.test.TestBase; /** * Tests java object values when SysProperties.SERIALIZE_JAVA_OBJECT property is * disabled. * * @author Sergi Vladykin */ public class TestJavaObject extends TestBase { /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase test = createCaller().init(); test.config.traceTest = true; test.config.memory = true; test.config.networked = true; test.config.beforeTest(); test.test(); test.config.afterTest(); } @Override public void test() throws Exception { SysProperties.serializeJavaObject = false; try { trace("Test Java Object"); doTest(new MyObj(1), new MyObj(2), false); doTest(Arrays.asList(UUID.randomUUID(), null), Arrays.asList(UUID.randomUUID(), UUID.randomUUID()), true); // doTest(new Timestamp(System.currentTimeMillis()), // new Timestamp(System.currentTimeMillis() + 10000), false); doTest(200, 100, false); doTest(200, 100L, true); // doTest(new Date(System.currentTimeMillis() + 1000), // new Date(System.currentTimeMillis()), false); // doTest(new java.util.Date(System.currentTimeMillis() + 1000), // new java.util.Date(System.currentTimeMillis()), false); // doTest(new Time(System.currentTimeMillis() + 1000), // new Date(System.currentTimeMillis()), false); // doTest(new Time(System.currentTimeMillis() + 1000), // new Timestamp(System.currentTimeMillis()), false); } finally { SysProperties.serializeJavaObject = true; } } private void doTest(Object o1, Object o2, boolean hash) throws SQLException { deleteDb("javaObject"); Connection conn = getConnection("javaObject"); Statement stat = conn.createStatement(); stat.execute("create table t(id identity, val other)"); PreparedStatement ins = conn.prepareStatement("insert into t(val) values(?)"); ins.setObject(1, o1, Types.JAVA_OBJECT); assertEquals(1, ins.executeUpdate()); ins.setObject(1, o2, Types.JAVA_OBJECT); assertEquals(1, ins.executeUpdate()); ResultSet rs = stat.executeQuery("select val from t order by val limit 1"); assertTrue(rs.next()); Object smallest; if (hash) { if (o1.getClass() != o2.getClass()) { smallest = o1.getClass().getName().compareTo(o2.getClass().getName()) < 0 ? o1 : o2; } else { assertFalse(o1.hashCode() == o2.hashCode()); smallest = o1.hashCode() < o2.hashCode() ? o1 : o2; } } else { @SuppressWarnings("unchecked") int compare = ((Comparable<Object>) o1).compareTo(o2); assertFalse(compare == 0); smallest = compare < 0 ? o1 : o2; } assertEquals(smallest.toString(), rs.getString(1)); Object y = rs.getObject(1); assertTrue(smallest.equals(y)); assertFalse(rs.next()); rs.close(); PreparedStatement prep = conn.prepareStatement("select id from t where val = ?"); prep.setObject(1, o1, Types.JAVA_OBJECT); rs = prep.executeQuery(); assertTrue(rs.next()); assertEquals(1, rs.getInt(1)); assertFalse(rs.next()); rs.close(); prep.setObject(1, o2, Types.JAVA_OBJECT); rs = prep.executeQuery(); assertTrue(rs.next()); assertEquals(2, rs.getInt(1)); assertFalse(rs.next()); rs.close(); stat.close(); prep.close(); conn.close(); deleteDb("javaObject"); // trace("ok: " + o1.getClass().getName() + " vs " + o2.getClass().getName()); } /** * A test class. */ public static class MyObj implements Comparable<MyObj>, Serializable { private static final long serialVersionUID = 1L; private final int value; MyObj(int value) { this.value = value; } public String toString() { return "myObj:" + value; } public int compareTo(MyObj o) { return value - o.value; } public boolean equals(Object o) { return toString().equals(o.toString()); } public int hashCode() { return -value; } } }