Skip to content

Commit

Permalink
fix: When calling Driver.connect multiple times, System.err is closed…
Browse files Browse the repository at this point in the history
… unexpectedly. (#2138)

* fix: When calling Driver.connect multiple times, System.err is closed unexpectedly. (#2130)

Use ConsoleHandler instead of StreamHandler when the output stream is
unspecified.

* Refine test cases
  • Loading branch information
agatan committed Jun 14, 2021
1 parent 7aea513 commit d78059a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
3 changes: 2 additions & 1 deletion pgjdbc/src/main/java/org/postgresql/Driver.java
Expand Up @@ -36,6 +36,7 @@
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand Down Expand Up @@ -343,7 +344,7 @@ private void setupLoggerFromProperties(final Properties props) {
} else if ( DriverManager.getLogStream() != null) {
handler = new StreamHandler(DriverManager.getLogStream(), formatter);
} else {
handler = new StreamHandler(System.err, formatter);
handler = new ConsoleHandler();
}
} else {
handler.setFormatter(formatter);
Expand Down
36 changes: 36 additions & 0 deletions pgjdbc/src/test/java/org/postgresql/test/jdbc2/DriverTest.java
Expand Up @@ -21,6 +21,8 @@

import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.sql.Connection;
Expand Down Expand Up @@ -275,6 +277,40 @@ public void testSetLogStream() throws Exception {
}
}

@Test
public void testSystemErrIsNotClosedWhenCreatedMultipleConnections() throws Exception {
TestUtil.initDriver();
PrintStream err = System.err;
String loggerLevel = System.getProperty("loggerLevel");
String loggerFile = System.getProperty("loggerFile");

System.clearProperty("loggerLevel");
System.clearProperty("loggerFile");
System.setProperty("loggerLevel", "INFO");
PrintStream buffer = new PrintStream(new ByteArrayOutputStream());
System.setErr(buffer);
try {
Connection con = DriverManager.getConnection(TestUtil.getURL(), TestUtil.getUser(), TestUtil.getPassword());
try {
assertNotNull(con);
} finally {
con.close();
}
con = DriverManager.getConnection(TestUtil.getURL(), TestUtil.getUser(), TestUtil.getPassword());
try {
assertNotNull(con);
System.err.println();
assertFalse("The System.err should not be closed.", System.err.checkError());
} finally {
con.close();
}
} finally {
System.setProperty("loggerLevel", loggerLevel);
System.setProperty("loggerFile", loggerFile);
System.setErr(err);
}
}

private void setProperty(String key, String value) {
if (value == null) {
System.clearProperty(key);
Expand Down

0 comments on commit d78059a

Please sign in to comment.