// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: TestBackups.java,v 1.6 2006/11/15 11:50:24 spyromus Exp $
//
package com.salas.bb.core;
import com.salas.bb.domain.*;
import com.salas.bb.domain.querytypes.QueryType;
import com.salas.bb.utils.TUtils;
import com.salas.bb.utils.FileUtils;
import com.salas.bbutilities.opml.Importer;
import com.salas.bbutilities.opml.objects.OPMLGuide;
import com.salas.bbutilities.opml.objects.DirectOPMLFeed;
import com.salas.bbutilities.opml.objects.QueryOPMLFeed;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* This suite contains tests for <code>Backups</code> unit.
* It covers:
* <ul>
* <li>TODO: put here</li>
* </ul>
*/
public class TestBackups extends TestCase
{
/** Note that this value is necessary for rotation test. */
private static final int LAST_BACKUPS_TO_KEEP = 1;
private Backups backups;
private File backupsDir;
protected void setUp()
throws Exception
{
super.setUp();
backupsDir = TUtils.resetDir("backups");
backups = new Backups(backupsDir, LAST_BACKUPS_TO_KEEP);
}
protected void tearDown()
throws Exception
{
FileUtils.rmdir(backupsDir);
super.tearDown();
}
/**
* Tests saving empty backup. Empty backups also should be saved.
*/
public void testSaveBackupEmpty()
throws IOException
{
GuidesSet set = new GuidesSet();
backups.saveBackup(set);
File[] backupFiles = backupsDir.listFiles();
assertEquals("Wrong number of files in backup folder.", 1, backupFiles.length);
File backupFile = backupFiles[0];
OPMLGuide[] guides = restoreBackup(backupFile);
assertEquals("Should be no guides.", 0, guides.length);
}
/**
* Tests saving the backup of two guides with direct and query feeds.
*/
public void testSaveBackup()
throws IOException
{
GuidesSet set = new GuidesSet();
StandardGuide guide1 = new StandardGuide();
guide1.setTitle("1");
guide1.setIconKey("1");
set.add(guide1);
DirectFeed feed1 = new DirectFeed();
feed1.setBaseTitle("1t");
feed1.setXmlURL(new URL("file://1x"));
feed1.setRating(4);
guide1.add(feed1);
StandardGuide guide2 = new StandardGuide();
guide2.setTitle("2");
guide2.setIconKey("2");
set.add(guide2);
QueryFeed feed2 = new QueryFeed();
feed2.setBaseTitle("2t");
feed2.setQueryType(QueryType.getQueryType(QueryType.TYPE_DELICIOUS));
feed2.setParameter("2p");
guide2.add(feed2);
// Do backup and check
backups.saveBackup(set);
File[] backupFiles = backupsDir.listFiles();
assertEquals("Wrong number of files in backup folder.", 1, backupFiles.length);
File backupFile = backupFiles[0];
OPMLGuide[] guides = restoreBackup(backupFile);
// Check guides: see above init
assertEquals("Should be 2 guides.", 2, guides.length);
assertEquals("1", guides[0].getTitle());
assertEquals("1", guides[0].getIcon());
assertEquals(1, guides[0].getFeeds().size());
DirectOPMLFeed opmlFeed1 = (DirectOPMLFeed)guides[0].getFeeds().get(0);
assertEquals("1t", opmlFeed1.getTitle());
assertEquals(4, opmlFeed1.getRating());
QueryOPMLFeed opmlFeed2 = (QueryOPMLFeed)guides[1].getFeeds().get(0);
assertEquals("2t", opmlFeed2.getTitle());
}
/**
* Tests initialization failures.
*/
public void testInitFailure()
throws IOException
{
try
{
backups = new Backups(null, 1);
fail("Empty backup dirs aren't allowed.");
} catch (NullPointerException e)
{
// Expected
}
try
{
backups = new Backups(backupsDir, -1);
fail("Limit should be positive.");
} catch (IllegalArgumentException e)
{
// Expected
}
try
{
backups = new Backups(backupsDir, 0);
fail("Limit shuld be positive.");
} catch (IllegalArgumentException e)
{
// Expected
}
try
{
backups.saveBackup(null);
fail("Set should be specified.");
} catch (NullPointerException e)
{
// Expected
}
}
/**
* Tests naming of backup files.
*/
public void testBackupNaming()
throws IOException
{
GuidesSet set = new GuidesSet();
backups.saveBackup(set);
String[] backupFiles = backupsDir.list();
String backupFile = backupFiles[0];
SimpleDateFormat filenameFormat =
new SimpleDateFormat("^'~'yyyy-MM-dd_HHmm'[0-9][0-9].opml'$");
// Name: ~YYYY-mm-dd_HHMMSS.opml
assertTrue("Wrong file name format: " + backupFile,
backupFile.matches(filenameFormat.format(new Date())));
}
/**
* Tests rotation of backup files. Rotation - it's when the new file overjumps the limit
* of allowed backups. The oldest should be removed.
*/
public void testBackupRotation()
throws InterruptedException, IOException
{
GuidesSet set = new GuidesSet();
backups.saveBackup(set);
String[] backupFiles = backupsDir.list();
String firstBackupFileName = backupFiles[0];
// Sleep second and make another backup
Thread.sleep(1000);
backups.saveBackup(set);
backupFiles = backupsDir.list();
assertEquals("Only one backup file is allowed.", 1, backupFiles.length);
assertFalse("Old backup file is left: ", backupFiles[0].equals(firstBackupFileName));
}
private static OPMLGuide[] restoreBackup(File aBackupFile)
{
Importer importer = new Importer();
OPMLGuide[] guides = new OPMLGuide[0];
try
{
guides = importer.process(aBackupFile.toURL(), false).getGuides();
} catch (Exception e)
{
e.printStackTrace();
fail("Failed to restore backup OPML.");
}
return guides;
}
}