1616
1717package io .grpc ;
1818
19+ import static com .google .common .truth .Truth .assertThat ;
1920import static org .junit .Assert .assertEquals ;
2021import static org .junit .Assert .assertFalse ;
2122import static org .junit .Assert .assertNull ;
2223import static org .junit .Assert .assertSame ;
2324import static org .junit .Assert .assertTrue ;
2425import static org .junit .Assert .fail ;
2526
27+ import com .google .common .base .Supplier ;
2628import com .google .common .collect .ImmutableList ;
2729import io .grpc .InternalServiceProviders .PriorityAccessor ;
2830import java .util .Collections ;
2931import java .util .Iterator ;
3032import java .util .List ;
3133import java .util .ServiceConfigurationError ;
34+ import java .util .ServiceLoader ;
35+ import org .junit .After ;
3236import org .junit .Test ;
3337import org .junit .runner .RunWith ;
3438import org .junit .runners .JUnit4 ;
3539
3640/** Unit tests for {@link ServiceProviders}. */
3741@ RunWith (JUnit4 .class )
3842public class ServiceProvidersTest {
39- private static final List <Class <?>> NO_HARDCODED = Collections .emptyList ();
4043 private static final PriorityAccessor <ServiceProvidersTestAbstractProvider > ACCESSOR =
4144 new PriorityAccessor <ServiceProvidersTestAbstractProvider >() {
4245 @ Override
@@ -51,6 +54,19 @@ public int getPriority(ServiceProvidersTestAbstractProvider provider) {
5154 };
5255 private final String serviceFile =
5356 "META-INF/services/io.grpc.ServiceProvidersTestAbstractProvider" ;
57+ private boolean failingHardCodedAccessed ;
58+ private final Supplier <Iterable <Class <?>>> failingHardCoded = new Supplier <Iterable <Class <?>>>() {
59+ @ Override
60+ public Iterable <Class <?>> get () {
61+ failingHardCodedAccessed = true ;
62+ throw new AssertionError ();
63+ }
64+ };
65+
66+ @ After
67+ public void tearDown () {
68+ assertThat (failingHardCodedAccessed ).isFalse ();
69+ }
5470
5571 @ Test
5672 public void contextClassLoaderProvider () {
@@ -69,7 +85,8 @@ public void contextClassLoaderProvider() {
6985 Thread .currentThread ().setContextClassLoader (rcll );
7086 assertEquals (
7187 Available7Provider .class ,
72- load (ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR ).getClass ());
88+ load (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR )
89+ .getClass ());
7390 } finally {
7491 Thread .currentThread ().setContextClassLoader (ccl );
7592 }
@@ -84,7 +101,7 @@ public void noProvider() {
84101 serviceFile ,
85102 "io/grpc/ServiceProvidersTestAbstractProvider-doesNotExist.txt" );
86103 Thread .currentThread ().setContextClassLoader (cl );
87- assertNull (load (ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR ));
104+ assertNull (load (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR ));
88105 } finally {
89106 Thread .currentThread ().setContextClassLoader (ccl );
90107 }
@@ -96,10 +113,11 @@ public void multipleProvider() throws Exception {
96113 "io/grpc/ServiceProvidersTestAbstractProvider-multipleProvider.txt" );
97114 assertSame (
98115 Available7Provider .class ,
99- load (ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR ).getClass ());
116+ load (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR )
117+ .getClass ());
100118
101- List <ServiceProvidersTestAbstractProvider > providers = ServiceProviders . loadAll (
102- ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR );
119+ List <ServiceProvidersTestAbstractProvider > providers = loadAll (
120+ ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR );
103121 assertEquals (3 , providers .size ());
104122 assertEquals (Available7Provider .class , providers .get (0 ).getClass ());
105123 assertEquals (Available5Provider .class , providers .get (1 ).getClass ());
@@ -113,16 +131,16 @@ public void unavailableProvider() {
113131 "io/grpc/ServiceProvidersTestAbstractProvider-unavailableProvider.txt" );
114132 assertEquals (
115133 Available7Provider .class ,
116- load (ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR ).getClass ());
134+ load (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR )
135+ .getClass ());
117136 }
118137
119138 @ Test
120139 public void unknownClassProvider () {
121140 ClassLoader cl = new ReplacingClassLoader (getClass ().getClassLoader (), serviceFile ,
122141 "io/grpc/ServiceProvidersTestAbstractProvider-unknownClassProvider.txt" );
123142 try {
124- ServiceProviders .loadAll (
125- ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR );
143+ loadAll (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR );
126144 fail ("Exception expected" );
127145 } catch (ServiceConfigurationError e ) {
128146 // noop
@@ -136,8 +154,7 @@ public void exceptionSurfacedToCaller_failAtInit() {
136154 try {
137155 // Even though there is a working provider, if any providers fail then we should fail
138156 // completely to avoid returning something unexpected.
139- ServiceProviders .loadAll (
140- ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR );
157+ loadAll (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR );
141158 fail ("Expected exception" );
142159 } catch (ServiceConfigurationError expected ) {
143160 // noop
@@ -150,8 +167,7 @@ public void exceptionSurfacedToCaller_failAtPriority() {
150167 "io/grpc/ServiceProvidersTestAbstractProvider-failAtPriorityProvider.txt" );
151168 try {
152169 // The exception should be surfaced to the caller
153- ServiceProviders .loadAll (
154- ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR );
170+ loadAll (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR );
155171 fail ("Expected exception" );
156172 } catch (FailAtPriorityProvider .PriorityException expected ) {
157173 // noop
@@ -164,8 +180,7 @@ public void exceptionSurfacedToCaller_failAtAvailable() {
164180 "io/grpc/ServiceProvidersTestAbstractProvider-failAtAvailableProvider.txt" );
165181 try {
166182 // The exception should be surfaced to the caller
167- ServiceProviders .loadAll (
168- ServiceProvidersTestAbstractProvider .class , NO_HARDCODED , cl , ACCESSOR );
183+ loadAll (ServiceProvidersTestAbstractProvider .class , failingHardCoded , cl , ACCESSOR );
169184 fail ("Expected exception" );
170185 } catch (FailAtAvailableProvider .AvailableException expected ) {
171186 // noop
@@ -242,16 +257,28 @@ class RandomClass {}
242257
243258 private static <T > T load (
244259 Class <T > klass ,
245- Iterable <Class <?>> hardcoded ,
260+ Supplier < Iterable <Class <?>>> hardCoded ,
246261 ClassLoader cl ,
247262 PriorityAccessor <T > priorityAccessor ) {
248- List <T > candidates = ServiceProviders . loadAll (klass , hardcoded , cl , priorityAccessor );
263+ List <T > candidates = loadAll (klass , hardCoded , cl , priorityAccessor );
249264 if (candidates .isEmpty ()) {
250265 return null ;
251266 }
252267 return candidates .get (0 );
253268 }
254269
270+ private static <T > List <T > loadAll (
271+ Class <T > klass ,
272+ Supplier <Iterable <Class <?>>> hardCoded ,
273+ ClassLoader classLoader ,
274+ PriorityAccessor <T > priorityAccessor ) {
275+ return ServiceProviders .loadAll (
276+ klass ,
277+ ServiceLoader .load (klass , classLoader ).iterator (),
278+ hardCoded ,
279+ priorityAccessor );
280+ }
281+
255282 private static class BaseProvider extends ServiceProvidersTestAbstractProvider {
256283 private final boolean isAvailable ;
257284 private final int priority ;
0 commit comments