Skip to content

Commit 5eab7e4

Browse files
committed
Guice module breaks when binding configs of config that has empty list fix #1337
1 parent e3093c7 commit 5eab7e4

File tree

8 files changed

+105
-3
lines changed

8 files changed

+105
-3
lines changed

TODO

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
* tests and coverage
22
* server options from application.conf MUST override hardcoded settings
33
* raw responses, sendXXX should not allow decorator
4-
4+
* Add injection support for App instance. So we can annotated instance fields
55
* make reset headers on error configurable
66

77
* websockets

jooby/src/main/java/io/jooby/internal/ClassPathAssetSource.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
16
package io.jooby.internal;
27

38
import io.jooby.Asset;

jooby/src/main/java/io/jooby/internal/FileAsset.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
16
package io.jooby.internal;
27

38
import io.jooby.Asset;

jooby/src/main/java/io/jooby/internal/JarAsset.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
16
package io.jooby.internal;
27

38
import io.jooby.Asset;

jooby/src/main/java/io/jooby/internal/URLAsset.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
16
package io.jooby.internal;
27

38
import io.jooby.Asset;

modules/jooby-guice/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
<scope>test</scope>
3939
</dependency>
4040

41+
<dependency>
42+
<groupId>org.mockito</groupId>
43+
<artifactId>mockito-core</artifactId>
44+
</dependency>
45+
4146
<dependency>
4247
<groupId>org.jacoco</groupId>
4348
<artifactId>org.jacoco.agent</artifactId>

modules/jooby-guice/src/main/java/io/jooby/di/JoobyModule.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ private void configureResources(ServiceRegistry registry) {
6464
}
6565
}
6666

67-
private void configureEnv(Environment env) {
67+
/*package*/ void configureEnv(Environment env) {
6868
Config config = env.getConfig();
6969
bind(Config.class).toInstance(config);
7070
bind(Environment.class).toInstance(env);
@@ -76,7 +76,9 @@ private void configureEnv(Environment env) {
7676
Object value = entry.getValue().unwrapped();
7777
if (value instanceof List) {
7878
List values = (List) value;
79-
Type listType = Types.listOf(values.iterator().next().getClass());
79+
Type listType = values.size() == 0
80+
? Types.listOf(String.class)
81+
: Types.listOf(values.get(0).getClass());
8082
Key key = Key.get(listType, Names.named(name));
8183
bind(key).toInstance(values);
8284
value = values.stream().map(Object::toString).collect(Collectors.joining(","));
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.jooby.di;
2+
3+
import com.google.inject.Binder;
4+
import com.google.inject.Key;
5+
import com.google.inject.TypeLiteral;
6+
import com.google.inject.binder.AnnotatedBindingBuilder;
7+
import com.google.inject.binder.AnnotatedConstantBindingBuilder;
8+
import com.google.inject.binder.ConstantBindingBuilder;
9+
import com.google.inject.binder.LinkedBindingBuilder;
10+
import com.google.inject.name.Names;
11+
import com.google.inject.util.Types;
12+
import com.typesafe.config.Config;
13+
import com.typesafe.config.ConfigFactory;
14+
import io.jooby.Environment;
15+
import io.jooby.Jooby;
16+
import io.jooby.ServiceRegistry;
17+
import org.junit.jupiter.api.DisplayName;
18+
import org.junit.jupiter.api.Test;
19+
20+
import java.util.Collections;
21+
import java.util.HashMap;
22+
import java.util.List;
23+
import java.util.Map;
24+
25+
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.verify;
27+
import static org.mockito.Mockito.when;
28+
29+
public class JoobyModuleTest {
30+
@Test
31+
@DisplayName("Guice should not break on empty list property. Empty list fallback to List<String>")
32+
public void issue1337() {
33+
List<String> emptyList = Collections.emptyList();
34+
Map<String, Object> map = new HashMap<>();
35+
map.put("some", emptyList);
36+
37+
Config config = ConfigFactory.parseMap(map);
38+
39+
Environment environment = mock(Environment.class);
40+
when(environment.getConfig()).thenReturn(config);
41+
42+
ServiceRegistry registry = mock(ServiceRegistry.class);
43+
when(registry.entrySet()).thenReturn(Collections.emptySet());
44+
45+
Jooby app = mock(Jooby.class);
46+
when(app.getEnvironment()).thenReturn(environment);
47+
when(app.getServices()).thenReturn(registry);
48+
49+
Binder binder = mock(Binder.class);
50+
51+
AnnotatedBindingBuilder<Environment> envbinding = mock(AnnotatedBindingBuilder.class);
52+
when(binder.bind(Environment.class)).thenReturn(envbinding);
53+
54+
AnnotatedBindingBuilder<Config> confbinding = mock(AnnotatedBindingBuilder.class);
55+
when(binder.bind(Config.class)).thenReturn(confbinding);
56+
57+
LinkedBindingBuilder emptyListBinding = mock(LinkedBindingBuilder.class);
58+
emptyListBinding.toInstance(emptyList);
59+
when(binder.bind(Key.get(Types.listOf(String.class), Names.named("some")))).thenReturn(emptyListBinding);
60+
61+
ConstantBindingBuilder constantBindingBuilder = mock(ConstantBindingBuilder.class);
62+
constantBindingBuilder.to("");
63+
AnnotatedConstantBindingBuilder constantBinding = mock(AnnotatedConstantBindingBuilder.class);
64+
when(constantBinding.annotatedWith(Names.named("some"))).thenReturn(constantBindingBuilder);
65+
when(binder.bindConstant()).thenReturn(constantBinding);
66+
67+
JoobyModule module = new JoobyModule(app);
68+
69+
module.configure(binder);
70+
71+
verify(envbinding).toInstance(environment);
72+
verify(confbinding).toInstance(config);
73+
}
74+
75+
}

0 commit comments

Comments
 (0)