mirror of
https://github.com/lightbend/config.git
synced 2025-02-19 07:40:31 +08:00
add serialVersionUID to serializable classes
Also add tests to detect any incompatible change in serialization format, to be sure such changes are deliberate.
This commit is contained in:
parent
277e4ca3a2
commit
190bf12ebf
@ -18,6 +18,8 @@ libraryDependencies += "net.liftweb" %% "lift-json" % "2.4-SNAPSHOT" % "test"
|
||||
|
||||
libraryDependencies += "com.novocode" % "junit-interface" % "0.7" % "test"
|
||||
|
||||
libraryDependencies += "commons-codec" % "commons-codec" % "1.4" % "test"
|
||||
|
||||
externalResolvers += "Scala Tools Snapshots" at "http://scala-tools.org/repo-snapshots/"
|
||||
|
||||
seq(findbugsSettings : _*)
|
||||
|
@ -23,6 +23,9 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
abstract class AbstractConfigObject extends AbstractConfigValue implements
|
||||
ConfigObject {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private SimpleConfig config;
|
||||
|
||||
protected AbstractConfigObject(ConfigOrigin origin) {
|
||||
|
@ -20,6 +20,8 @@ import com.typesafe.config.ConfigValue;
|
||||
*/
|
||||
abstract class AbstractConfigValue implements ConfigValue, MergeableValue, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private SimpleConfigOrigin origin;
|
||||
|
||||
AbstractConfigValue(ConfigOrigin origin) {
|
||||
|
@ -8,6 +8,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
final class ConfigBoolean extends AbstractConfigValue {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private boolean value;
|
||||
|
||||
ConfigBoolean(ConfigOrigin origin, boolean value) {
|
||||
|
@ -8,6 +8,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
final class ConfigDouble extends ConfigNumber {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private double value;
|
||||
|
||||
ConfigDouble(ConfigOrigin origin, double value, String originalText) {
|
||||
|
@ -8,6 +8,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
final class ConfigInt extends ConfigNumber {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private int value;
|
||||
|
||||
ConfigInt(ConfigOrigin origin, int value, String originalText) {
|
||||
|
@ -8,6 +8,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
final class ConfigLong extends ConfigNumber {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private long value;
|
||||
|
||||
ConfigLong(ConfigOrigin origin, long value, String originalText) {
|
||||
|
@ -16,6 +16,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
*/
|
||||
final class ConfigNull extends AbstractConfigValue {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
ConfigNull(ConfigOrigin origin) {
|
||||
super(origin);
|
||||
}
|
||||
|
@ -7,6 +7,9 @@ import com.typesafe.config.ConfigException;
|
||||
import com.typesafe.config.ConfigOrigin;
|
||||
|
||||
abstract class ConfigNumber extends AbstractConfigValue {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// This is so when we concatenate a number into a string (say it appears in
|
||||
// a sentence) we always have it exactly as the person typed it into the
|
||||
// config file. It's purely cosmetic; equals/hashCode don't consider this
|
||||
|
@ -8,6 +8,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
|
||||
final class ConfigString extends AbstractConfigValue {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private String value;
|
||||
|
||||
ConfigString(ConfigOrigin origin, String value) {
|
||||
|
@ -11,6 +11,8 @@ import com.typesafe.config.ConfigException;
|
||||
|
||||
final class Path implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private String first;
|
||||
final private Path remainder;
|
||||
|
||||
|
@ -31,6 +31,8 @@ import com.typesafe.config.ConfigValueType;
|
||||
*/
|
||||
final class SimpleConfig implements Config, MergeableValue, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private AbstractConfigObject object;
|
||||
|
||||
SimpleConfig(AbstractConfigObject object) {
|
||||
|
@ -17,6 +17,8 @@ import com.typesafe.config.ConfigValue;
|
||||
|
||||
final class SimpleConfigObject extends AbstractConfigObject {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// this map should never be modified - assume immutable
|
||||
final private Map<String, AbstractConfigValue> value;
|
||||
final private boolean resolved;
|
||||
|
@ -19,6 +19,9 @@ import com.typesafe.config.ConfigOrigin;
|
||||
// it would be cleaner to have a class hierarchy for various origin types,
|
||||
// but was hoping this would be enough simpler to be a little messy. eh.
|
||||
final class SimpleConfigOrigin implements ConfigOrigin, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private String description;
|
||||
final private int lineNumber;
|
||||
final private int endLineNumber;
|
||||
|
@ -4,6 +4,8 @@ import java.io.Serializable;
|
||||
|
||||
final class SubstitutionExpression implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
final private Path path;
|
||||
final private boolean optional;
|
||||
|
||||
|
@ -324,7 +324,85 @@ class ConfigSubstitutionTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def serializeUnresolvedObject() {
|
||||
checkSerializable(substComplexObject)
|
||||
val expectedSerialization = "" +
|
||||
"aced00057372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c6543" +
|
||||
"6f6e6669674f626a65637400000000000000010200035a001069676e6f72657346616c6c6261636b" +
|
||||
"735a00087265736f6c7665644c000576616c756574000f4c6a6176612f7574696c2f4d61703b7872" +
|
||||
"002d636f6d2e74797065736166652e636f6e6669672e696d706c2e4162737472616374436f6e6669" +
|
||||
"674f626a65637400000000000000010200014c0006636f6e6669677400274c636f6d2f7479706573" +
|
||||
"6166652f636f6e6669672f696d706c2f53696d706c65436f6e6669673b7872002c636f6d2e747970" +
|
||||
"65736166652e636f6e6669672e696d706c2e4162737472616374436f6e66696756616c7565000000" +
|
||||
"00000000010200014c00066f726967696e74002d4c636f6d2f74797065736166652f636f6e666967" +
|
||||
"2f696d706c2f53696d706c65436f6e6669674f726967696e3b78707372002b636f6d2e7479706573" +
|
||||
"6166652e636f6e6669672e696d706c2e53696d706c65436f6e6669674f726967696e000000000000" +
|
||||
"000102000649000d656e644c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d" +
|
||||
"6d656e74734f724e756c6c7400104c6a6176612f7574696c2f4c6973743b4c000b64657363726970" +
|
||||
"74696f6e7400124c6a6176612f6c616e672f537472696e673b4c000a6f726967696e547970657400" +
|
||||
"254c636f6d2f74797065736166652f636f6e6669672f696d706c2f4f726967696e547970653b4c00" +
|
||||
"0975726c4f724e756c6c71007e0009787000000002000000027074000b7465737420737472696e67" +
|
||||
"7e720023636f6d2e74797065736166652e636f6e6669672e696d706c2e4f726967696e5479706500" +
|
||||
"000000000000001200007872000e6a6176612e6c616e672e456e756d000000000000000012000078" +
|
||||
"7074000747454e455249437073720025636f6d2e74797065736166652e636f6e6669672e696d706c" +
|
||||
"2e53696d706c65436f6e66696700000000000000010200014c00066f626a65637474002f4c636f6d" +
|
||||
"2f74797065736166652f636f6e6669672f696d706c2f4162737472616374436f6e6669674f626a65" +
|
||||
"63743b787071007e00060000737200116a6176612e7574696c2e486173684d61700507dac1c31660" +
|
||||
"d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c77" +
|
||||
"08000000100000000a7400046f626a457372002b636f6d2e74797065736166652e636f6e6669672e" +
|
||||
"696d706c2e436f6e666967537562737469747574696f6e61f02fc05eca6d7d0200035a001069676e" +
|
||||
"6f72657346616c6c6261636b7349000c7072656669784c656e6774684c000670696563657371007e" +
|
||||
"00087871007e00047371007e000700000008000000087071007e000c71007e000f70000000000073" +
|
||||
"7200146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a608822030000787077040000" +
|
||||
"00017372002f636f6d2e74797065736166652e636f6e6669672e696d706c2e537562737469747574" +
|
||||
"696f6e45787072657373696f6e00000000000000010200025a00086f7074696f6e616c4c00047061" +
|
||||
"746874001f4c636f6d2f74797065736166652f636f6e6669672f696d706c2f506174683b78700073" +
|
||||
"72001d636f6d2e74797065736166652e636f6e6669672e696d706c2e506174680000000000000001" +
|
||||
"0200024c0005666972737471007e00094c000972656d61696e64657271007e001d78707400016173" +
|
||||
"71007e001f740001627371007e001f740001657078740007666f6f2e62617273720022636f6d2e74" +
|
||||
"797065736166652e636f6e6669672e696d706c2e436f6e666967496e740000000000000001020001" +
|
||||
"49000576616c756578720025636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e" +
|
||||
"6669674e756d62657200000000000000010200014c000c6f726967696e616c5465787471007e0009" +
|
||||
"7871007e00047371007e000700000009000000097071007e000c71007e000f707400023337000000" +
|
||||
"257400046f626a427371007e00177371007e000700000007000000077071007e000c71007e000f70" +
|
||||
"00000000007371007e001a7704000000017371007e001c007371007e001f740001617371007e001f" +
|
||||
"74000162707874000361727273720029636f6d2e74797065736166652e636f6e6669672e696d706c" +
|
||||
"2e53696d706c65436f6e6669674c697374ef9443c7c6af330d0200025a00087265736f6c7665644c" +
|
||||
"000576616c756571007e00087871007e00047371007e00070000000a0000000a7071007e000c7100" +
|
||||
"7e000f70007371007e001a7704000000067371007e00177371007e00070000000a0000000a707100" +
|
||||
"7e000c71007e000f7000000000007371007e001a7704000000017371007e001c007371007e001f74" +
|
||||
"0003666f6f70787371007e001771007e003b00000000007371007e001a7704000000017371007e00" +
|
||||
"1c007371007e001f740001617371007e001f740001627371007e001f7400016370787371007e0017" +
|
||||
"71007e003b00000000007371007e001a7704000000017371007e001c007371007e001f740007666f" +
|
||||
"6f2e62617270787371007e001771007e003b00000000007371007e001a7704000000017371007e00" +
|
||||
"1c007371007e001f7400046f626a427371007e001f7400016470787371007e001771007e003b0000" +
|
||||
"0000007371007e001a7704000000017371007e001c007371007e001f7400046f626a417371007e00" +
|
||||
"1f740001627371007e001f740001657371007e001f7400016670787371007e001771007e003b0000" +
|
||||
"0000007371007e001a7704000000017371007e001c007371007e001f7400046f626a457371007e00" +
|
||||
"1f740001667078787400046f626a417371007e00177371007e000700000006000000067071007e00" +
|
||||
"0c71007e000f7000000000007371007e001a7704000000017371007e001c007371007e001f740001" +
|
||||
"617078740001617371007e00007371007e000700000005000000057071007e000c71007e000f7073" +
|
||||
"71007e001171007e006f00007371007e00143f4000000000000c7708000000100000000174000162" +
|
||||
"7371007e00007371007e000700000005000000057071007e000c71007e000f707371007e00117100" +
|
||||
"7e007400007371007e00143f4000000000000c77080000001000000003740001647371007e001773" +
|
||||
"71007e000700000005000000057071007e000c71007e000f7000000000007371007e001a77040000" +
|
||||
"00017371007e001c007371007e001f740003666f6f7078740001657371007e00007371007e000700" +
|
||||
"000005000000057071007e000c71007e000f707371007e001171007e008000007371007e00143f40" +
|
||||
"00000000000c77080000001000000001740001667371007e001771007e007a00000000007371007e" +
|
||||
"001a7704000000017371007e001c007371007e001f740003666f6f707878740001637371007e0027" +
|
||||
"71007e007a7400023537000000397878740003666f6f7371007e00177371007e0007000000030000" +
|
||||
"00037071007e000c71007e000f7000000000007371007e001a7704000000017371007e001c007371" +
|
||||
"007e001f7400036261727078740008707472546f4172727371007e00177371007e00070000000b00" +
|
||||
"00000b7071007e000c71007e000f7000000000007371007e001a7704000000017371007e001c0073" +
|
||||
"71007e001f74000361727270787400036261727371007e00177371007e0007000000040000000470" +
|
||||
"71007e000c71007e000f7000000000007371007e001a7704000000017371007e001c007371007e00" +
|
||||
"1f740001617371007e001f740001627371007e001f740001637078740001787371007e0000737100" +
|
||||
"7e00070000000c0000000c7071007e000c71007e000f707371007e001171007e00a700007371007e" +
|
||||
"00143f4000000000000c77080000001000000001740001797371007e00007371007e00070000000c" +
|
||||
"0000000c7071007e000c71007e000f707371007e001171007e00ac00007371007e00143f40000000" +
|
||||
"00000c7708000000100000000174000d707472546f507472546f4172727371007e00177371007e00" +
|
||||
"070000000c0000000c7071007e000c71007e000f7000000000007371007e001a7704000000017371" +
|
||||
"007e001c007371007e001f740008707472546f4172727078787878"
|
||||
|
||||
checkSerializable(expectedSerialization, substComplexObject)
|
||||
}
|
||||
|
||||
// this is a weird test, it used to test fallback to system props which made more sense.
|
||||
|
@ -30,8 +30,19 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configOriginSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced00057372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c6543" +
|
||||
"6f6e6669674f726967696e000000000000000102000649000d656e644c696e654e756d6265724900" +
|
||||
"0a6c696e654e756d6265724c000e636f6d6d656e74734f724e756c6c7400104c6a6176612f757469" +
|
||||
"6c2f4c6973743b4c000b6465736372697074696f6e7400124c6a6176612f6c616e672f537472696e" +
|
||||
"673b4c000a6f726967696e547970657400254c636f6d2f74797065736166652f636f6e6669672f69" +
|
||||
"6d706c2f4f726967696e547970653b4c000975726c4f724e756c6c71007e00027870ffffffffffff" +
|
||||
"ffff70740003666f6f7e720023636f6d2e74797065736166652e636f6e6669672e696d706c2e4f72" +
|
||||
"6967696e5479706500000000000000001200007872000e6a6176612e6c616e672e456e756d000000" +
|
||||
"0000000000120000787074000747454e4552494370"
|
||||
|
||||
val a = SimpleConfigOrigin.newSimple("foo")
|
||||
checkSerializable(a)
|
||||
checkSerializable(expectedSerialization, a)
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -47,8 +58,26 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configIntSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced000573720022636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e66696749" +
|
||||
"6e74000000000000000102000149000576616c756578720025636f6d2e74797065736166652e636f" +
|
||||
"6e6669672e696d706c2e436f6e6669674e756d62657200000000000000010200014c000c6f726967" +
|
||||
"696e616c546578747400124c6a6176612f6c616e672f537472696e673b7872002c636f6d2e747970" +
|
||||
"65736166652e636f6e6669672e696d706c2e4162737472616374436f6e66696756616c7565000000" +
|
||||
"00000000010200014c00066f726967696e74002d4c636f6d2f74797065736166652f636f6e666967" +
|
||||
"2f696d706c2f53696d706c65436f6e6669674f726967696e3b78707372002b636f6d2e7479706573" +
|
||||
"6166652e636f6e6669672e696d706c2e53696d706c65436f6e6669674f726967696e000000000000" +
|
||||
"000102000649000d656e644c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d" +
|
||||
"6d656e74734f724e756c6c7400104c6a6176612f7574696c2f4c6973743b4c000b64657363726970" +
|
||||
"74696f6e71007e00024c000a6f726967696e547970657400254c636f6d2f74797065736166652f63" +
|
||||
"6f6e6669672f696d706c2f4f726967696e547970653b4c000975726c4f724e756c6c71007e000278" +
|
||||
"70ffffffffffffffff7074000b66616b65206f726967696e7e720023636f6d2e7479706573616665" +
|
||||
"2e636f6e6669672e696d706c2e4f726967696e5479706500000000000000001200007872000e6a61" +
|
||||
"76612e6c616e672e456e756d0000000000000000120000787074000747454e455249437070000000" +
|
||||
"2a"
|
||||
|
||||
val a = intValue(42)
|
||||
val b = checkSerializable(a)
|
||||
val b = checkSerializable(expectedSerialization, a)
|
||||
assertEquals(42, b.unwrapped)
|
||||
}
|
||||
|
||||
@ -119,9 +148,40 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configObjectSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced00057372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c6543" +
|
||||
"6f6e6669674f626a65637400000000000000010200035a001069676e6f72657346616c6c6261636b" +
|
||||
"735a00087265736f6c7665644c000576616c756574000f4c6a6176612f7574696c2f4d61703b7872" +
|
||||
"002d636f6d2e74797065736166652e636f6e6669672e696d706c2e4162737472616374436f6e6669" +
|
||||
"674f626a65637400000000000000010200014c0006636f6e6669677400274c636f6d2f7479706573" +
|
||||
"6166652f636f6e6669672f696d706c2f53696d706c65436f6e6669673b7872002c636f6d2e747970" +
|
||||
"65736166652e636f6e6669672e696d706c2e4162737472616374436f6e66696756616c7565000000" +
|
||||
"00000000010200014c00066f726967696e74002d4c636f6d2f74797065736166652f636f6e666967" +
|
||||
"2f696d706c2f53696d706c65436f6e6669674f726967696e3b78707372002b636f6d2e7479706573" +
|
||||
"6166652e636f6e6669672e696d706c2e53696d706c65436f6e6669674f726967696e000000000000" +
|
||||
"000102000649000d656e644c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d" +
|
||||
"6d656e74734f724e756c6c7400104c6a6176612f7574696c2f4c6973743b4c000b64657363726970" +
|
||||
"74696f6e7400124c6a6176612f6c616e672f537472696e673b4c000a6f726967696e547970657400" +
|
||||
"254c636f6d2f74797065736166652f636f6e6669672f696d706c2f4f726967696e547970653b4c00" +
|
||||
"0975726c4f724e756c6c71007e00097870ffffffffffffffff7074000b66616b65206f726967696e" +
|
||||
"7e720023636f6d2e74797065736166652e636f6e6669672e696d706c2e4f726967696e5479706500" +
|
||||
"000000000000001200007872000e6a6176612e6c616e672e456e756d000000000000000012000078" +
|
||||
"7074000747454e455249437073720025636f6d2e74797065736166652e636f6e6669672e696d706c" +
|
||||
"2e53696d706c65436f6e66696700000000000000010200014c00066f626a65637474002f4c636f6d" +
|
||||
"2f74797065736166652f636f6e6669672f696d706c2f4162737472616374436f6e6669674f626a65" +
|
||||
"63743b787071007e00060001737200116a6176612e7574696c2e486173684d61700507dac1c31660" +
|
||||
"d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c77" +
|
||||
"0800000010000000037400016273720022636f6d2e74797065736166652e636f6e6669672e696d70" +
|
||||
"6c2e436f6e666967496e74000000000000000102000149000576616c756578720025636f6d2e7479" +
|
||||
"7065736166652e636f6e6669672e696d706c2e436f6e6669674e756d626572000000000000000102" +
|
||||
"00014c000c6f726967696e616c5465787471007e00097871007e00047371007e0007ffffffffffff" +
|
||||
"ffff7071007e000c71007e000f707000000002740001637371007e00177371007e0007ffffffffff" +
|
||||
"ffffff7071007e000c71007e000f707000000003740001617371007e00177371007e0007ffffffff" +
|
||||
"ffffffff7071007e000c71007e000f70700000000178"
|
||||
|
||||
val aMap = configMap("a" -> 1, "b" -> 2, "c" -> 3)
|
||||
val a = new SimpleConfigObject(fakeOrigin(), aMap)
|
||||
val b = checkSerializable(a)
|
||||
val b = checkSerializable(expectedSerialization, a)
|
||||
assertEquals(1, b.toConfig.getInt("a"))
|
||||
// check that deserialized Config and ConfigObject refer to each other
|
||||
assertTrue(b.toConfig.root eq b)
|
||||
@ -142,9 +202,32 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configListSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced000573720029636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c6543" +
|
||||
"6f6e6669674c697374ef9443c7c6af330d0200025a00087265736f6c7665644c000576616c756574" +
|
||||
"00104c6a6176612f7574696c2f4c6973743b7872002c636f6d2e74797065736166652e636f6e6669" +
|
||||
"672e696d706c2e4162737472616374436f6e66696756616c756500000000000000010200014c0006" +
|
||||
"6f726967696e74002d4c636f6d2f74797065736166652f636f6e6669672f696d706c2f53696d706c" +
|
||||
"65436f6e6669674f726967696e3b78707372002b636f6d2e74797065736166652e636f6e6669672e" +
|
||||
"696d706c2e53696d706c65436f6e6669674f726967696e000000000000000102000649000d656e64" +
|
||||
"4c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d6d656e74734f724e756c6c" +
|
||||
"71007e00014c000b6465736372697074696f6e7400124c6a6176612f6c616e672f537472696e673b" +
|
||||
"4c000a6f726967696e547970657400254c636f6d2f74797065736166652f636f6e6669672f696d70" +
|
||||
"6c2f4f726967696e547970653b4c000975726c4f724e756c6c71007e00067870ffffffffffffffff" +
|
||||
"7074000b66616b65206f726967696e7e720023636f6d2e74797065736166652e636f6e6669672e69" +
|
||||
"6d706c2e4f726967696e5479706500000000000000001200007872000e6a6176612e6c616e672e45" +
|
||||
"6e756d0000000000000000120000787074000747454e455249437001737200146a6176612e757469" +
|
||||
"6c2e4c696e6b65644c6973740c29535d4a608822030000787077040000000373720022636f6d2e74" +
|
||||
"797065736166652e636f6e6669672e696d706c2e436f6e666967496e740000000000000001020001" +
|
||||
"49000576616c756578720025636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e" +
|
||||
"6669674e756d62657200000000000000010200014c000c6f726967696e616c5465787471007e0006" +
|
||||
"7871007e00027371007e0005ffffffffffffffff7071007e000971007e000c707000000001737100" +
|
||||
"7e00107371007e0005ffffffffffffffff7071007e000971007e000c7070000000027371007e0010" +
|
||||
"7371007e0005ffffffffffffffff7071007e000971007e000c70700000000378"
|
||||
|
||||
val aScalaSeq = Seq(1, 2, 3) map { intValue(_): AbstractConfigValue }
|
||||
val aList = new SimpleConfigList(fakeOrigin(), aScalaSeq.asJava)
|
||||
val bList = checkSerializable(aList)
|
||||
val bList = checkSerializable(expectedSerialization, aList)
|
||||
assertEquals(1, bList.get(0).unwrapped())
|
||||
}
|
||||
|
||||
@ -161,8 +244,31 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configSubstitutionSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced00057372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e66696753" +
|
||||
"7562737469747574696f6e61f02fc05eca6d7d0200035a001069676e6f72657346616c6c6261636b" +
|
||||
"7349000c7072656669784c656e6774684c00067069656365737400104c6a6176612f7574696c2f4c" +
|
||||
"6973743b7872002c636f6d2e74797065736166652e636f6e6669672e696d706c2e41627374726163" +
|
||||
"74436f6e66696756616c756500000000000000010200014c00066f726967696e74002d4c636f6d2f" +
|
||||
"74797065736166652f636f6e6669672f696d706c2f53696d706c65436f6e6669674f726967696e3b" +
|
||||
"78707372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c65436f6e" +
|
||||
"6669674f726967696e000000000000000102000649000d656e644c696e654e756d62657249000a6c" +
|
||||
"696e654e756d6265724c000e636f6d6d656e74734f724e756c6c71007e00014c000b646573637269" +
|
||||
"7074696f6e7400124c6a6176612f6c616e672f537472696e673b4c000a6f726967696e5479706574" +
|
||||
"00254c636f6d2f74797065736166652f636f6e6669672f696d706c2f4f726967696e547970653b4c" +
|
||||
"000975726c4f724e756c6c71007e00067870ffffffffffffffff7074000b66616b65206f72696769" +
|
||||
"6e7e720023636f6d2e74797065736166652e636f6e6669672e696d706c2e4f726967696e54797065" +
|
||||
"00000000000000001200007872000e6a6176612e6c616e672e456e756d0000000000000000120000" +
|
||||
"787074000747454e45524943700000000000737200146a6176612e7574696c2e4c696e6b65644c69" +
|
||||
"73740c29535d4a60882203000078707704000000017372002f636f6d2e74797065736166652e636f" +
|
||||
"6e6669672e696d706c2e537562737469747574696f6e45787072657373696f6e0000000000000001" +
|
||||
"0200025a00086f7074696f6e616c4c00047061746874001f4c636f6d2f74797065736166652f636f" +
|
||||
"6e6669672f696d706c2f506174683b7870007372001d636f6d2e74797065736166652e636f6e6669" +
|
||||
"672e696d706c2e5061746800000000000000010200024c0005666972737471007e00064c00097265" +
|
||||
"6d61696e64657271007e00117870740003666f6f7078"
|
||||
|
||||
val a = subst("foo")
|
||||
val b = checkSerializable(a)
|
||||
val b = checkSerializable(expectedSerialization, a)
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -180,10 +286,38 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configDelayedMergeSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced00057372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e66696744" +
|
||||
"656c617965644d657267656d8c8e0e0c0145760200025a001069676e6f72657346616c6c6261636b" +
|
||||
"734c0005737461636b7400104c6a6176612f7574696c2f4c6973743b7872002c636f6d2e74797065" +
|
||||
"736166652e636f6e6669672e696d706c2e4162737472616374436f6e66696756616c756500000000" +
|
||||
"000000010200014c00066f726967696e74002d4c636f6d2f74797065736166652f636f6e6669672f" +
|
||||
"696d706c2f53696d706c65436f6e6669674f726967696e3b78707372002b636f6d2e747970657361" +
|
||||
"66652e636f6e6669672e696d706c2e53696d706c65436f6e6669674f726967696e00000000000000" +
|
||||
"0102000649000d656e644c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d6d" +
|
||||
"656e74734f724e756c6c71007e00014c000b6465736372697074696f6e7400124c6a6176612f6c61" +
|
||||
"6e672f537472696e673b4c000a6f726967696e547970657400254c636f6d2f74797065736166652f" +
|
||||
"636f6e6669672f696d706c2f4f726967696e547970653b4c000975726c4f724e756c6c71007e0006" +
|
||||
"7870ffffffffffffffff7074000b66616b65206f726967696e7e720023636f6d2e74797065736166" +
|
||||
"652e636f6e6669672e696d706c2e4f726967696e5479706500000000000000001200007872000e6a" +
|
||||
"6176612e6c616e672e456e756d0000000000000000120000787074000747454e4552494370007372" +
|
||||
"00146a6176612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000" +
|
||||
"027372002b636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e66696753756273" +
|
||||
"7469747574696f6e61f02fc05eca6d7d0200035a001069676e6f72657346616c6c6261636b734900" +
|
||||
"0c7072656669784c656e6774684c000670696563657371007e00017871007e00027371007e0005ff" +
|
||||
"ffffffffffffff7071007e000971007e000c7000000000007371007e000e7704000000017372002f" +
|
||||
"636f6d2e74797065736166652e636f6e6669672e696d706c2e537562737469747574696f6e457870" +
|
||||
"72657373696f6e00000000000000010200025a00086f7074696f6e616c4c00047061746874001f4c" +
|
||||
"636f6d2f74797065736166652f636f6e6669672f696d706c2f506174683b7870007372001d636f6d" +
|
||||
"2e74797065736166652e636f6e6669672e696d706c2e5061746800000000000000010200024c0005" +
|
||||
"666972737471007e00064c000972656d61696e64657271007e00157870740003666f6f7078737100" +
|
||||
"7e00107371007e0005ffffffffffffffff7071007e000971007e000c7000000000007371007e000e" +
|
||||
"7704000000017371007e0014007371007e0017740003626172707878"
|
||||
|
||||
val s1 = subst("foo")
|
||||
val s2 = subst("bar")
|
||||
val a = new ConfigDelayedMerge(fakeOrigin(), List[AbstractConfigValue](s1, s2).asJava)
|
||||
val b = checkSerializable(a)
|
||||
val b = checkSerializable(expectedSerialization, a)
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -202,11 +336,50 @@ class ConfigValueTest extends TestUtils {
|
||||
|
||||
@Test
|
||||
def configDelayedMergeObjectSerializable() {
|
||||
val expectedSerialization = "" +
|
||||
"aced000573720031636f6d2e74797065736166652e636f6e6669672e696d706c2e436f6e66696744" +
|
||||
"656c617965644d657267654f626a65637401fa1552304cae900200025a001069676e6f7265734661" +
|
||||
"6c6c6261636b734c0005737461636b7400104c6a6176612f7574696c2f4c6973743b7872002d636f" +
|
||||
"6d2e74797065736166652e636f6e6669672e696d706c2e4162737472616374436f6e6669674f626a" +
|
||||
"65637400000000000000010200014c0006636f6e6669677400274c636f6d2f74797065736166652f" +
|
||||
"636f6e6669672f696d706c2f53696d706c65436f6e6669673b7872002c636f6d2e74797065736166" +
|
||||
"652e636f6e6669672e696d706c2e4162737472616374436f6e66696756616c756500000000000000" +
|
||||
"010200014c00066f726967696e74002d4c636f6d2f74797065736166652f636f6e6669672f696d70" +
|
||||
"6c2f53696d706c65436f6e6669674f726967696e3b78707372002b636f6d2e74797065736166652e" +
|
||||
"636f6e6669672e696d706c2e53696d706c65436f6e6669674f726967696e00000000000000010200" +
|
||||
"0649000d656e644c696e654e756d62657249000a6c696e654e756d6265724c000e636f6d6d656e74" +
|
||||
"734f724e756c6c71007e00014c000b6465736372697074696f6e7400124c6a6176612f6c616e672f" +
|
||||
"537472696e673b4c000a6f726967696e547970657400254c636f6d2f74797065736166652f636f6e" +
|
||||
"6669672f696d706c2f4f726967696e547970653b4c000975726c4f724e756c6c71007e00087870ff" +
|
||||
"ffffffffffffff7074000b66616b65206f726967696e7e720023636f6d2e74797065736166652e63" +
|
||||
"6f6e6669672e696d706c2e4f726967696e5479706500000000000000001200007872000e6a617661" +
|
||||
"2e6c616e672e456e756d0000000000000000120000787074000747454e455249437073720025636f" +
|
||||
"6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c65436f6e6669670000000000" +
|
||||
"0000010200014c00066f626a65637474002f4c636f6d2f74797065736166652f636f6e6669672f69" +
|
||||
"6d706c2f4162737472616374436f6e6669674f626a6563743b787071007e000600737200146a6176" +
|
||||
"612e7574696c2e4c696e6b65644c6973740c29535d4a60882203000078707704000000037372002b" +
|
||||
"636f6d2e74797065736166652e636f6e6669672e696d706c2e53696d706c65436f6e6669674f626a" +
|
||||
"65637400000000000000010200035a001069676e6f72657346616c6c6261636b735a00087265736f" +
|
||||
"6c7665644c000576616c756574000f4c6a6176612f7574696c2f4d61703b7871007e00027371007e" +
|
||||
"0007ffffffffffffffff7074000c656d70747920636f6e66696771007e000e707371007e00107100" +
|
||||
"7e001700017372001e6a6176612e7574696c2e436f6c6c656374696f6e7324456d7074794d617059" +
|
||||
"3614855adce7d002000078707372002b636f6d2e74797065736166652e636f6e6669672e696d706c" +
|
||||
"2e436f6e666967537562737469747574696f6e61f02fc05eca6d7d0200035a001069676e6f726573" +
|
||||
"46616c6c6261636b7349000c7072656669784c656e6774684c000670696563657371007e00017871" +
|
||||
"007e00047371007e0007ffffffffffffffff7071007e000b71007e000e7000000000007371007e00" +
|
||||
"137704000000017372002f636f6d2e74797065736166652e636f6e6669672e696d706c2e53756273" +
|
||||
"7469747574696f6e45787072657373696f6e00000000000000010200025a00086f7074696f6e616c" +
|
||||
"4c00047061746874001f4c636f6d2f74797065736166652f636f6e6669672f696d706c2f50617468" +
|
||||
"3b7870007372001d636f6d2e74797065736166652e636f6e6669672e696d706c2e50617468000000" +
|
||||
"00000000010200024c0005666972737471007e00084c000972656d61696e64657271007e00227870" +
|
||||
"740003666f6f70787371007e001d7371007e0007ffffffffffffffff7071007e000b71007e000e70" +
|
||||
"00000000007371007e00137704000000017371007e0021007371007e0024740003626172707878"
|
||||
|
||||
val empty = SimpleConfigObject.empty()
|
||||
val s1 = subst("foo")
|
||||
val s2 = subst("bar")
|
||||
val a = new ConfigDelayedMergeObject(fakeOrigin(), List[AbstractConfigValue](empty, s1, s2).asJava)
|
||||
val b = checkSerializable(a)
|
||||
val b = checkSerializable(expectedSerialization, a)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -17,6 +17,8 @@ import java.io.ByteArrayOutputStream
|
||||
import java.io.ObjectOutputStream
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.ObjectInputStream
|
||||
import org.apache.commons.codec.binary.Hex
|
||||
import scala.annotation.tailrec
|
||||
|
||||
abstract trait TestUtils {
|
||||
protected def intercept[E <: Throwable: Manifest](block: => Unit): E = {
|
||||
@ -98,6 +100,54 @@ abstract trait TestUtils {
|
||||
copy
|
||||
}
|
||||
|
||||
protected def checkSerializationCompat[T: Manifest](expectedHex: String, o: T): Unit = {
|
||||
// be sure we can still deserialize the old one
|
||||
val inStream = new ByteArrayInputStream(Hex.decodeHex(expectedHex.toCharArray()))
|
||||
val inObjectStream = new ObjectInputStream(inStream)
|
||||
var failure: Option[Exception] = None
|
||||
val deserialized = try {
|
||||
inObjectStream.readObject()
|
||||
} catch {
|
||||
case e: Exception =>
|
||||
failure = Some(e)
|
||||
null
|
||||
}
|
||||
inObjectStream.close()
|
||||
|
||||
val why = failure.map({ e => ": " + e.getClass.getSimpleName + ": " + e.getMessage }).getOrElse("")
|
||||
|
||||
assertEquals("Can no longer deserialize the old format of " + o.getClass.getSimpleName + why,
|
||||
o, deserialized)
|
||||
assertFalse(failure.isDefined) // should have thrown if we had a failure
|
||||
|
||||
val byteStream = new ByteArrayOutputStream()
|
||||
val objectStream = new ObjectOutputStream(byteStream)
|
||||
objectStream.writeObject(o)
|
||||
objectStream.close()
|
||||
val hex = Hex.encodeHexString(byteStream.toByteArray())
|
||||
if (expectedHex != hex) {
|
||||
@tailrec
|
||||
def outputStringLiteral(s: String): Unit = {
|
||||
if (s.nonEmpty) {
|
||||
val (head, tail) = s.splitAt(80)
|
||||
val plus = if (tail.isEmpty) "" else " +"
|
||||
System.err.println("\"" + head + "\"" + plus)
|
||||
outputStringLiteral(tail)
|
||||
}
|
||||
}
|
||||
System.err.println("Correct result literal for " + o.getClass.getSimpleName + " serialization:")
|
||||
System.err.println("\"\" + ") // line up all the lines by using empty string on first line
|
||||
outputStringLiteral(hex)
|
||||
}
|
||||
assertEquals(o.getClass.getSimpleName + " serialization has changed (though we still deserialized the old serialization)", expectedHex, hex)
|
||||
}
|
||||
|
||||
protected def checkSerializable[T: Manifest](expectedHex: String, o: T): T = {
|
||||
val t = checkSerializable(o)
|
||||
checkSerializationCompat(expectedHex, o)
|
||||
t
|
||||
}
|
||||
|
||||
protected def checkSerializable[T: Manifest](o: T): T = {
|
||||
checkEqualObjects(o, o)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user