44package com .typesafe .config .impl
55
66import java .math .BigInteger
7- import java .time .temporal .{ ChronoUnit , TemporalUnit }
8-
7+ import java .time .temporal .{ChronoUnit , TemporalUnit }
8+ import java .util
9+ import java .util .concurrent .TimeUnit
10+ import java .util .concurrent .TimeUnit .{DAYS , HOURS , MICROSECONDS , MILLISECONDS , MINUTES , NANOSECONDS , SECONDS }
911import org .junit .Assert ._
1012import org .junit ._
1113import com .typesafe .config ._
12- import java .util .concurrent .TimeUnit
1314
1415import scala .collection .JavaConverters ._
1516import com .typesafe .config .ConfigResolveOptions
16- import java .util .concurrent .TimeUnit .{ DAYS , HOURS , MICROSECONDS , MILLISECONDS , MINUTES , NANOSECONDS , SECONDS }
1717
1818class ConfigTest extends TestUtils {
1919
@@ -1223,6 +1223,16 @@ class ConfigTest extends TestUtils {
12231223 | # env variables
12241224 | "<env variable>"
12251225 | ]""" .stripMargin))
1226+ assertTrue(rendered1.contains(
1227+ """ | "myList" : [
1228+ | # env variables
1229+ | "<env variable>",
1230+ | # env variables
1231+ | "<env variable>",
1232+ | # env variables
1233+ | "<env variable>"
1234+ | ]""" .stripMargin
1235+ ))
12261236
12271237 val showRenderOpt = ConfigRenderOptions .defaults()
12281238 val rendered2 = config.root().render(showRenderOpt)
@@ -1236,6 +1246,57 @@ class ConfigTest extends TestUtils {
12361246 | ]""" .stripMargin))
12371247 }
12381248
1249+ @ Test
1250+ def envVariableListExpansion (): Unit = {
1251+ val config = ConfigFactory .load(" env-variables" )
1252+
1253+ val myList = config.getStringList(" myList" )
1254+ assertEquals(" basic environment variable list expansion" , 3 , myList.size())
1255+ assertEquals(" a" , myList.get(0 ))
1256+ assertEquals(" b" , myList.get(1 ))
1257+ assertEquals(" c" , myList.get(2 ))
1258+
1259+ val myOptionalList = config.getStringList(" myOptionalList" )
1260+ assertEquals(" optional environment variable list expansion" , 3 , myOptionalList.size())
1261+ assertEquals(" a" , myOptionalList.get(0 ))
1262+
1263+ assertFalse(" optional environment variable list expansion (undefined)" , config.hasPath(" myOptionalUndefinedList" ))
1264+
1265+ val numList = config.getIntList(" numList" )
1266+ assertEquals(" environment variable list conversion" , 3 , numList.size())
1267+ assertEquals(1 , numList.get(0 ).intValue())
1268+ assertEquals(2 , numList.get(1 ).intValue())
1269+ assertEquals(3 , numList.get(2 ).intValue())
1270+ }
1271+
1272+ @ Test
1273+ def envVariableListExpansionAppend (): Unit = {
1274+ val config = ConfigFactory .load(" env-variables" )
1275+
1276+ // list: ["x", "y"] ${?MY_LIST[]}
1277+ val prepended = config.getStringList(" prependedList" )
1278+ assertEquals(" prepend static values before env var list" , util.Arrays .asList(" x" , " y" , " a" , " b" , " c" ), prepended)
1279+
1280+ // list: ${?MY_LIST[]} ["x", "y"]
1281+ val appended = config.getStringList(" appendedList" )
1282+ assertEquals(" append static values after env var list" , util.Arrays .asList(" a" , " b" , " c" , " x" , " y" ), appended)
1283+
1284+ // myList = ["x"]; myList = ${?myList} ${?MY_LIST[]}
1285+ val selfAppended = config.getStringList(" selfAppendedList" )
1286+ assertEquals(" self-referential append" , util.Arrays .asList(" x" , " a" , " b" , " c" ), selfAppended)
1287+
1288+ val appendedUndefined = config.getStringList(" appendedUndefined" )
1289+ assertEquals(" appending undefined optional list leaves original intact" , util.Arrays .asList(" x" , " y" ), appendedUndefined)
1290+ }
1291+
1292+ @ Test
1293+ def envVariableListExpansionRequiredUndefined (): Unit = {
1294+ val e = intercept[ConfigException .UnresolvedSubstitution ] {
1295+ ConfigFactory .parseString(" foo = ${UNDEFINED_LIST[]}" ).resolve()
1296+ }
1297+ assertTrue(e.getMessage.contains(" UNDEFINED_LIST" ))
1298+ }
1299+
12391300 @ Test
12401301 def serializeRoundTrip () {
12411302 for (i <- 1 to 10 ) {
0 commit comments