package no.java.incogito.application; import fj.F; import fj.P; import fj.P2; import fj.Unit; import fj.data.List; import fj.data.Option; import static fj.data.Option.some; import fj.data.Stream; import fj.data.TreeMap; import fj.pre.Ord; import fj.pre.Show; import no.java.ems.server.EmsServices; import no.java.incogito.IO; import static no.java.incogito.IO.Strings.stringToStream; import static no.java.incogito.PropertiesF.storePropertiesMap; import no.java.incogito.domain.Event; import no.java.incogito.domain.Schedule; import no.java.incogito.domain.Session; import no.java.incogito.domain.User; import no.java.incogito.domain.User.UserId; import static no.java.incogito.domain.User.createPristineUser; import no.java.incogito.domain.UserSessionAssociation.InterestLevel; import static no.java.incogito.domain.UserSessionAssociation.InterestLevel.ATTEND; import no.java.incogito.ems.server.DataGenerator; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import voldemort.server.VoldemortServer; import java.io.File; import java.net.URL; import java.util.Random; /** * @author <a href="mailto:trygve.laugstol@arktekk.no">Trygve Laugstøl</a> * @version $Id$ */ @ContextConfiguration(locations = {"classpath*:applicationContext.xml", "classpath:incogito-application-applicationContext-test.xml"}) @RunWith(SpringJUnit4ClassRunner.class) public class IncogitoApplicationIntegrationTest { private static final Logger logger = LoggerFactory.getLogger(IncogitoApplicationIntegrationTest.class); @Autowired IncogitoApplication incogito; @Autowired EmsServices services; @Autowired VoldemortServer voldemortServer; @Autowired @Qualifier("incogitoHome") File incogitoHome; @Autowired ConfigurationLoaderService configurationLoaderService; DataGenerator.DataSet1 dataSet; // All numbers but zero has twice the probability Stream<Integer> numbers = Stream.unfold(new F<Object, Option<P2<Integer, Object>>>() { private final Random random = new Random(0); public Option<P2<Integer, Object>> f(Object o) { return some(P.p(random.nextInt(Integer.MAX_VALUE), o)); } }, 0); @BeforeClass public static void beforeClass() throws Exception { logger.info("============================================================="); logger.info("===================== STARTING SETUP ========================"); logger.info("============================================================="); System.out.println(UserClient.SCHEMA); URL resource = IncogitoApplicationIntegrationTest.class.getResource("/"); File basedir = new File(resource.toURI().getPath()).getParentFile().getParentFile().getAbsoluteFile(); File etc = new File(basedir, "src/test/resources/cluster-it/node-it/etc"); if (!etc.isDirectory()) { assertTrue(etc.mkdirs()); } TreeMap<String, String> properties = TreeMap.<String, String>empty(Ord.stringOrd). set("baseurl", "http://"). set("events", "JavaZone 2008"); System.out.println("new File(etc, \"incogito.properties\").getAbsolutePath() = " + new File(etc, "incogito.properties").getAbsolutePath()); IO.runFileOutputStream(storePropertiesMap.f(properties), new File(etc, "incogito.properties")).call(); // System.out.println("properties = " + new java.util.TreeMap<String, String>(properties.toMutableMap()).toString().replace(',', '\n')); } @Before public void setUp() throws Exception { logger.info("============================================================="); logger.info("================ STARTING DATA GENERATION ==================="); logger.info("============================================================="); dataSet = new DataGenerator(services).generate1(); logger.info("============================================================="); logger.info("======================= SETUP DONE =========================="); logger.info("============================================================="); incogito.reloadConfiguration(); } // @Test // public void testBasic() { // final SessionId sessionA = new SessionId("session-a"); // final SessionId sessionB = new SessionId("session-b"); // // final UserId userId = new UserId("trygvis"); // // OperationResult<User> userOperationResult = incogito.getUser(userId); // // if (userOperationResult.isNotFound()) { // User user = createPristineUser(userId). // setInterestLevel(sessionA, ATTEND). // setInterestLevel(sessionB, INTEREST); // incogito.createUser(user); // } // // User user = incogito.getUser(userId).value(); // // assertEquals(userId.value, user.id.value); // assertEquals(userId, user.id); // assertEquals(2, user.sessionAssociations.size()); // // OperationResult<Schedule> scheduleOperationResult = // incogito.getSchedule(dataSet.javaZone2008.getName(), userId.value); // assertEquals(OperationResult.Status.OK, scheduleOperationResult.status); // } @Test public void testFrontPageTextAndAboutText() throws Exception { String ftext = "Some text content for front page!"; String atext = "Some text content for about page!"; assertNotNull(incogitoHome); assertTrue(incogitoHome.isDirectory()); File etc = new File(incogitoHome, "etc"); File frontPageText = new File(etc, "frontpage.txt"); File aboutText = new File(etc, "about.txt"); IO.runFileOutputStream(stringToStream.f(ftext), frontPageText).call(); IO.runFileOutputStream(stringToStream.f(atext), aboutText).call(); IncogitoConfiguration config = configurationLoaderService.loadConfiguration(incogitoHome, IncogitoConfiguration.unconfigured); assertTrue(config.getFrontPageText() != null); assertEquals(ftext, config.getFrontPageText()); assertTrue(config.getAboutText() != null); assertEquals(atext, config.getAboutText()); } @Test public void testLots() throws Exception { int nUsers = 10; List<Event> events = List.iterableList(incogito.getEvents().value()); int eventCount = events.length(); // Pre-load all sessions TreeMap<Event.EventId, List<Session>> sessionMap = TreeMap.empty(Event.EventId.ord); for (Event event : events) { // List<Session> sessionList = strategy.parList(incogito.getSessions(event.name).value())._1(); List<Session> sessionList = incogito.getSessions(event.name).value(); sessionMap = sessionMap.set(event.id, sessionList); } // Create all users. This will normally happen when logging in for (UserId userId : Stream.range(0, nUsers).map(Show.intShow.showS_()).map(UserId.userId)) { OperationResult<Unit> removeResult = incogito.removeUser(userId); assertTrue(removeResult.isOk() || removeResult.isNotFound()); assertEquals(OperationResult.Status.OK, incogito.createUser(User.createPristineUser(userId)).status); } // For each user for (UserId userId : Stream.range(0, nUsers).map(Show.intShow.showS_()).map(UserId.userId)) { // Select an event Event event = events.index(numbers.head() % eventCount); List<Session> sessions = sessionMap.get(event.id).some(); int nSessions = sessions.length(); InterestLevel[] interestLevels = InterestLevel.values(); for (Integer i : Stream.range(0, nSessions)) { Session session = sessions.index(i); InterestLevel interestLevel = interestLevels[numbers.head() % 3]; OperationResult result = incogito.setInterestLevel(userId.value, event.name, session.id, interestLevel); assertEquals(OperationResult.Status.OK, result.status); } } } public void testAttendance() { User user = createPristineUser(UserId.userIdFromString("trygvis")); OperationResult<User> userOperationResult = incogito.createUser(user); assertTrue(userOperationResult.isOk()); user = userOperationResult.value(); Event event = incogito.getEvents().value().head(); Session session = incogito.getSessions(event.name).value().head(); OperationResult operationResult = incogito.setInterestLevel(user.id.value, event.name, session.id, ATTEND); assertTrue(operationResult.isOk()); OperationResult<Schedule> scheduleOperationResult = incogito.getSchedule(event.name, user.id.value); assertTrue(scheduleOperationResult.isOk()); Schedule schedule = scheduleOperationResult.value(); List<Session> sessions = schedule.getAttendingSessions(); Show<List<Session>> sessionShow = Show.listShow(Show.showS(new F<Session, String>() { public String f(Session session) { return ToStringBuilder.reflectionToString(session, ToStringStyle.MULTI_LINE_STYLE); } })); sessionShow.println(sessions); // TODO: Add asserts for change of attendance and removal } }