package ru.rsdn.patterns.behavioral.observer.problems.leak;

import java.util.concurrent.CopyOnWriteArrayList;

import org.junit.Assert;
import org.junit.Test;

import ru.rsdn.patterns.behavioral.observer.AbstractPublisher;
import ru.rsdn.patterns.behavioral.observer.ISubscriber;

/**
 * Тестирование работы издателя с подписчиками, которые используют финализатор
 * для снятия регистрации, что приводит к утечке памяти
 */
public class MemoryLeakNotTrivialFinalizeSubscriberTest extends
		AbstractPublisher<CopyOnWriteArrayList<ISubscriber>> {
	private static final int N = 100;

	public MemoryLeakNotTrivialFinalizeSubscriberTest() {
		super(new CopyOnWriteArrayList<ISubscriber>());
	}

	@Test
	public void memoryLeakTest() {
		for (int i = 0; i < N; i++) {
			new NonTrivialFinalizeSubscriber(this);
			System.gc();
			Assert.assertTrue(getSubscribers().size() == i + 1);
		}
		System.gc();
		Assert.assertTrue(getSubscribers().size() == N);
	}
}
