1 /**
2  * Copyright (C) 2014 Google Inc.
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  *  http://www.apache.org/licenses/LICENSE-2.0
8  *
9  *  Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11  * express or implied. See the License for the specific language governing permissions and
12  * limitations under the License.
13  */
14 
15 package com.google.inject.internal;
16 
17 import static junit.framework.Assert.assertEquals;
18 import static junit.framework.Assert.assertFalse;
19 import static junit.framework.Assert.assertNotNull;
20 import static junit.framework.Assert.assertNull;
21 import static junit.framework.Assert.assertTrue;
22 
23 import com.google.inject.Injector;
24 import com.google.inject.Key;
25 
26 import java.util.Set;
27 
28 /**
29  * Utilities for verifying com.google.inject.internal.WeakKeySet is not leaking memory.
30  *
31  * @author dweis@google.com (Daniel Weis)
32  */
33 public final class WeakKeySetUtils {
34 
WeakKeySetUtils()35   private WeakKeySetUtils() {}
36 
assertBlacklisted(Injector injector, Key<?> key)37   public static void assertBlacklisted(Injector injector, Key<?> key) {
38     assertBlacklistState(injector, key, true);
39   }
40 
assertNotBlacklisted(Injector injector, Key<?> key)41   public static void assertNotBlacklisted(Injector injector, Key<?> key) {
42     assertBlacklistState(injector, key, false);
43   }
44 
assertNotInSet(WeakKeySet set, Key<?> key)45   public static void assertNotInSet(WeakKeySet set, Key<?> key) {
46     // if we're expecting it to not be in the set, loop around and wait for threads to run.
47     for (int i = 0; i < 10; i++) {
48       if (!set.contains(key)) {
49         break;
50       }
51       sleep();
52     }
53     assertFalse(set.contains(key));
54     assertNull(set.getSources(Key.get(Integer.class)));
55   }
56 
assertInSet(WeakKeySet set, Key<?> key, int expectedSources, Object... sources)57   public static void assertInSet(WeakKeySet set, Key<?> key, int expectedSources,
58       Object... sources) {
59     assertTrue(set.contains(key));
60     assertEquals(expectedSources, set.getSources(key).size());
61     for (Object source : sources) {
62       assertTrue("didn't contain source: " + source, set.getSources(key).contains(source));
63     }
64   }
65 
assertSourceNotInSet(WeakKeySet set, Key<?> key, Object source)66   public static void assertSourceNotInSet(WeakKeySet set, Key<?> key, Object source) {
67     // if we're expecting it to not be a source, loop around and wait for threads to run.
68     for (int i = 0; i < 10; i++) {
69       Set<Object> sources = set.getSources(key);
70       assertNotNull("expected at least one source", source);
71       if (!sources.contains(source)) {
72         break;
73       }
74       sleep();
75     }
76     Set<Object> sources = set.getSources(key);
77     assertNotNull("expected at least one source", source);
78     assertFalse(sources.contains(source));
79   }
80 
assertBlacklistState(Injector injector, Key<?> key, boolean isBlacklisted)81   private static void assertBlacklistState(Injector injector, Key<?> key, boolean isBlacklisted) {
82     // if we're expecting it to not be blacklisted, loop around and wait for threads to run.
83     if (!isBlacklisted) {
84       for (int i = 0; i < 10; i++) {
85         if (!((InjectorImpl) injector).state.isBlacklisted(key)) {
86           break;
87         }
88         sleep();
89       }
90     }
91     assertEquals(isBlacklisted, ((InjectorImpl) injector).state.isBlacklisted(key));
92   }
93 
sleep()94   private static void sleep() {
95     try {
96       Thread.sleep(1000);
97     } catch (InterruptedException e) {
98       throw new RuntimeException(e);
99     }
100     Thread.yield();
101   }
102 }
103