blob: 02bbaaad9474a4602610d66bf349354dac6d4ff2 [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.livy.client.common;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.junit.Test;
import static org.junit.Assert.*;
public class TestClientConf {
@Test
public void testTypes() {
TestConf conf = new TestConf(null);
assertNull(conf.get(TestConf.Entry.NULL));
assertEquals("default", conf.get(TestConf.Entry.STRING));
assertEquals(false, conf.getBoolean(TestConf.Entry.BOOLEAN));
assertEquals(42, conf.getInt(TestConf.Entry.INT));
assertEquals(84L, conf.getLong(TestConf.Entry.LONG));
assertEquals(168L, conf.getTimeAsMs(TestConf.Entry.TIME));
try {
conf.get(TestConf.Entry.INT);
fail("Should have failed to retrieve int as string.");
} catch (IllegalArgumentException ie) {
// Expected.
}
conf.set(TestConf.Entry.INT, 336);
assertEquals(336, conf.getInt(TestConf.Entry.INT));
try {
conf.set(TestConf.Entry.INT, "abcde");
fail("Should have failed to set int as string.");
} catch (IllegalArgumentException ie) {
// Expected.
}
conf.set(TestConf.Entry.STRING, "aString");
assertEquals("aString", conf.get(TestConf.Entry.STRING));
conf.set(TestConf.Entry.BOOLEAN, true);
assertEquals(true, conf.getBoolean(TestConf.Entry.BOOLEAN));
conf.set(TestConf.Entry.LONG, 42L);
assertEquals(42L, conf.getLong(TestConf.Entry.LONG));
conf.set(TestConf.Entry.LONG, null);
assertEquals(84L, conf.getLong(TestConf.Entry.LONG));
conf.set(TestConf.Entry.TIME_NO_DEFAULT, "100");
assertEquals(100L, conf.getTimeAsMs(TestConf.Entry.TIME_NO_DEFAULT));
}
@Test
public void testRawProperties() {
Properties dflt = new Properties();
dflt.put("key1", "val1");
dflt.put("key2", "val2");
TestConf conf = new TestConf(dflt);
conf.set("key2", "anotherVal");
assertEquals("val1", conf.get("key1"));
assertEquals("anotherVal", conf.get("key2"));
conf.setIfMissing("key2", "yetAnotherVal");
assertEquals("anotherVal", conf.get("key2"));
conf.setIfMissing("key3", "val3");
assertEquals("val3", conf.get("key3"));
int count = 0;
for (Map.Entry<String, String> e : conf) {
count++;
}
assertEquals(3, count);
TestConf newProps = new TestConf(null);
newProps.set("key4", "val4");
newProps.set("key5", "val5");
conf.setAll(newProps);
assertEquals("val4", conf.get("key4"));
assertEquals("val5", conf.get("key5"));
}
@Test(expected=IllegalArgumentException.class)
public void testInvalidTime() {
TestConf conf = new TestConf(null);
conf.set(TestConf.Entry.TIME, "invalid");
conf.getTimeAsMs(TestConf.Entry.TIME);
}
@Test(expected=IllegalArgumentException.class)
public void testInvalidTimeSuffix() {
TestConf conf = new TestConf(null);
conf.set(TestConf.Entry.TIME, "100foo");
conf.getTimeAsMs(TestConf.Entry.TIME);
}
@Test(expected=IllegalArgumentException.class)
public void testTimeWithoutDefault() {
TestConf conf = new TestConf(null);
conf.getTimeAsMs(TestConf.Entry.TIME_NO_DEFAULT);
}
@Test
public void testDeprecation() {
TestConf conf = new TestConf(null);
assertNull(conf.get("depKey"));
assertNull(conf.get("dep_alt"));
assertNull(conf.get("new-key"));
assertEquals("value", conf.get(TestConf.Entry.NEW_CONF));
TestConf depProps = new TestConf(null);
depProps.set("depKey", "dep-val");
depProps.set("dep_alt", "alt-val");
conf.setAll(depProps);
assertEquals("dep-val", conf.get("depKey"));
assertEquals("alt-val", conf.get("dep_alt"));
assertEquals("alt-val", conf.get(TestConf.Entry.NEW_CONF));
assertEquals("alt-val", conf.get("new-key"));
conf.set("new-key", "new-val");
assertEquals("new-val", conf.get(TestConf.Entry.NEW_CONF));
assertEquals("alt-val", conf.get("dep_alt"));
assertEquals("new-val", conf.get("new-key"));
}
private static class TestConf extends ClientConf<TestConf> {
static enum Entry implements ConfEntry {
NULL("null", null),
STRING("string", "default"),
BOOLEAN("bool", false),
INT("int", 42),
LONG("long", 84L),
TIME("time", "168ms"),
TIME_NO_DEFAULT("time2", null),
NEW_CONF("new-key", "value");
private final String key;
private final Object dflt;
private Entry(String key, Object dflt) {
this.key = key;
this.dflt = dflt;
}
@Override
public String key() { return key; }
@Override
public Object dflt() { return dflt; }
}
TestConf(Properties p) {
super(p);
}
private static final Map<String, DeprecatedConf> configsWithAlternatives
= Collections.unmodifiableMap(new HashMap<String, DeprecatedConf>() {{
put(TestConf.Entry.NEW_CONF.key, DepConf.DEP_WITH_ALT);
}});
private static final Map<String, DeprecatedConf> deprecatedConfigs
= Collections.unmodifiableMap(new HashMap<String, DeprecatedConf>() {{
put(DepConf.DEP_NO_ALT.key, DepConf.DEP_NO_ALT);
}});
protected Map<String, DeprecatedConf> getConfigsWithAlternatives() {
return configsWithAlternatives;
}
protected Map<String, DeprecatedConf> getDeprecatedConfigs() {
return deprecatedConfigs;
}
static enum DepConf implements DeprecatedConf {
DEP_WITH_ALT("dep_alt", "0.4"),
DEP_NO_ALT("depKey", "1.0");
private final String key;
private final String version;
private final String deprecationMessage;
private DepConf(String key, String version) {
this(key, version, "");
}
private DepConf(String key, String version, String deprecationMessage) {
this.key = key;
this.version = version;
this.deprecationMessage = deprecationMessage;
}
@Override
public String key() { return key; }
@Override
public String version() { return version; }
@Override
public String deprecationMessage() { return deprecationMessage; }
}
}
}