package org.gcube.application.geoportal.service.engine.caches; import ch.qos.logback.core.net.SyslogOutputStream; import com.mongodb.MongoWaitQueueFullException; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.cms.tests.model.TestModel; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.service.BasicServiceTestUnit; import org.gcube.application.geoportal.service.engine.ImplementationProvider; import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.engine.providers.AbstractScopedMap; import org.gcube.application.geoportal.service.engine.providers.TTLObject; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalUnit; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import static org.junit.Assert.assertTrue; @Slf4j public class Caches extends BasicServiceTestUnit { @Test public void testCache() throws ConfigurationException { TokenSetter.set("/gcube/devsec/devVRE"); Duration ttl=Duration.of(10, ChronoUnit.SECONDS); Duration monitorWindow=Duration.of(100, ChronoUnit.SECONDS); DummyCache cache= new DummyCache(); cache.setTTL(ttl); Instant startMonitoring=Instant.now(); LocalDateTime previous=cache.getObject(); while(Duration.between(startMonitoring,Instant.now()).compareTo(monitorWindow)<0){ LocalDateTime obj= cache.getObject(); if(obj.equals(previous)){ //objects are equals, TTL should be valid // Assert : now-creationTime < TTL assertTrue(Duration.between(obj,LocalDateTime.now()).compareTo(ttl)<0); }else { // different object only after TTL // Assert : now-creationTime < TTL assertTrue(Duration.between(obj,LocalDateTime.now()).compareTo(ttl)<0); // Assert : now-previous.creationTime > TTL assertTrue(Duration.between(previous,LocalDateTime.now()).compareTo(ttl)>0); } previous=obj; try { Thread.sleep(ttl.abs().dividedBy(2).toMillis()); } catch (InterruptedException e) { } } } @Test public void mongoconnections() throws ConfigurationException, InterruptedException { TokenSetter.set(scope); ExecutorService service = Executors.newFixedThreadPool(1000); LocalDateTime start=LocalDateTime.now(); AtomicLong executed = new AtomicLong(0); AtomicLong launched = new AtomicLong(0); //for 100 secs while(Duration.between(start,LocalDateTime.now()). compareTo(Duration.of(100, ChronoUnit.SECONDS))<0){ service.execute(new Runnable() { @Override public void run() { try { new ConcessioniMongoManager().list(); } catch (ConfigurationException e) { e.printStackTrace(); } catch (MongoWaitQueueFullException e) { log.info("Too many connections... "); }finally{ executed.incrementAndGet(); try {Thread.sleep(500);} catch (InterruptedException i) {} } } }); launched.incrementAndGet(); } while (!service.awaitTermination(2, TimeUnit.MINUTES)) { log.info("Waiting .. completed {}, out of {} ",executed.get(),launched.get()); if(executed.get()==launched.get()) service.shutdown(); } } @Test public void testStorageCache() throws ConfigurationException, FileNotFoundException, InterruptedException { TokenSetter.set(scope); ExecutorService service = Executors.newFixedThreadPool(10); LocalDateTime start=LocalDateTime.now(); AtomicLong executed = new AtomicLong(0); AtomicLong launched = new AtomicLong(0); final StorageUtils storage=ImplementationProvider.get().getStorageProvider().getObject(); String id =storage.putOntoStorage(new File(TestModel.getBaseFolder(),"relazione.pdf"))[0].getId(); //for 100 secs while(Duration.between(start,LocalDateTime.now()). compareTo(Duration.of(100, ChronoUnit.SECONDS))<0){ service.execute(new Runnable() { @Override public void run() { try { try {Thread.sleep(1000);} catch (InterruptedException i) {} System.out.println(ImplementationProvider.get().getStorageProvider().getObject().getURL(id)); // storage.getURL(id); } catch (ConfigurationException e) { e.printStackTrace(); } catch (MongoWaitQueueFullException e) { log.info("Too many connections... "); }finally{ executed.incrementAndGet(); try {Thread.sleep(500);} catch (InterruptedException i) {} } } }); launched.incrementAndGet(); } while (!service.awaitTermination(2, TimeUnit.MINUTES)) { log.info("Waiting .. completed {}, out of {} ",executed.get(),launched.get()); if(executed.get()==launched.get()) service.shutdown(); } } }