-
Bug
-
Resolution: Fixed
-
P4
-
1.4.0
-
beta
-
generic
-
generic
-
Verified
Name: elR10090 Date: 09/20/2000
Logging APIs specification (draft 0.49) states:
"The ResourceBundle is not transmitted as part of the serialized form,
but the resource bundle name is, and the recipient object's readObject
method will atempt to locate a suitable resource bundle."
Following test shows that readObject method does not try
to restore ResourceBundle value if the record has non-null
ResourceBundle and has null Parameters properties.
serializ001 log:
# Wrong bundle null, expected
logging.LogRecord.Serialization.serializ001$TestBundle@28c4e7
# TEST FAILED.
serializ001.java source:
// File: @(#)serializ001.java 1.1 00/09/20
// Copyright 09/20/00 Sun Microsystems, Inc. All Rights Reserved
package logging.LogRecord.Serialization;
import java.util.logging.*;
import java.util.*;
import java.io.*;
public class serializ001 {
final static int PASSED = 0;
final static int FAILED = 2;
final static int JCK_STATUS_BASE = 95;
final static String failMessage = "# TEST FAILED.";
final static String fileName = "records.tmp";
final static Object testParams[] = { new Integer(1), "Oups!", null };
final static String testBundleName =
"logging.LogRecord.Serialization.serializ001$TestBundle";
final static LogRecord records[] = {
new LogRecord(Level.OFF, null),
new LogRecord(Level.FINE, "Fine record {0} {1}"),
new LogRecord(Level.parse("123456"), "2")
};
private static PrintStream sout;
private static boolean verbose = false;
private static boolean testFailed = false;
private static Formatter formatter = null;
private static void checkStr(String source, String result, String name) {
if (source == null && result == null) {
// Ok
} else if (source == null && result != null) {
sout.println("# Wrong " + name + " \"" + result
+ "\", expected null");
testFailed = true;
} else if (source != null && result == null) {
sout.println("# Wrong " + name
+ " null, expected \"" + source + "\"");
testFailed = true;
} else if (!source.equals(result)) {
sout.println("# Wrong " + name + " \"" + result
+ "\", expected \"" + source + "\"");
testFailed = true;
}
}
private static void checkBundle(ResourceBundle source,
ResourceBundle result) {
if (source == null && result == null) {
// Ok
} else if (source == null && result != null) {
sout.println("# Wrong bundle " + result + ", expected null");
testFailed = true;
} else if (source != null && result == null) {
sout.println("# Wrong bundle null, expected " + source);
testFailed = true;
} else if (!source.equals(result)) {
sout.println("# Wrong bundle " + result + ", expected " + source);
testFailed = true;
}
}
private static void checkThrown(Throwable source, Throwable result) {
if (source == null && result == null) {
// Ok
} else if (source == null && result != null) {
sout.println("# Wrong thrown " + result + ", expected null");
testFailed = true;
} else if (source != null && result == null) {
sout.println("# Wrong thrown null, expected " + source);
testFailed = true;
} else if (!source.toString().equals(result.toString())) {
sout.println("# Wrong thrown " + result + ", expected " + source);
testFailed = true;
}
}
private static void checkParameters(Object[] source, Object[] result) {
if (source == null && result == null) {
// Ok
} else if (source == null && result != null) {
sout.println("# Wrong parameters " + result + ", expected null");
testFailed = true;
} else if (source != null && result == null) {
sout.println("# Wrong parameters null, expected " + source);
testFailed = true;
} else if (source.length != result.length) {
sout.println("# Wrong parameters length " + result.length
+ ", expected " + source.length);
testFailed = true;
} else {
for (int j = 0; j < source.length; j++) {
if (source[j] == null && result[j] == null) {
// Ok
} else if (source[j] == null && result[j] != null) {
sout.println("# Wrong parameter " + result[j]
+ ", expected null");
testFailed = true;
} else if (source[j] != null && result[j] == null) {
sout.println("# Wrong parameter null, expected "
+ source[j]);
testFailed = true;
} else if (!(result[j] instanceof String)) {
sout.println("# Wrong parameter " + result[j]
+ ", was not made a String");
testFailed = true;
} else if (!source[j].toString().equals(result[j])) {
sout.println("# Wrong parameter " + result[j]
+ ", expected " + source[j]);
testFailed = true;
}
}
}
}
public static int run(String args[], PrintStream out) {
sout = out;
if ((args.length > 0) && args[0].equals("-v")) {
verbose = true;
formatter = new SimpleFormatter();
}
// Build up test records
records[1].setParameters(testParams);
records[1].setLoggerName("fine");
records[2].setLoggerName("nsk.logging.complex");
records[2].setSourceClassName("java.util.logging.Level");
records[2].setSourceMethodName("parse");
records[2].setThrown(new NullPointerException());
records[2].setResourceBundleName(testBundleName);
records[2].setResourceBundle(ResourceBundle.getBundle(testBundleName));
// Serialize the original LogRecord objects
try {
FileOutputStream fo = new FileOutputStream(fileName);
ObjectOutputStream so = new ObjectOutputStream(fo);
so.writeObject(records);
so.flush();
so.close();
} catch (Exception ex) {
out.println("# Unexpected exception " + ex + " while writing");
out.println(failMessage);
return FAILED;
}
// Deserialize into new LogRecord objects
LogRecord newRecords[] = null;
try {
FileInputStream fi = new FileInputStream(fileName);
ObjectInputStream si = new ObjectInputStream(fi);
newRecords = (LogRecord[]) si.readObject();
si.close();
File f = new File(fileName);
f.delete();
} catch (Exception ex) {
out.println("# Unexpected exception " + ex + " while reading");
out.println(failMessage);
return FAILED;
}
// Check the results
if (records == newRecords) {
out.println("# Array objects must not be the same");
testFailed = true;
}
if (records.length != newRecords.length) {
out.println("# Wrong results length" + newRecords.length
+ ", expected " + records.length);
testFailed = true;
}
for (int i = 0; i < records.length; i++) {
LogRecord sr = records[i];
LogRecord rr = newRecords[i];
if (sr == rr) {
out.println("# Records must not be the same");
testFailed = true;
}
if (sr.getLevel() != rr.getLevel()) {
out.println("# Levels must be the same");
testFailed = true;
}
if (sr.getSequenceNumber() != rr.getSequenceNumber()) {
out.println("# Wrong sequenceNumber" + rr.getSequenceNumber()
+ ", expected " + sr.getSequenceNumber());
testFailed = true;
}
if (sr.getThreadID() != rr.getThreadID()) {
out.println("# Wrong threadID " + rr.getThreadID()
+ ", expected " + sr.getThreadID());
testFailed = true;
}
if (sr.getMillis() != rr.getMillis()) {
out.println("# Wrong millis " + rr.getMillis()
+ ", expected " + sr.getMillis());
testFailed = true;
}
checkStr(sr.getMessage(), rr.getMessage(), "message");
checkStr(sr.getLoggerName(), rr.getLoggerName(), "loggerName");
checkStr(sr.getSourceClassName(), rr.getSourceClassName(),
"sourceClassName");
checkStr(sr.getSourceMethodName(), rr.getSourceMethodName(),
"sourceMethodName");
checkStr(sr.getResourceBundleName(), rr.getResourceBundleName(),
"ResourceBundleName");
checkBundle(sr.getResourceBundle(), rr.getResourceBundle());
checkThrown(sr.getThrown(), rr.getThrown());
checkStr(sr.getThrownBackTrace(), rr.getThrownBackTrace(),
"ThrownBackTrace");
checkParameters(sr.getParameters(), rr.getParameters());
if (verbose) {
out.println(formatter.format(sr));
out.println(formatter.format(rr));
}
}
if (testFailed) {
out.println(failMessage);
return FAILED;
} else {
return PASSED;
}
}
public static class TestBundle extends ListResourceBundle {
public Object[][] getContents() {
return contents;
}
static final Object[][] contents = {
{ "1", "one" },
{ "2", "two" },
{ "3", "three" }
};
}
public static void main(String args[]) {
// produce JCK-like exit status.
System.exit(run(args, System.out) + JCK_STATUS_BASE);
}
}
======================================================================
Name: elR10090 Date: 02/01/2001
This bug affects the following testbase_nsk test:
nsk/logging/LogRecord/Serialization/serializ001
======================================================================