blob: b023aa1dfe5b9a1f90d2c4e6ac4d026aa9f4b994 [file] [log] [blame]
/**
* Copyright (C) 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.inject.internal;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import com.google.inject.Injector;
import com.google.inject.Key;
import java.util.Set;
/**
* Utilities for verifying com.google.inject.internal.WeakKeySet is not leaking memory.
*
* @author dweis@google.com (Daniel Weis)
*/
public final class WeakKeySetUtils {
private WeakKeySetUtils() {}
public static void assertBlacklisted(Injector injector, Key<?> key) {
assertBlacklistState(injector, key, true);
}
public static void assertNotBlacklisted(Injector injector, Key<?> key) {
assertBlacklistState(injector, key, false);
}
public static void assertNotInSet(WeakKeySet set, Key<?> key) {
// if we're expecting it to not be in the set, loop around and wait for threads to run.
for (int i = 0; i < 10; i++) {
if (!set.contains(key)) {
break;
}
sleep();
}
assertFalse(set.contains(key));
assertNull(set.getSources(Key.get(Integer.class)));
}
public static void assertInSet(WeakKeySet set, Key<?> key, int expectedSources,
Object... sources) {
assertTrue(set.contains(key));
assertEquals(expectedSources, set.getSources(key).size());
for (Object source : sources) {
assertTrue("didn't contain source: " + source, set.getSources(key).contains(source));
}
}
public static void assertSourceNotInSet(WeakKeySet set, Key<?> key, Object source) {
// if we're expecting it to not be a source, loop around and wait for threads to run.
for (int i = 0; i < 10; i++) {
Set<Object> sources = set.getSources(key);
assertNotNull("expected at least one source", source);
if (!sources.contains(source)) {
break;
}
sleep();
}
Set<Object> sources = set.getSources(key);
assertNotNull("expected at least one source", source);
assertFalse(sources.contains(source));
}
private static void assertBlacklistState(Injector injector, Key<?> key, boolean isBlacklisted) {
// if we're expecting it to not be blacklisted, loop around and wait for threads to run.
if (!isBlacklisted) {
for (int i = 0; i < 10; i++) {
if (!((InjectorImpl) injector).state.isBlacklisted(key)) {
break;
}
sleep();
}
}
assertEquals(isBlacklisted, ((InjectorImpl) injector).state.isBlacklisted(key));
}
private static void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Thread.yield();
}
}