View Javadoc

1   /*
2    * Grapht, an open source dependency injector.
3    * Copyright 2014-2015 various contributors (see CONTRIBUTORS.txt)
4    * Copyright 2010-2014 Regents of the University of Minnesota
5    *
6    * This program is free software; you can redistribute it and/or modify
7    * it under the terms of the GNU Lesser General Public License as
8    * published by the Free Software Foundation; either version 2.1 of the
9    * License, or (at your option) any later version.
10   *
11   * This program is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13   * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14   * details.
15   *
16   * You should have received a copy of the GNU General Public License along with
17   * this program; if not, write to the Free Software Foundation, Inc., 51
18   * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19   */
20  package org.grouplens.grapht.reflect;
21  
22  import org.apache.commons.lang3.SerializationException;
23  import org.apache.commons.lang3.SerializationUtils;
24  import org.grouplens.grapht.annotation.AliasFor;
25  import org.grouplens.grapht.annotation.AllowUnqualifiedMatch;
26  import org.grouplens.grapht.annotation.AnnotationBuilder;
27  import org.junit.Test;
28  
29  import javax.annotation.Nullable;
30  import javax.inject.Qualifier;
31  import java.io.InvalidObjectException;
32  import java.lang.annotation.Annotation;
33  import java.lang.annotation.Retention;
34  import java.lang.annotation.RetentionPolicy;
35  
36  import static org.hamcrest.Matchers.equalTo;
37  import static org.hamcrest.Matchers.instanceOf;
38  import static org.hamcrest.Matchers.not;
39  import static org.junit.Assert.assertThat;
40  import static org.junit.Assert.fail;
41  
42  public class QualifiersTest {
43      @Qualifier
44      @Retention(RetentionPolicy.RUNTIME)
45      public static @interface Qual {}
46  
47      @Qualifier
48      @Retention(RetentionPolicy.RUNTIME)
49      @AliasFor(Qual.class)
50      public static @interface AQual {}
51  
52      @Qualifier
53      @Retention(RetentionPolicy.RUNTIME)
54      @AliasFor(AQual.class)
55      public static @interface AAQual {}
56  
57      @Qualifier
58      @Retention(RetentionPolicy.RUNTIME)
59      @AliasFor(Qual.class)
60      public static @interface BadAlias {
61          /* aliases cannot have values */
62          String value();
63      }
64  
65      @Qualifier
66      @Retention(RetentionPolicy.RUNTIME)
67      @AliasFor(Circle2.class)
68      public static @interface Circle1 {}
69  
70      @Qualifier
71      @Retention(RetentionPolicy.RUNTIME)
72      @AliasFor(Circle1.class)
73      public static @interface Circle2 {}
74  
75      @Qualifier
76      @Retention(RetentionPolicy.RUNTIME)
77      public static @interface VQual {
78          String value();
79      }
80      @Qualifier
81      @Retention(RetentionPolicy.RUNTIME)
82      @AllowUnqualifiedMatch
83      public static @interface DftQual {}
84  
85      private Qual makeQual() {
86          return AnnotationBuilder.of(Qual.class).build();
87      }
88      private VQual makeVQual(String val) {
89          return AnnotationBuilder.of(VQual.class).set("value", val).build();
90      }
91      private DftQual makeDftQual() {
92          return AnnotationBuilder.of(DftQual.class).build();
93      }
94  
95      @Test
96      public void testIsQualifier() throws Exception {
97          assertThat(Qualifiers.isQualifier(Nullable.class),
98                     equalTo(false));
99          assertThat(Qualifiers.isQualifier(Qual.class),
100                    equalTo(true));
101     }
102 
103     @Test
104     public void testResolveAliasUnaliased() {
105         assertThat(Qualifiers.resolveAliases(Qual.class),
106                    equalTo((Class) Qual.class));
107     }
108 
109     @Test
110     public void testResolveAlias() {
111         assertThat(Qualifiers.resolveAliases(AQual.class),
112                    equalTo((Class) Qual.class));
113     }
114 
115     @Test
116     public void testResolveDoubleAlias() {
117         assertThat(Qualifiers.resolveAliases(AAQual.class),
118                    equalTo((Class) Qual.class));
119     }
120 
121     @Test
122     public void testRejectBadAlias() {
123         try {
124             Qualifiers.resolveAliases(BadAlias.class);
125             fail("resolving a bad alias should throw an exception");
126         } catch (IllegalArgumentException ex) {
127             /* expected */
128         }
129     }
130 
131     @Test
132     public void testRejectCircularAlias() {
133         try {
134             Qualifiers.resolveAliases(Circle2.class);
135             fail("resolving a circular alias should throw an exception");
136         } catch (IllegalArgumentException ex) {
137             /* expected */
138         }
139     }
140 
141     @Test
142     public void testMatchAny() throws Exception {
143         assertThat(Qualifiers.matchAny().matches(null),
144                    equalTo(true));
145         assertThat(Qualifiers.matchAny().matches(makeQual()),
146                    equalTo(true));
147         assertThat(Qualifiers.matchAny().matches(makeVQual("foo")),
148                    equalTo(true));
149         assertThat(Qualifiers.matchAny().matches(makeDftQual()),
150                    equalTo(true));
151         assertThat(Qualifiers.matchAny(), equalTo(Qualifiers.matchAny()));
152         assertThat(SerializationUtils.clone(Qualifiers.matchAny()),
153                    equalTo(Qualifiers.matchAny()));
154     }
155 
156     @Test
157     public void testMatchNone() throws Exception {
158         assertThat(Qualifiers.matchNone().matches(null),
159                    equalTo(true));
160         assertThat(Qualifiers.matchNone().matches(makeQual()),
161                    equalTo(false));
162         assertThat(Qualifiers.matchNone().matches(makeVQual("foo")),
163                    equalTo(false));
164         assertThat(Qualifiers.matchNone().matches(makeDftQual()),
165                    equalTo(false));
166         assertThat(Qualifiers.matchNone(), equalTo(Qualifiers.matchNone()));
167         assertThat(Qualifiers.matchNone(), not(equalTo(Qualifiers.matchAny())));
168         assertThat(SerializationUtils.clone(Qualifiers.matchNone()),
169                    equalTo(Qualifiers.matchNone()));
170         assertThat(Qualifiers.matchNone().toString(),
171                    equalTo("-"));
172     }
173 
174     @Test
175     public void testMatchNoneByNull() {
176         assertThat(Qualifiers.match((Class) null),
177                    equalTo(Qualifiers.matchNone()));
178         assertThat(Qualifiers.match((Annotation) null),
179                    equalTo(Qualifiers.matchNone()));
180     }
181 
182     @Test
183     public void testMatchDefault() throws Exception {
184         assertThat(Qualifiers.matchDefault().matches(null),
185                    equalTo(true));
186         assertThat(Qualifiers.matchDefault().matches(makeQual()),
187                    equalTo(false));
188         assertThat(Qualifiers.matchDefault().matches(makeVQual("foo")),
189                    equalTo(false));
190         assertThat(Qualifiers.matchDefault().matches(makeDftQual()),
191                    equalTo(true));
192         assertThat(Qualifiers.matchDefault(), equalTo(Qualifiers.matchDefault()));
193         assertThat(Qualifiers.matchDefault(), not(equalTo(Qualifiers.matchAny())));
194         assertThat(SerializationUtils.clone(Qualifiers.matchDefault()),
195                    equalTo(Qualifiers.matchDefault()));
196     }
197 
198     @Test
199     public void testMatchClass() throws Exception {
200         assertThat(Qualifiers.match(Qual.class).matches(null),
201                    equalTo(false));
202         assertThat(Qualifiers.match(Qual.class).matches(makeQual()),
203                    equalTo(true));
204         assertThat(Qualifiers.match(Qual.class).matches(makeVQual("foo")),
205                    equalTo(false));
206         assertThat(Qualifiers.match(VQual.class).matches(makeVQual("foo")),
207                    equalTo(true));
208         assertThat(Qualifiers.match(Qual.class), equalTo(Qualifiers.match(Qual.class)));
209         assertThat(Qualifiers.match(Qual.class), not(equalTo(Qualifiers.match(VQual.class))));
210         assertThat(Qualifiers.match(Qual.class), not(equalTo(Qualifiers.matchAny())));
211         assertThat(SerializationUtils.clone(Qualifiers.match(Qual.class)),
212                    equalTo(Qualifiers.match(Qual.class)));
213         assertThat(SerializationUtils.clone(Qualifiers.match(VQual.class)),
214                    equalTo(Qualifiers.match(VQual.class)));
215     }
216 
217     @Test
218     public void testClassMatcherBadClassError() {
219         Qualifiers.AnnotationClassMatcher.SerialProxy proxy =
220                 new Qualifiers.AnnotationClassMatcher.SerialProxy(String.class);
221         byte[] data = SerializationUtils.serialize(proxy);
222         try {
223             SerializationUtils.deserialize(data);
224             fail("deserialization should fail with error");
225         } catch (SerializationException e) {
226             assertThat(e.getCause(), instanceOf(InvalidObjectException.class));
227             assertThat(e.getCause().getCause(), instanceOf(ClassCastException.class));
228         }
229     }
230 
231     @Test
232     public void testMatchValue() throws Exception {
233         assertThat(Qualifiers.match(makeQual()).matches(null),
234                    equalTo(false));
235         assertThat(Qualifiers.match(makeQual()).matches(makeQual()),
236                    equalTo(true));
237         assertThat(Qualifiers.match(makeQual()).matches(makeVQual("foo")),
238                    equalTo(false));
239         assertThat(Qualifiers.match(makeVQual("foo")).matches(makeVQual("foo")),
240                    equalTo(true));
241         assertThat(Qualifiers.match(makeVQual("bar")).matches(makeVQual("foo")),
242                    equalTo(false));
243         assertThat(Qualifiers.match(makeQual()),
244                    equalTo(Qualifiers.match(makeQual())));
245         assertThat(Qualifiers.match(makeVQual("foo")),
246                    equalTo(Qualifiers.match(makeVQual("foo"))));
247         assertThat(Qualifiers.match(makeVQual("foo")),
248                    not(equalTo(Qualifiers.match(makeVQual("bar")))));
249         assertThat(SerializationUtils.clone(Qualifiers.match(makeQual())),
250                    equalTo(Qualifiers.match(makeQual())));
251         assertThat(SerializationUtils.clone(Qualifiers.match(makeVQual("foo"))),
252                    equalTo(Qualifiers.match(makeVQual("foo"))));
253     }
254 }