Package org.rssowl.core.tests.connection

Source Code of org.rssowl.core.tests.connection.SyncConnectionTests

/*   **********************************************************************  **
**   Copyright notice                                                       **
**                                                                          **
**   (c) 2005-2009 RSSOwl Development Team                                  **
**   http://www.rssowl.org/                                                 **
**                                                                          **
**   All rights reserved                                                    **
**                                                                          **
**   This program and the accompanying materials are made available under   **
**   the terms of the Eclipse Public License v1.0 which accompanies this    **
**   distribution, and is available at:                                     **
**   http://www.rssowl.org/legal/epl-v10.html                               **
**                                                                          **
**   A copy is found in the file epl-v10.html and important notices to the  **
**   license from the team is found in the textfile LICENSE.txt distributed **
**   in this package.                                                       **
**                                                                          **
**   This copyright notice MUST APPEAR in all copies of the file!           **
**                                                                          **
**   Contributors:                                                          **
**     RSSOwl Development Team - initial API and implementation             **
**                                                                          **
**  **********************************************************************  */

package org.rssowl.core.tests.connection;

import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.junit.Before;
import org.junit.Test;
import org.rssowl.core.Owl;
import org.rssowl.core.connection.HttpConnectionInputStream;
import org.rssowl.core.connection.IConnectionPropertyConstants;
import org.rssowl.core.connection.IConnectionService;
import org.rssowl.core.connection.IProtocolHandler;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.internal.persist.service.PersistenceServiceImpl;
import org.rssowl.core.persist.IBookMark;
import org.rssowl.core.persist.IConditionalGet;
import org.rssowl.core.persist.IFeed;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IGuid;
import org.rssowl.core.persist.ILabel;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.event.NewsAdapter;
import org.rssowl.core.persist.event.NewsEvent;
import org.rssowl.core.persist.event.NewsListener;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.core.persist.reference.FeedLinkReference;
import org.rssowl.core.util.DateUtils;
import org.rssowl.core.util.SyncItem;
import org.rssowl.core.util.SyncUtils;
import org.rssowl.core.util.Triple;
import org.rssowl.ui.internal.Controller;
import org.rssowl.ui.internal.services.SyncItemsManager;
import org.rssowl.ui.internal.services.SyncService;
import org.rssowl.ui.internal.services.SyncService.SyncStatus;

import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
* This TestCase covers use-cases for the Connection Plugin.
*
* @author bpasero
*/
public class SyncConnectionTests {

  /**
   * @throws Exception
   */
  @Before
  public void setUp() throws Exception {
    ((PersistenceServiceImpl) Owl.getPersistenceService()).recreateSchemaForTests();
    SyncItemsManager manager = new SyncItemsManager();
    manager.startup();
    manager.clearUncommittedItems();
    manager.shutdown();
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testGetLabel() throws Exception {
    IConnectionService conManager = Owl.getConnectionService();
    URI feedUrl = new URI("reader://www.rssowl.org/node/feed");
    String label = conManager.getLabel(feedUrl, new NullProgressMonitor());
    assertEquals("RSSOwl News", label);
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testGetFavicon() throws Exception {
    IConnectionService conManager = Owl.getConnectionService();
    URI feedUrl = new URI("reader://www.rssowl.org/node/feed");
    byte[] feedIcon = conManager.getFeedIcon(feedUrl, new NullProgressMonitor());
    assertNotNull(feedIcon);
    assertTrue(feedIcon.length != 0);
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testLoadFeedFromWebsite() throws Exception {
    IConnectionService conManager = Owl.getConnectionService();
    URI feedUrl = new URI("reader://www.heise.de");

    assertEquals("http://www.heise.de/newsticker/heise-atom.xml", conManager.getFeed(feedUrl, new NullProgressMonitor()).toString());
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testReaderRecommendedNews() throws Exception {
    URI feedUrl = new URI(SyncUtils.GOOGLE_READER_RECOMMENDED_ITEMS_FEED);

    Triple<IFeed, IConditionalGet, URI> result = Owl.getConnectionService().reload(feedUrl, null, null);
    assertNotNull(result);

    IFeed feed = result.getFirst();

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testReaderHttpsFeed() throws Exception {
    URI feedUrl = new URI("https://sourceforge.net/export/rss2_projnews.php?group_id=141424&rss_fulltext=1");

    Triple<IFeed, IConditionalGet, URI> result = Owl.getConnectionService().reload(feedUrl, null, null);
    assertNotNull(result);

    IFeed feed = result.getFirst();

    assertNotNull(feed.getTitle());
    assertFalse(feed.getNews().isEmpty());
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testReaderSharedNews() throws Exception {
    URI feedUrl = new URI(SyncUtils.GOOGLE_READER_SHARED_ITEMS_FEED);

    Triple<IFeed, IConditionalGet, URI> result = Owl.getConnectionService().reload(feedUrl, null, null);
    assertNotNull(result);

    IFeed feed = result.getFirst();

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertEquals(1, feed.getNews().size());
    assertEquals("Hello World", feed.getNews().get(0).getDescription());
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testReaderNotes() throws Exception {
    URI feedUrl = new URI(SyncUtils.GOOGLE_READER_NOTES_FEED);

    Triple<IFeed, IConditionalGet, URI> result = Owl.getConnectionService().reload(feedUrl, null, null);
    assertNotNull(result);

    IFeed feed = result.getFirst();

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertEquals(1, feed.getNews().size());
    assertEquals("Hello World", feed.getNews().get(0).getDescription());
  }

  /**
   * @throws Exception
   */
  @Test
  public void testGzipConnectionInputStream() throws Exception {
    IConnectionService conManager = Owl.getConnectionService();
    URI url = new URI("http://www.google.com/reader/api/0/stream/contents/feed/http%3A%2F%2Frss.golem.de%2Frss.php%3Ffeed%3DRSS1.0?r=n&n=20&ck=" + System.currentTimeMillis() + "&client=scroll");
    IProtocolHandler handler = conManager.getHandler(url);

    Map<String, String> headers = new HashMap<String, String>();
    String token = SyncUtils.getGoogleAuthToken("rssowl@mailinator.com", "rssowl.org", true, new NullProgressMonitor());
    headers.put("Authorization", SyncUtils.getGoogleAuthorizationHeader(token));
    headers.put("Accept-Charset", "utf-8");
    headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1");

    Map<Object, Object> properties = new HashMap<Object, Object>();
    properties.put(IConnectionPropertyConstants.HEADERS, headers);

    InputStream stream = handler.openStream(url, null, properties);

    assertEquals("gzip", ((HttpConnectionInputStream) stream).getContentEncoding());
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testSpiegelFeedMarkReadAndUnread() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    URI feedUrl = new URI("reader://www.spiegel.de/schlagzeilen/index.rss");
    IFeed feed = Owl.getModelFactory().createFeed(null, feedUrl);
    DynamicDAO.save(feed);

    IBookMark bm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(feedUrl), "BM");
    DynamicDAO.save(root);

    /* Initial Load of Feed */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    List<INews> newNews = new ArrayList<INews>();
    for (INews news : feed.getNews()) {
      if (news.getState() == INews.State.NEW)
        newNews.add(news);
    }

    if (newNews.isEmpty())
      return; //Only works if some new news are present

    /* Test Outgoing Sync (mark read) */
    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    List<SyncItem> syncItems = new ArrayList<SyncItem>();
    for (INews news : newNews) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setMarkedRead();
      syncItems.add(item);
    }

    service.testSync(syncItems);

    /* Assert Status */
    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertTrue(status.isOK());
    assertEquals(newNews.size(), status.getItemCount());
    assertEquals(newNews.size(), status.getTotalItemCount());

    /* Simulate incoming sync (merge read state) */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Assert Read State */
    for (INews news : feed.getNews()) {
      if (news.getState() == INews.State.NEW)
        fail("Unexpected state");
    }

    /* Test Mark Unread */
    syncItems = new ArrayList<SyncItem>();
    for (INews news : newNews) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setMarkedUnread();
      syncItems.add(item);
    }

    service.testSync(syncItems);

    /* Assert Status */
    assertNotNull(service.getStatus());
    status = service.getStatus();
    assertTrue(status.isOK());
    assertEquals(newNews.size(), status.getItemCount());
    assertEquals(newNews.size() * 2, status.getTotalItemCount());

    /* Simulate incoming sync (merge read state) */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Assert Read State */
    List<INews> unreadNews = new ArrayList<INews>();
    for (INews news : feed.getNews()) {
      if (news.getState() == INews.State.UNREAD)
        unreadNews.add(news);
    }

    assertTrue(unreadNews.size() == newNews.size());

    /* Test Outgoing Sync (mark read) */
    syncItems = new ArrayList<SyncItem>();
    for (INews news : unreadNews) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setMarkedRead();
      syncItems.add(item);
    }

    service.testSync(syncItems);

    /* Assert Status */
    assertNotNull(service.getStatus());
    status = service.getStatus();
    assertTrue(status.isOK());
    assertEquals(unreadNews.size(), status.getItemCount());
    assertEquals(unreadNews.size() * 3, status.getTotalItemCount());

    /* Simulate incoming sync (merge read state) */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Assert Read State */
    for (INews news : feed.getNews()) {
      if (news.getState() == INews.State.NEW || news.getState() == INews.State.UNREAD)
        fail("Unexpected state");
    }
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testSpiegelFeedStarLabels() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    URI feedUrl = new URI("reader://www.spiegel.de/schlagzeilen/index.rss");
    IFeed feed = Owl.getModelFactory().createFeed(null, feedUrl);
    DynamicDAO.save(feed);

    IBookMark bm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(feedUrl), "BM");
    DynamicDAO.save(root);

    /* Initial Load of Feed */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Test Outgoing Sync */
    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    List<INews> newsToSync = new ArrayList<INews>();
    List<SyncItem> syncItems = new ArrayList<SyncItem>();
    Set<String> guids = new HashSet<String>();
    for (int i = 0; i < 20; i++) {
      INews newsitem = feed.getNews().get(i);
      SyncItem item = SyncItem.toSyncItem(newsitem);
      newsToSync.add(newsitem);
      item.setStarred();
      item.addLabel("Testing");
      item.addLabel("Hello World");
      syncItems.add(item);
      guids.add(newsitem.getGuid().getValue());
    }

    service.testSync(syncItems);

    /* Assert Status */
    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertTrue(status.isOK());
    assertEquals(syncItems.size(), status.getItemCount());
    assertEquals(syncItems.size(), status.getTotalItemCount());

    /* Simulate incoming sync (merge starred state and labels) */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Assert Starred State and Labels */
    for (INews news : feed.getNews()) {
      if (!guids.contains(news.getGuid().getValue()))
        continue;

      assertTrue(news.isFlagged());
      Set<ILabel> labels = news.getLabels();
      assertTrue(labels.size() >= 2);
      int count = 0;
      for (ILabel label : labels) {
        if ("Testing".equals(label.getName()) && label.getId() > 0)
          count++;
        else if ("Hello World".equals(label.getName()) && label.getId() > 0)
          count++;
      }

      assertEquals(2, count);
    }

    /* Test removing starred state and labels */
    syncItems = new ArrayList<SyncItem>();
    for (INews news : newsToSync) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setUnStarred();
      item.removeLabel("Testing");
      item.removeLabel("Hello World");
      syncItems.add(item);
    }

    service.testSync(syncItems);

    /* Assert Status */
    assertNotNull(service.getStatus());
    status = service.getStatus();
    assertTrue(status.isOK());
    assertEquals(syncItems.size(), status.getItemCount());
    assertEquals(syncItems.size() * 2, status.getTotalItemCount());

    /* Simulate incoming sync (merge starred state and labels) */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Assert Starred State and Labels */
    for (INews news : feed.getNews()) {
      if (!guids.contains(news.getGuid().getValue()))
        continue;

      assertFalse(news.isFlagged());
      Set<ILabel> labels = news.getLabels();
      for (ILabel label : labels) {
        if ("Testing".equals(label.getName()))
          fail("Unexpected Label found");
        else if ("Hello World".equals(label.getName()))
          fail("Unexpected Label found");
      }
    }
  }

  /**
   * @throws Exception
   */
  @Test
  @SuppressWarnings("nls")
  public void testSpiegelFeedIncomingExistingLabel() throws Exception {
    ILabel label = Owl.getModelFactory().createLabel(null, "Super Label");
    DynamicDAO.save(label);

    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    URI feedUrl = new URI("reader://www.spiegel.de/schlagzeilen/index.rss");
    IFeed feed = Owl.getModelFactory().createFeed(null, feedUrl);
    DynamicDAO.save(feed);

    IBookMark bm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(feedUrl), "BM");
    DynamicDAO.save(root);

    /* Initial Load of Feed */
    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    /* Test Outgoing Sync */
    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    IGuid marker = feed.getNews().get(0).getGuid();
    SyncItem item = SyncItem.toSyncItem(feed.getNews().get(0));
    item.addLabel(label.getName());

    service.testSync(Collections.singleton(item));

    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertEquals(1, status.getItemCount());
    assertEquals(1, status.getTotalItemCount());

    Controller.getDefault().reload(bm, null, null);

    assertNotNull(feed.getTitle());
    assertNotNull(feed.getPublishDate());
    assertFalse(feed.getNews().isEmpty());

    boolean labelFound = false;
    Outer: for (INews news : feed.getNews()) {
      if (news.getGuid().getValue().equals(marker.getValue())) {
        Set<ILabel> labels = news.getLabels();
        for (ILabel newsLabel : labels) {
          if (newsLabel.getName().equals(label.getName())) {
            assertTrue(newsLabel.equals(label));
            labelFound = true;
            break Outer;
          }
        }
      }
    }

    assertTrue(labelFound);
  }

  /**
   * @throws Exception
   */
  @Test
  public void testMultiFeedSync() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed sternFeed = Owl.getModelFactory().createFeed(null, new URI("reader://www.stern.de/feed/standard/all/"));
    DynamicDAO.save(sternFeed);

    IBookMark sternBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(sternFeed.getLink()), "Stern");

    IFeed heiseFeed = Owl.getModelFactory().createFeed(null, new URI("reader://www.heise.de/newsticker/heise-atom.xml"));
    DynamicDAO.save(heiseFeed);

    IBookMark heiseBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(heiseFeed.getLink()), "Heise");

    IFeed golemFeed = Owl.getModelFactory().createFeed(null, new URI("reader://rss.golem.de/rss.php?feed=RSS1.0"));
    DynamicDAO.save(golemFeed);

    IBookMark golemBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(golemFeed.getLink()), "Golem");

    DynamicDAO.save(root);

    Controller.getDefault().reload(sternBm, null, null);
    Controller.getDefault().reload(heiseBm, null, null);
    Controller.getDefault().reload(golemBm, null, null);

    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    List<SyncItem> items = new ArrayList<SyncItem>();

    INews sternNews1 = sternFeed.getNews().get(0);
    INews sternNews2 = sternFeed.getNews().get(1);
    INews heiseNews1 = heiseFeed.getNews().get(0);
    INews heiseNews2 = heiseFeed.getNews().get(1);
    INews golemNews1 = golemFeed.getNews().get(0);
    INews golemNews2 = golemFeed.getNews().get(1);

    SyncItem item = SyncItem.toSyncItem(sternNews1);
    item.setStarred();
    items.add(item);

    item = SyncItem.toSyncItem(heiseNews1);
    item.setStarred();
    items.add(item);

    item = SyncItem.toSyncItem(golemNews1);
    item.setStarred();
    items.add(item);

    item = SyncItem.toSyncItem(sternNews2);
    item.addLabel("Foo Bar");
    items.add(item);

    item = SyncItem.toSyncItem(heiseNews2);
    item.addLabel("Foo Bar");
    items.add(item);

    item = SyncItem.toSyncItem(golemNews2);
    item.addLabel("Foo Bar");
    item.addLabel("Hello World");
    items.add(item);

    service.testSync(items);

    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertEquals(6, status.getItemCount());
    assertEquals(6, status.getTotalItemCount());

    Controller.getDefault().reload(sternBm, null, null);
    Controller.getDefault().reload(heiseBm, null, null);
    Controller.getDefault().reload(golemBm, null, null);

    int counter = 0;
    for (INews news : sternFeed.getNews()) {
      if (news.getGuid().getValue().equals(sternNews1.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;
      } else if (news.getGuid().getValue().equals(sternNews2.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;

        Set<ILabel> labels = news.getLabels();
        for (ILabel label : labels) {
          if (label.getName().equals("Foo Bar"))
            counter++;
        }
      }
    }

    for (INews news : heiseFeed.getNews()) {
      if (news.getGuid().getValue().equals(heiseNews1.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;
      } else if (news.getGuid().getValue().equals(heiseNews2.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;

        Set<ILabel> labels = news.getLabels();
        for (ILabel label : labels) {
          if (label.getName().equals("Foo Bar"))
            counter++;
        }
      }
    }

    for (INews news : golemFeed.getNews()) {
      if (news.getGuid().getValue().equals(golemNews1.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;
      } else if (news.getGuid().getValue().equals(golemNews2.getGuid().getValue())) {
        if (news.isFlagged())
          counter++;

        Set<ILabel> labels = news.getLabels();
        for (ILabel label : labels) {
          if (label.getName().equals("Foo Bar"))
            counter++;
          if (label.getName().equals("Hello World"))
            counter++;
        }
      }
    }

    assertEquals(7, counter);

    /* Now remove again and check */
    item = SyncItem.toSyncItem(sternNews1);
    item.setUnStarred();
    items.add(item);

    item = SyncItem.toSyncItem(heiseNews1);
    item.setUnStarred();
    items.add(item);

    item = SyncItem.toSyncItem(golemNews1);
    item.setUnStarred();
    items.add(item);

    item = SyncItem.toSyncItem(sternNews2);
    item.removeLabel("Foo Bar");
    items.add(item);

    item = SyncItem.toSyncItem(heiseNews2);
    item.removeLabel("Foo Bar");
    items.add(item);

    item = SyncItem.toSyncItem(golemNews2);
    item.removeLabel("Foo Bar");
    item.removeLabel("Hello World");
    items.add(item);

    service.testSync(items);

    assertNotNull(service.getStatus());
    status = service.getStatus();
    assertEquals(6, status.getItemCount());
    assertEquals(12, status.getTotalItemCount());

    Controller.getDefault().reload(sternBm, null, null);
    Controller.getDefault().reload(heiseBm, null, null);
    Controller.getDefault().reload(golemBm, null, null);

    for (INews news : sternFeed.getNews()) {
      if (news.getGuid().getValue().equals(sternNews1.getGuid().getValue())) {
        if (news.isFlagged())
          fail("Unexpected state");
      } else if (news.getGuid().getValue().equals(sternNews2.getGuid().getValue())) {
        if (news.isFlagged()) {
          Set<ILabel> labels = news.getLabels();
          for (ILabel label : labels) {
            if (label.getName().equals("Foo Bar"))
              fail("Unexpected state");
          }
        }
      }
    }

    for (INews news : heiseFeed.getNews()) {
      if (news.getGuid().getValue().equals(heiseNews1.getGuid().getValue())) {
        if (news.isFlagged())
          fail("Unexpected state");
      } else if (news.getGuid().getValue().equals(heiseNews2.getGuid().getValue())) {
        if (news.isFlagged()) {
          Set<ILabel> labels = news.getLabels();
          for (ILabel label : labels) {
            if (label.getName().equals("Foo Bar"))
              fail("Unexpected state");
          }
        }
      }
    }

    for (INews news : golemFeed.getNews()) {
      if (news.getGuid().getValue().equals(golemNews1.getGuid().getValue())) {
        if (news.isFlagged())
          fail("Unexpected state");
      } else if (news.getGuid().getValue().equals(golemNews2.getGuid().getValue())) {
        if (news.isFlagged()) {
          Set<ILabel> labels = news.getLabels();
          for (ILabel label : labels) {
            if (label.getName().equals("Foo Bar"))
              fail("Unexpected state");
            if (label.getName().equals("Hello World"))
              fail("Unexpected state");
          }
        }
      }
    }
  }

  /**
   * @throws Exception
   */
  @Test
  public void testFeedSyncNoUpdateEvents() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed bildFeed = Owl.getModelFactory().createFeed(null, new URI("reader://www.bild.de/rss-feeds/rss-16725492,feed=home.bild.html"));
    DynamicDAO.save(bildFeed);

    IBookMark bildBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(bildFeed.getLink()), "Bild");

    DynamicDAO.save(root);

    Controller.getDefault().reload(bildBm, null, null);

    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    INews bildNews = bildFeed.getNews().get(0);
    SyncItem item = SyncItem.toSyncItem(bildNews);
    item.setStarred();
    item.addLabel("Foo");
    item.addLabel("Bar");
    item.addLabel("Hello World");
    item.addLabel("World Hello");

    service.testSync(Collections.singleton(item));

    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertEquals(1, status.getItemCount());
    assertEquals(1, status.getTotalItemCount());

    Controller.getDefault().reload(bildBm, null, null);

    final AtomicBoolean listenerCalled = new AtomicBoolean();
    NewsListener listener = new NewsAdapter() {
      @Override
      public void entitiesUpdated(Set<NewsEvent> events) {
        listenerCalled.set(true);
      }
    };
    DynamicDAO.addEntityListener(INews.class, listener);

    try {
      Controller.getDefault().reload(bildBm, null, null);
      assertFalse(listenerCalled.get());
    } finally {
      DynamicDAO.removeEntityListener(INews.class, listener);
    }

    /* Clean Up */
    item = SyncItem.toSyncItem(bildNews);
    item.setUnStarred();
    item.removeLabel("Foo");
    item.removeLabel("Bar");
    item.removeLabel("Hello World");
    item.removeLabel("World Hello");

    service.testSync(Collections.singleton(item));

    assertNotNull(service.getStatus());
    status = service.getStatus();
    assertEquals(1, status.getItemCount());
    assertEquals(2, status.getTotalItemCount());
  }

  /**
   * @throws Exception
   */
  @Test
  public void testFeedSyncLabelMerge() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed testFeed = Owl.getModelFactory().createFeed(null, new URI("reader://www.test.de/rss/themen/alle/alles/"));
    DynamicDAO.save(testFeed);

    IBookMark testBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(testFeed.getLink()), "Test");

    DynamicDAO.save(root);

    Controller.getDefault().reload(testBm, null, null);

    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    INews testNews = testFeed.getNews().get(0);

    assertEquals(1, testNews.getLabels().size());
    assertEquals("TestFeed", testNews.getLabels().iterator().next().getName());

    SyncItem item = SyncItem.toSyncItem(testNews);
    item.addLabel("Foo");
    item.addLabel("Bar");
    item.addLabel("Hello World");
    item.addLabel("World Hello");

    service.testSync(Collections.singleton(item));

    assertNotNull(service.getStatus());
    SyncStatus status = service.getStatus();
    assertEquals(1, status.getItemCount());
    assertEquals(1, status.getTotalItemCount());

    Controller.getDefault().reload(testBm, null, null);

    assertEquals(5, testNews.getLabels().size());

    testNews.removeLabel(testNews.getLabels().iterator().next());
    DynamicDAO.save(testFeed);

    assertEquals(4, testNews.getLabels().size());

    Controller.getDefault().reload(testBm, null, null);

    assertEquals(5, testNews.getLabels().size());

    item = SyncItem.toSyncItem(testNews);
    item.removeLabel("Foo");
    item.removeLabel("Bar");
    item.addLabel("Bababu");

    service.testSync(Collections.singleton(item));

    Controller.getDefault().reload(testBm, null, null);
    assertEquals(4, testNews.getLabels().size());

    item = SyncItem.toSyncItem(testNews);
    item.removeLabel("Hello World");
    item.removeLabel("World Hello");
    item.removeLabel("Bababu");

    service.testSync(Collections.singleton(item));

    Controller.getDefault().reload(testBm, null, null);
    assertEquals(1, testNews.getLabels().size());
  }

  /**
   * @throws Exception
   */
  @Test
  public void testSyncHugeFeed() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed slashdotFeed = Owl.getModelFactory().createFeed(null, new URI("reader://rss.slashdot.org/Slashdot/slashdot"));
    DynamicDAO.save(slashdotFeed);

    IBookMark slashdotBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(slashdotFeed.getLink()), "Slashdot");
    IPreferenceScope prefs = Owl.getPreferenceService().getEntityScope(slashdotBm);
    prefs.putBoolean(DefaultPreferences.DEL_NEWS_BY_COUNT_STATE, true);
    prefs.putInteger(DefaultPreferences.DEL_NEWS_BY_COUNT_VALUE, 800);

    DynamicDAO.save(root);

    Controller.getDefault().reload(slashdotBm, null, null);

    SyncService service = new SyncService();
    assertTrue(service.getStatus() == null);

    int itemCount = slashdotFeed.getNews().size();
    assertTrue(itemCount > 790); //Sometimes seems to hit 799

    List<SyncItem> items = new ArrayList<SyncItem>();
    for (INews news : slashdotFeed.getNews()) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setStarred();
      item.setMarkedRead();
      items.add(item);

      item = SyncItem.toSyncItem(news);
      item.addLabel("Foo");
      items.add(item);

      item = SyncItem.toSyncItem(news);
      item.addLabel("Hello World");
      items.add(item);
    }

    service.testSync(items);
    assertEquals(itemCount, service.getStatus().getItemCount());
    assertEquals(itemCount, service.getStatus().getTotalItemCount());

    items = new ArrayList<SyncItem>();
    for (INews news : slashdotFeed.getNews()) {
      SyncItem item = SyncItem.toSyncItem(news);
      item.setUnStarred();
      items.add(item);

      item = SyncItem.toSyncItem(news);
      item.removeLabel("Foo");
      items.add(item);

      item = SyncItem.toSyncItem(news);
      item.removeLabel("Hello World");
      items.add(item);
    }

    service.testSync(items);
    assertEquals(itemCount, service.getStatus().getItemCount());
    assertEquals(itemCount * 2, service.getStatus().getTotalItemCount());
  }

  /**
   * @throws Exception
   */
  @Test
  public void testSyncRecentNewsFromFeed() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed slashdotFeed = Owl.getModelFactory().createFeed(null, new URI("reader://rss.slashdot.org/Slashdot/slashdot"));
    DynamicDAO.save(slashdotFeed);

    IBookMark slashdotBm = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(slashdotFeed.getLink()), "Slashdot");
    IPreferenceScope prefs = Owl.getPreferenceService().getEntityScope(slashdotBm);
    prefs.putBoolean(DefaultPreferences.DEL_NEWS_BY_AGE_STATE, true);
    prefs.putInteger(DefaultPreferences.DEL_NEWS_BY_AGE_VALUE, 2);

    long ageLimit = DateUtils.getToday().getTimeInMillis() - (2 * DateUtils.DAY);
    ageLimit -= 1000 * 60 * 60; //Tolerate some invariance

    DynamicDAO.save(root);

    Controller.getDefault().reload(slashdotBm, null, null);

    for (INews news : slashdotFeed.getNews()) {
      Date date = news.getPublishDate();
      assertTrue(ageLimit <= date.getTime());
    }
  }

  /**
   * @throws Exception
   */
  @Test
  public void testIncomingMergeConflict() throws Exception {
    URI slashdot = new URI("reader://rss.slashdot.org/Slashdot/slashdot");
    IConnectionService conManager = Owl.getConnectionService();
    IProtocolHandler handler = conManager.getHandler(slashdot);

    Map<Object, Object> properties = new HashMap<Object, Object>();
    Map<String, SyncItem> syncitems = new HashMap<String, SyncItem>();
    properties.put(IConnectionPropertyConstants.UNCOMMITTED_ITEMS, syncitems);

    Triple<IFeed, IConditionalGet, URI> result = handler.reload(slashdot, new NullProgressMonitor(), null);

    List<INews> news = result.getFirst().getNews();
    for (int i = 0; i < 10; i++) {
      INews item = news.get(i);
      SyncItem sync = SyncItem.toSyncItem(item);
      syncitems.put(sync.getId(), sync);
      sync.setMarkedRead();
      sync.setStarred();
      sync.addLabel("Foo");
    }

    result = handler.reload(slashdot, new NullProgressMonitor(), properties);
    news = result.getFirst().getNews();
    for (INews item : news) {
      if (syncitems.containsKey(item.getGuid().getValue())) {
        assertTrue(item.getProperty(SyncUtils.GOOGLE_MARKED_READ) != null);
        assertTrue(item.isFlagged());

        Object labelsObj = item.getProperty(SyncUtils.GOOGLE_LABELS);
        assertNotNull(labelsObj);

        String[] labels = (String[]) labelsObj;
        boolean labelFound = false;
        for (String label : labels) {
          if ("Foo".equals(label)) {
            labelFound = true;
            break;
          }
        }

        assertTrue(labelFound);
      }
    }
  }

  /**
   * @throws Exception
   */
  @Test
  public void testSyncWithDeletedLabels() throws Exception {
    IFolder root = Owl.getModelFactory().createFolder(null, null, "Root");

    IFeed bbcFeed = Owl.getModelFactory().createFeed(null, new URI("reader://feeds.bbci.co.uk/news/rss.xml"));
    DynamicDAO.save(bbcFeed);

    IBookMark bbcBM = Owl.getModelFactory().createBookMark(null, root, new FeedLinkReference(bbcFeed.getLink()), "Slashdot");

    DynamicDAO.save(root);

    Controller.getDefault().reload(bbcBM, null, null);

    Collection<ILabel> labels = DynamicDAO.loadAll(ILabel.class);
    boolean bbcLabelFound = false;
    ILabel bbcLabel = null;
    for (ILabel label : labels) {
      if ("BBC".equals(label.getName())) {
        bbcLabelFound = true;
        bbcLabel = label;
        break;
      }
    }

    assertTrue(bbcLabelFound);

    DynamicDAO.delete(bbcLabel);

    for (INews news : bbcFeed.getNews()) {
      assertTrue(news.getLabels().isEmpty());
    }

    Controller.getDefault().reload(bbcBM, null, null);

    labels = DynamicDAO.loadAll(ILabel.class);
    bbcLabelFound = false;
    for (ILabel label : labels) {
      if ("BBC".equals(label.getName())) {
        bbcLabelFound = true;
        break;
      }
    }

    assertFalse(bbcLabelFound);

    for (INews news : bbcFeed.getNews()) {
      assertTrue(news.getLabels().isEmpty());
    }

    bbcLabel = Owl.getModelFactory().createLabel(null, "BBC");
    DynamicDAO.save(bbcLabel);

    Controller.getDefault().reload(bbcBM, null, null);
    bbcLabelFound = false;
    for (INews news : bbcFeed.getNews()) {
      if (news.getLabels().contains(bbcLabel)) {
        bbcLabelFound = true;
        break;
      }
    }

    assertTrue(bbcLabelFound);

    DynamicDAO.delete(bbcLabel);

    for (INews news : bbcFeed.getNews()) {
      assertTrue(news.getLabels().isEmpty());
    }

    Controller.getDefault().reload(bbcBM, null, null);

    labels = DynamicDAO.loadAll(ILabel.class);
    bbcLabelFound = false;
    for (ILabel label : labels) {
      if ("BBC".equals(label.getName())) {
        bbcLabelFound = true;
        break;
      }
    }

    assertFalse(bbcLabelFound);

    for (INews news : bbcFeed.getNews()) {
      assertTrue(news.getLabels().isEmpty());
    }

    bbcLabel = Owl.getModelFactory().createLabel(null, "BBC Other");
    DynamicDAO.save(bbcLabel);

    bbcLabel.setName("BBC");
    DynamicDAO.save(bbcLabel);

    Controller.getDefault().reload(bbcBM, null, null);
    bbcLabelFound = false;
    for (INews news : bbcFeed.getNews()) {
      if (news.getLabels().contains(bbcLabel)) {
        bbcLabelFound = true;
        break;
      }
    }

    assertTrue(bbcLabelFound);
  }
}
TOP

Related Classes of org.rssowl.core.tests.connection.SyncConnectionTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.