blob: 232c82931a8fea70d1cc994583fb921f692eb13c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.flink.configuration;
import org.apache.flink.util.InstantiationUtil;
import org.apache.flink.util.TestLogger;
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* This class contains test for the configuration package. In particular, the serialization of {@link Configuration}
* objects is tested.
*/
public class ConfigurationTest extends TestLogger {
private static final byte[] EMPTY_BYTES = new byte[0];
private static final long TOO_LONG = Integer.MAX_VALUE + 10L;
private static final double TOO_LONG_DOUBLE = Double.MAX_VALUE;
/**
* This test checks the serialization/deserialization of configuration objects.
*/
@Test
public void testConfigurationSerializationAndGetters() {
try {
final Configuration orig = new Configuration();
orig.setString("mykey", "myvalue");
orig.setInteger("mynumber", 100);
orig.setLong("longvalue", 478236947162389746L);
orig.setFloat("PI", 3.1415926f);
orig.setDouble("E", Math.E);
orig.setBoolean("shouldbetrue", true);
orig.setBytes("bytes sequence", new byte[] { 1, 2, 3, 4, 5 });
orig.setClass("myclass", this.getClass());
final Configuration copy = InstantiationUtil.createCopyWritable(orig);
assertEquals("myvalue", copy.getString("mykey", "null"));
assertEquals(100, copy.getInteger("mynumber", 0));
assertEquals(478236947162389746L, copy.getLong("longvalue", 0L));
assertEquals(3.1415926f, copy.getFloat("PI", 3.1415926f), 0.0);
assertEquals(Math.E, copy.getDouble("E", 0.0), 0.0);
assertEquals(true, copy.getBoolean("shouldbetrue", false));
assertArrayEquals(new byte[] { 1, 2, 3, 4, 5 }, copy.getBytes("bytes sequence", null));
assertEquals(getClass(), copy.getClass("myclass", null, getClass().getClassLoader()));
assertEquals(orig, copy);
assertEquals(orig.keySet(), copy.keySet());
assertEquals(orig.hashCode(), copy.hashCode());
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testConversions() {
try {
Configuration pc = new Configuration();
pc.setInteger("int", 5);
pc.setLong("long", 15);
pc.setLong("too_long", TOO_LONG);
pc.setFloat("float", 2.1456775f);
pc.setDouble("double", Math.PI);
pc.setDouble("negative_double", -1.0);
pc.setDouble("zero", 0.0);
pc.setDouble("too_long_double", TOO_LONG_DOUBLE);
pc.setString("string", "42");
pc.setString("non_convertible_string", "bcdefg&&");
pc.setBoolean("boolean", true);
// as integer
assertEquals(5, pc.getInteger("int", 0));
assertEquals(5L, pc.getLong("int", 0));
assertEquals(5f, pc.getFloat("int", 0), 0.0);
assertEquals(5.0, pc.getDouble("int", 0), 0.0);
assertEquals(false, pc.getBoolean("int", true));
assertEquals("5", pc.getString("int", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("int", EMPTY_BYTES));
// as long
assertEquals(15, pc.getInteger("long", 0));
assertEquals(15L, pc.getLong("long", 0));
assertEquals(15f, pc.getFloat("long", 0), 0.0);
assertEquals(15.0, pc.getDouble("long", 0), 0.0);
assertEquals(false, pc.getBoolean("long", true));
assertEquals("15", pc.getString("long", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("long", EMPTY_BYTES));
// as too long
assertEquals(0, pc.getInteger("too_long", 0));
assertEquals(TOO_LONG, pc.getLong("too_long", 0));
assertEquals((float) TOO_LONG, pc.getFloat("too_long", 0), 10.0);
assertEquals((double) TOO_LONG, pc.getDouble("too_long", 0), 10.0);
assertEquals(false, pc.getBoolean("too_long", true));
assertEquals(String.valueOf(TOO_LONG), pc.getString("too_long", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("too_long", EMPTY_BYTES));
// as float
assertEquals(0, pc.getInteger("float", 0));
assertEquals(0L, pc.getLong("float", 0));
assertEquals(2.1456775f, pc.getFloat("float", 0), 0.0);
assertEquals(2.1456775, pc.getDouble("float", 0), 0.0000001);
assertEquals(false, pc.getBoolean("float", true));
assertTrue(pc.getString("float", "0").startsWith("2.145677"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("float", EMPTY_BYTES));
// as double
assertEquals(0, pc.getInteger("double", 0));
assertEquals(0L, pc.getLong("double", 0));
assertEquals(3.141592f, pc.getFloat("double", 0), 0.000001);
assertEquals(Math.PI, pc.getDouble("double", 0), 0.0);
assertEquals(false, pc.getBoolean("double", true));
assertTrue(pc.getString("double", "0").startsWith("3.1415926535"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("double", EMPTY_BYTES));
// as negative double
assertEquals(0, pc.getInteger("negative_double", 0));
assertEquals(0L, pc.getLong("negative_double", 0));
assertEquals(-1f, pc.getFloat("negative_double", 0), 0.000001);
assertEquals(-1, pc.getDouble("negative_double", 0), 0.0);
assertEquals(false, pc.getBoolean("negative_double", true));
assertTrue(pc.getString("negative_double", "0").startsWith("-1"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("negative_double", EMPTY_BYTES));
// as zero
assertEquals(-1, pc.getInteger("zero", -1));
assertEquals(-1L, pc.getLong("zero", -1));
assertEquals(0f, pc.getFloat("zero", -1), 0.000001);
assertEquals(0.0, pc.getDouble("zero", -1), 0.0);
assertEquals(false, pc.getBoolean("zero", true));
assertTrue(pc.getString("zero", "-1").startsWith("0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("zero", EMPTY_BYTES));
// as too long double
assertEquals(0, pc.getInteger("too_long_double", 0));
assertEquals(0L, pc.getLong("too_long_double", 0));
assertEquals(0f, pc.getFloat("too_long_double", 0f), 0.000001);
assertEquals(TOO_LONG_DOUBLE, pc.getDouble("too_long_double", 0), 0.0);
assertEquals(false, pc.getBoolean("too_long_double", true));
assertEquals(String.valueOf(TOO_LONG_DOUBLE), pc.getString("too_long_double", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("too_long_double", EMPTY_BYTES));
// as string
assertEquals(42, pc.getInteger("string", 0));
assertEquals(42L, pc.getLong("string", 0));
assertEquals(42f, pc.getFloat("string", 0f), 0.000001);
assertEquals(42.0, pc.getDouble("string", 0), 0.0);
assertEquals(false, pc.getBoolean("string", true));
assertEquals("42", pc.getString("string", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("string", EMPTY_BYTES));
// as non convertible string
assertEquals(0, pc.getInteger("non_convertible_string", 0));
assertEquals(0L, pc.getLong("non_convertible_string", 0));
assertEquals(0f, pc.getFloat("non_convertible_string", 0f), 0.000001);
assertEquals(0.0, pc.getDouble("non_convertible_string", 0), 0.0);
assertEquals(false, pc.getBoolean("non_convertible_string", true));
assertEquals("bcdefg&&", pc.getString("non_convertible_string", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("non_convertible_string", EMPTY_BYTES));
// as boolean
assertEquals(0, pc.getInteger("boolean", 0));
assertEquals(0L, pc.getLong("boolean", 0));
assertEquals(0f, pc.getFloat("boolean", 0f), 0.000001);
assertEquals(0.0, pc.getDouble("boolean", 0), 0.0);
assertEquals(true, pc.getBoolean("boolean", false));
assertEquals("true", pc.getString("boolean", "0"));
assertArrayEquals(EMPTY_BYTES, pc.getBytes("boolean", EMPTY_BYTES));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testCopyConstructor() {
try {
final String key = "theKey";
Configuration cfg1 = new Configuration();
cfg1.setString(key, "value");
Configuration cfg2 = new Configuration(cfg1);
cfg2.setString(key, "another value");
assertEquals("value", cfg1.getString(key, ""));
}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testOptionWithDefault() {
Configuration cfg = new Configuration();
cfg.setInteger("int-key", 11);
cfg.setString("string-key", "abc");
ConfigOption<String> presentStringOption = ConfigOptions.key("string-key").defaultValue("my-beautiful-default");
ConfigOption<Integer> presentIntOption = ConfigOptions.key("int-key").defaultValue(87);
assertEquals("abc", cfg.getString(presentStringOption));
assertEquals("abc", cfg.getValue(presentStringOption));
assertEquals(11, cfg.getInteger(presentIntOption));
assertEquals("11", cfg.getValue(presentIntOption));
// test getting default when no value is present
ConfigOption<String> stringOption = ConfigOptions.key("test").defaultValue("my-beautiful-default");
ConfigOption<Integer> intOption = ConfigOptions.key("test2").defaultValue(87);
// getting strings with default value should work
assertEquals("my-beautiful-default", cfg.getValue(stringOption));
assertEquals("my-beautiful-default", cfg.getString(stringOption));
// overriding the default should work
assertEquals("override", cfg.getString(stringOption, "override"));
// getting a primitive with a default value should work
assertEquals(87, cfg.getInteger(intOption));
assertEquals("87", cfg.getValue(intOption));
}
@Test
public void testOptionWithNoDefault() {
Configuration cfg = new Configuration();
cfg.setInteger("int-key", 11);
cfg.setString("string-key", "abc");
ConfigOption<String> presentStringOption = ConfigOptions.key("string-key").noDefaultValue();
assertEquals("abc", cfg.getString(presentStringOption));
assertEquals("abc", cfg.getValue(presentStringOption));
// test getting default when no value is present
ConfigOption<String> stringOption = ConfigOptions.key("test").noDefaultValue();
// getting strings for null should work
assertNull(cfg.getValue(stringOption));
assertNull(cfg.getString(stringOption));
// overriding the null default should work
assertEquals("override", cfg.getString(stringOption, "override"));
}
@Test
public void testDeprecatedKeys() {
Configuration cfg = new Configuration();
cfg.setInteger("the-key", 11);
cfg.setInteger("old-key", 12);
cfg.setInteger("older-key", 13);
ConfigOption<Integer> matchesFirst = ConfigOptions
.key("the-key")
.defaultValue(-1)
.withDeprecatedKeys("old-key", "older-key");
ConfigOption<Integer> matchesSecond = ConfigOptions
.key("does-not-exist")
.defaultValue(-1)
.withDeprecatedKeys("old-key", "older-key");
ConfigOption<Integer> matchesThird = ConfigOptions
.key("does-not-exist")
.defaultValue(-1)
.withDeprecatedKeys("foo", "older-key");
ConfigOption<Integer> notContained = ConfigOptions
.key("does-not-exist")
.defaultValue(-1)
.withDeprecatedKeys("not-there", "also-not-there");
assertEquals(11, cfg.getInteger(matchesFirst));
assertEquals(12, cfg.getInteger(matchesSecond));
assertEquals(13, cfg.getInteger(matchesThird));
assertEquals(-1, cfg.getInteger(notContained));
}
}