From c5b7fdd14ddd61e8f5a72a7c328901c2124157e6 Mon Sep 17 00:00:00 2001 From: Sehrope Sarkuni Date: Wed, 13 Nov 2019 13:47:47 -0500 Subject: [PATCH] test: Add test for logServerErrorDetail connection property --- .../core/LogServerMessagePropertyTest.java | 100 ++++++++++++++++++ .../postgresql/test/jdbc2/Jdbc2TestSuite.java | 2 + 2 files changed, 102 insertions(+) create mode 100644 pgjdbc/src/test/java/org/postgresql/test/core/LogServerMessagePropertyTest.java diff --git a/pgjdbc/src/test/java/org/postgresql/test/core/LogServerMessagePropertyTest.java b/pgjdbc/src/test/java/org/postgresql/test/core/LogServerMessagePropertyTest.java new file mode 100644 index 0000000000..daab69354b --- /dev/null +++ b/pgjdbc/src/test/java/org/postgresql/test/core/LogServerMessagePropertyTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2019, PostgreSQL Global Development Group + * See the LICENSE file in the project root for more information. + */ + +package org.postgresql.test.core; + +import org.postgresql.PGProperty; +import org.postgresql.core.ServerVersion; +import org.postgresql.test.TestUtil; + +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +public class LogServerMessagePropertyTest { + private static final String PRIMARY_KEY_NAME = "lms_test_pk"; + private static final String CREATE_TABLE_SQL = + "CREATE TABLE pg_temp.lms_test (" + + " id text, " + + " CONSTRAINT " + PRIMARY_KEY_NAME + " PRIMARY KEY (id)" + + ")"; + private static final String SECRET_VALUE = "some_secret_value"; + private static final String INSERT_SQL = + "INSERT INTO pg_temp.lms_test (id) VALUES ('" + SECRET_VALUE + "')"; + private static final String UNIQUE_VIOLATION_SQL_STATE = "23505"; + + /** + * Creates a connection with the additional properties, use it to + * create a temp table with a primary key, run two inserts to generate + * a duplicate key error, and finally return the exception message. + */ + private static String testViolatePrimaryKey(Properties props) throws SQLException { + Connection conn = TestUtil.openDB(props); + Assume.assumeTrue(TestUtil.haveMinimumServerVersion(conn, ServerVersion.v9_1)); + try { + TestUtil.execute(CREATE_TABLE_SQL, conn); + // First insert should work + TestUtil.execute(INSERT_SQL, conn); + // Second insert should throw a duplicate key error + TestUtil.execute(INSERT_SQL, conn); + } catch (SQLException e) { + Assert.assertEquals("SQL state must be for a unique violation", UNIQUE_VIOLATION_SQL_STATE, e.getSQLState()); + return e.getMessage(); + } finally { + conn.close(); + } + // Should never get here: + Assert.fail("A duplicate key exception should have occurred"); + return null; + } + + private static void assertMessageContains(String message, String text) { + if (message.toLowerCase().indexOf(text.toLowerCase()) < 0) { + Assert.fail(String.format("Message must contain text '%s': %s", text, message)); + } + } + + private static void assertMessageDoesNotContain(String message, String text) { + if (message.toLowerCase().indexOf(text.toLowerCase()) >= 0) { + Assert.fail(String.format("Message must not contain text '%s': %s", text, message)); + } + } + + @Test + public void testWithDefaults() throws SQLException { + Properties props = new Properties(); + String message = testViolatePrimaryKey(props); + assertMessageContains(message, PRIMARY_KEY_NAME); + assertMessageContains(message, "Detail:"); + assertMessageContains(message, SECRET_VALUE); + } + + /** + * NOTE: This should be the same as the default case as "true" is the default. + */ + @Test + public void testWithExplicitlyEnabled() throws SQLException { + Properties props = new Properties(); + props.setProperty(PGProperty.LOG_SERVER_ERROR_DETAIL.getName(), "true"); + String message = testViolatePrimaryKey(props); + assertMessageContains(message, PRIMARY_KEY_NAME); + assertMessageContains(message, "Detail:"); + assertMessageContains(message, SECRET_VALUE); + } + + @Test + public void testWithLogServerErrorDetailDisabled() throws SQLException { + Properties props = new Properties(); + props.setProperty(PGProperty.LOG_SERVER_ERROR_DETAIL.getName(), "false"); + String message = testViolatePrimaryKey(props); + assertMessageContains(message, PRIMARY_KEY_NAME); + assertMessageDoesNotContain(message, "Detail:"); + assertMessageDoesNotContain(message, SECRET_VALUE); + } +} diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java index 01d9fbf93f..7dc50232d0 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java @@ -15,6 +15,7 @@ import org.postgresql.jdbc.DeepBatchedInsertStatementTest; import org.postgresql.jdbc.PrimitiveArraySupportTest; import org.postgresql.test.core.JavaVersionTest; +import org.postgresql.test.core.LogServerMessagePropertyTest; import org.postgresql.test.core.NativeQueryBindLengthTest; import org.postgresql.test.core.OptionsPropertyTest; import org.postgresql.test.util.ExpressionPropertiesTest; @@ -67,6 +68,7 @@ JavaVersionTest.class, JBuilderTest.class, LoginTimeoutTest.class, + LogServerMessagePropertyTest.class, LruCacheTest.class, MiscTest.class, NativeQueryBindLengthTest.class,