package de.axone.cache.ng;
import static de.axone.cache.ng.CacheNGAssert.*;
import static de.axone.cache.ng.CacheNGTest_Implementations.*;
import static org.mockito.Mockito.*;
import static org.testng.Assert.*;
import org.testng.annotations.Test;
import de.axone.cache.ng.CacheNGTestHelpers.Aid;
import de.axone.cache.ng.CacheNGTestHelpers.RN;
import de.axone.cache.ng.CacheNGTestHelpers.TArticle;
import de.axone.cache.ng.CacheNGTest_ArticleForId.TestAccessor_ArticleForAid;
// TODO: Test events for Automatic invalidation with Timeouts!!!
@Test( groups="cacheng.events" )
public class CacheNGTest_Events {
public void listenersReceiveEvents() throws Exception {
TestAccessor_ArticleForAid accMaster = spy( new TestAccessor_ArticleForAid() );
TestAccessor_ArticleForAid accSlave = spy( new TestAccessor_ArticleForAid() );
CacheHashMap<Aid,TArticle> cacheMaster =
spy( new CacheHashMap<>( RN.AID_ARTICLE.unique() ) );
CacheNG.AutomaticClient<Aid, TArticle> autoMaster =
spy( new AutomaticClientImpl<Aid,TArticle>( cacheMaster ) );
CacheHashMap<Aid,TArticle> cacheSlave =
spy( new CacheHashMap<>( RN.AID_ARTICLE.unique() ) );
CacheNG.AutomaticClient<Aid, TArticle> autoSlave =
spy( new AutomaticClientImpl<Aid,TArticle>( cacheSlave ) );
TArticle art;
art = autoMaster.fetch( A12345, accMaster );
assertNotNull( art );
assertThat( autoMaster ).hasCached( A12345 );
verify( accMaster ).fetch( A12345 );
art = autoSlave.fetch( A12345, accSlave );
assertNotNull( art );
assertThat( autoMaster ).hasCached( A12345 );
verify( accSlave ).fetch( A12345 );
// Not connected so we keep the slave's content
autoMaster.invalidate( A12345 );
verify( autoMaster ).invalidate( A12345 ); // Yes. Same as line above
verify( accSlave, never() ).invalidateEvent( A12345 ); // Does not happen right now
assertThat( autoMaster ).hasNotCached( A12345 );
assertThat( autoSlave ).hasCached( A12345 );
// === Connect caches ================================
cacheMaster.registerListener( cacheSlave );
// Fetch again
art = autoMaster.fetch( A12345, accMaster );
assertNotNull( art );
assertThat( autoMaster ).hasCached( A12345 );
verify( accMaster, times( 2 ) ).fetch( A12345 );
// Invalidate connected caches
autoMaster.invalidate( A12345 );
verify( autoMaster, atLeastOnce() ).invalidate( A12345 ); // Yes. Same as line above
verify( cacheSlave ).invalidateEvent( A12345 ); // This is what we are looking for
assertThat( autoMaster ).hasNotCached( A12345 );
assertThat( autoSlave ).hasNotCached( A12345 );
// So we need to fetch it again using the accessor
art = autoSlave.fetch( A12345, accSlave );
verify( accSlave, times( 2 ) ).fetch( A12345 );
}
}