/** * Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET * (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije * informacijske družbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE * COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVAÇÃO, SA (PTIN), IBM Corp., * INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM * ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC)) * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.societies.platform.activityfeed; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.json.JSONException; import org.json.JSONObject; import org.junit.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.activity.ActivityFeed; import org.societies.activity.ActivityFeedManager; import org.societies.activity.model.Activity; import org.societies.api.activity.IActivity; import org.societies.api.comm.xmpp.exceptions.CommunicationException; import org.societies.api.comm.xmpp.exceptions.XMPPError; import org.societies.api.comm.xmpp.interfaces.ICommManager; import org.societies.api.comm.xmpp.pubsub.PubsubClient; import org.societies.api.identity.IIdentity; import org.societies.api.identity.IIdentityManager; import org.societies.api.identity.InvalidFormatException; import org.societies.api.internal.sns.ISocialConnector; import org.societies.api.schema.sns.socialdata.model.SocialNetwork; import org.societies.platform.socialdata.SocialData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.stub; import static org.mockito.Mockito.when; /** * * * @author bjornmagnus adopted from solutanet * */ @ContextConfiguration(locations = { "classpath:META-INF/ActivityFeedTest-context.xml"}) public class ActivityFeedTest extends AbstractTransactionalJUnit4SpringContextTests { private static Logger LOG = LoggerFactory .getLogger(ActivityFeedTest.class); @Autowired private SessionFactory sessionFactory; private static ActivityFeedManager activityFeedManager; private ActivityFeed actFeed; //mocks private static ICommManager mockCSSendpoint = mock(ICommManager.class); private static IIdentityManager mockIdentityManager = mock(IIdentityManager.class); private static IIdentity mockIdentity = mock(IIdentity.class); private static final String FEED_ID="1"; private static final String FEED_JID="sintef"; private static PubsubClient mockPubsubClient = mock(PubsubClient.class); private static List<String> mockDicoItems = new ArrayList<String>(); static { ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); } int feedid=0; @BeforeClass public static void setupBeforeClass() throws InvalidFormatException, CommunicationException, XMPPError { mockDicoItems.add(FEED_ID); when(mockCSSendpoint.getIdManager()).thenReturn(mockIdentityManager); when(mockIdentityManager.fromJid(FEED_JID)).thenReturn(mockIdentity); when(mockPubsubClient.discoItems(mockIdentity,FEED_ID)).thenReturn(mockDicoItems); activityFeedManager = new ActivityFeedManager(); activityFeedManager.setCommManager(mockCSSendpoint); activityFeedManager.setPubSubClient(mockPubsubClient); } @Before public void setupBefore() throws Exception { activityFeedManager.setSessionFactory(this.sessionFactory); actFeed = (ActivityFeed) activityFeedManager.getOrCreateFeed(FEED_JID,FEED_ID, false); } @After public void tearDownAfter() throws Exception { actFeed.clear(); actFeed = null; } @Test @Rollback(false) public void testAddCisActivity() { LOG.info("@@@@@@@ IN TESTADDACTIVITY @@@@@@@"); actFeed.setId("1"); actFeed.startUp(sessionFactory); String actor="testUsertestAddCisActivity"; String verb="published"; IActivity iact = new Activity(); iact.setActor(actor); iact.setPublished(Long.toString(System.currentTimeMillis())); iact.setVerb(verb); iact.setObject("message"); iact.setTarget("testTarget"); actFeed.addActivityToDB(iact); List<IActivity> results = null; try { JSONObject searchQuery = new JSONObject(); String timeSeries = "0 "+Long.toString(System.currentTimeMillis()); try { searchQuery.append("filterBy", "actor"); searchQuery.append("filterOp", "equals"); searchQuery.append("filterValue", actor); } catch (JSONException e) { e.printStackTrace(); } LOG.info("sending timeSeries: "+timeSeries+ " act published: "+iact.getPublished()); results = actFeed.getActivitiesFromDB(searchQuery.toString(), timeSeries); LOG.info("testing filtering filter result: "+results.size()); } catch (Exception e) { // TODO Auto-generated catch block LOG.error("exception in test:", e); } assertNotNull(results); assert(results.size()>0); assert(results.get(0).getActor().equals(actor)); } @Test @Rollback(false) public void testCleanupFeed() { LOG.info("@@@@@@@ IN TESTCLEANUPFEED @@@@@@@"); actFeed.setId("2"); actFeed.startUp(sessionFactory); JSONObject searchQuery = new JSONObject(); String timeSeries = "0 "+Long.toString(System.currentTimeMillis()); try { searchQuery.append("filterBy", "actor"); searchQuery.append("filterOp", "present"); searchQuery.append("filterValue", ""); } catch (JSONException e) { e.printStackTrace(); } try{ actFeed.cleanupFeed(searchQuery.toString()); }catch(Exception e){ } } //@Ignore // this test runs when running on junit in eclipse but fails when testing with maven @Test @Rollback(false) public void testFilter(){ LOG.info("@@@@@@@ IN TESTFILTER @@@@@@@"); actFeed.setId("2"); actFeed.startUp(sessionFactory); String actor="testFilterUser"; Activity act1 = new Activity(); act1.setActor(actor); act1.setPublished(Long.toString(System.currentTimeMillis()-100)); actFeed.addActivityToDB(act1); String timeSeries = Long.toString(System.currentTimeMillis()-1000)+" "+Long.toString(System.currentTimeMillis()); JSONObject searchQuery = new JSONObject(); try { searchQuery.append("filterBy", "actor"); searchQuery.append("filterOp", "equals"); searchQuery.append("filterValue", actor); } catch (JSONException e) { e.printStackTrace(); } LOG.info("sending timeSeries: "+timeSeries+ " act published: "+act1.getPublished()); List<IActivity> results = actFeed.getActivitiesFromDB(searchQuery.toString(), timeSeries); LOG.info("testing filtering filter result: "+results.size()); assert(results.size() > 0); } // @Test // @Rollback(true) // public void testBootStrap(){ // LOG.info("@@@@@@@ IN TESTBOOTSTRAP @@@@@@@"); // SessionFactory ses = ActivityFeed.getStaticSessionFactory(); // Session s = ses.openSession(); // Transaction t = s.beginTransaction(); // t.begin(); // for(int i=0;i<10;i++){ // ActivityFeed feed = new ActivityFeed(Integer.toString(i)); // // s.save(feed); // } // t.commit(); // ActivityFeed queryFeed = ActivityFeed.startUp("0"); // assert(queryFeed != null); // } @Test @Rollback(false) public void testSNImporter(){ LOG.info("@@@@@@@ IN TESTSNIMPORTER @@@@@@@"); actFeed.setId("4"); actFeed.startUp(sessionFactory); LOG.info("actFeedcontent: "+ actFeed.getActivitiesFromDB("0 " + Long.toString(System.currentTimeMillis())).size()); ISocialConnector mockedSocialConnector; mockedSocialConnector = mock(ISocialConnector.class); stub(mockedSocialConnector.getConnectorName()).toReturn("facebook"); stub(mockedSocialConnector.getID()).toReturn("facebook_0001"); stub(mockedSocialConnector.getSocialNetwork()).toReturn(SocialNetwork.FACEBOOK); try { stub(mockedSocialConnector.getUserFriends()).toReturn(readFileAsString("mocks/friends.txt")); stub(mockedSocialConnector.getUserActivities()).toReturn(readFileAsString("mocks/activities.txt")); stub(mockedSocialConnector.getUserGroups()).toReturn(readFileAsString("mocks/groups.txt")); stub(mockedSocialConnector.getUserProfile()).toReturn(readFileAsString("mocks/profile.txt")); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } SocialData data = new SocialData(); try { data.addSocialConnector(mockedSocialConnector); } catch (Exception e) { e.printStackTrace(); } data.updateSocialData(); actFeed.importActivityEntries(data.getSocialActivity()); LOG.info("testing importing from facebook, raw activities: " + mockedSocialConnector.getUserActivities()); LOG.info("testing importing from facebook, activities: " + data.getSocialActivity().size() ); LOG.info("feed-hash: "+actFeed.hashCode()+" feed.getActivitiesFromDB(\"0 \" + Long.toString(System.currentTimeMillis())).size(): " + actFeed.getActivitiesFromDB("0 " + Long.toString(System.currentTimeMillis())).size()); LOG.info("comparing with: "+data.getSocialActivity().size()); assert(data.getSocialActivity().size() == actFeed.getActivitiesFromDB("0 " + Long.toString(System.currentTimeMillis())).size()); } //@Ignore @Test @Rollback(true) public void testReboot() { LOG.info("@@@@@@@ IN TESTREBOOT @@@@@@@"); String actor="testRebootActor"; String verb="published"; actFeed.setId("5"); actFeed.startUp(sessionFactory); IActivity iact = new Activity(); iact.setActor(actor); iact.setPublished(Long.toString(System.currentTimeMillis())); iact.setVerb(verb); iact.setObject("message"); iact.setTarget("testTarget"); actFeed.addActivityToDB(iact); // Session session = ActivityFeed.getStaticSessionFactory().openSession();//getSessionFactory().openSession(); // Transaction t = session.beginTransaction(); // session.update(actFeed); // t.commit(); //actFeed.startUp(session,"1"); List<IActivity> results = null; try { JSONObject searchQuery = new JSONObject(); String timeSeries = "0 "+Long.toString(System.currentTimeMillis()); try { searchQuery.append("filterBy", "actor"); searchQuery.append("filterOp", "equals"); searchQuery.append("filterValue", actor); } catch (JSONException e) { e.printStackTrace(); } LOG.info("sending timeSeries: "+timeSeries+ " act published: "+iact.getPublished()); results = actFeed.getActivitiesFromDB(searchQuery.toString(), timeSeries); LOG.info("testing filtering filter result: "+results.size()); } catch (Exception e) { LOG.error("Test exception: ",e); } //assert(results!=null); assert(results.size()>0); assert(results.get(0).getActor().equals(actor)); } @Test @Rollback(false) public void testAddCisActivityAsync() { actFeed.setId("6"); actFeed.startUp(sessionFactory); String actor="testAddCisActivityAsync"; String verb="published"; IActivity iact = new Activity(); iact.setActor(actor); iact.setPublished(Long.toString(System.currentTimeMillis())); iact.setVerb(verb); iact.setObject("message"); iact.setTarget("testTarget"); actFeed.addActivity(iact); // becuase it's async, clients don;t have to wait for it to be added // to continue, but for purpose of test, we need to sleep before we call getactivities try { Thread.sleep(5000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } List<IActivity> results = null; try { JSONObject searchQuery = new JSONObject(); String timeSeries = "0 "+Long.toString(System.currentTimeMillis()); try { searchQuery.append("filterBy", "actor"); searchQuery.append("filterOp", "equals"); searchQuery.append("filterValue", actor); } catch (JSONException e) { e.printStackTrace(); } LOG.info("sending timeSeries: "+timeSeries+ " act published: "+iact.getPublished()); results = actFeed.getActivities(searchQuery.toString(), timeSeries, 0).get(); LOG.info("testing filtering filter result: "+results.size()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } assertNotNull(results); assert(results.size()>0); assert(results.get(0).getActor().equals(actor)); } private static String readFileAsString(String filePath) throws java.io.IOException{ StringBuffer fileData = new StringBuffer(1000); BufferedReader reader = new BufferedReader( new FileReader(filePath)); char[] buf = new char[1024]; int numRead=0; while((numRead=reader.read(buf)) != -1){ String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } reader.close(); return fileData.toString(); } }