From 28d6b2a860740557bf93dd0f9a48d059379ed696 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sat, 28 May 2011 17:05:34 -0400
Subject: [PATCH] Unit testing. Removal of some unused code paths.

---
 tests/com/gitblit/tests/GitBlitTest.java       |   36 +++++++
 src/com/gitblit/FileSettings.java              |   17 ++-
 src/com/gitblit/utils/TimeUtils.java           |   28 ++---
 src/com/gitblit/wicket/pages/TreePage.java     |    9 +
 src/com/gitblit/wicket/pages/EditUserPage.java |    5 
 tests/com/gitblit/tests/GitBlitSuite.java      |   11 ++
 src/com/gitblit/models/TicketModel.java        |    5 -
 tests/com/gitblit/tests/TimeUtilsTest.java     |   60 ++++++++++++
 src/com/gitblit/models/UserModel.java          |    7 -
 src/com/gitblit/GitBlitServlet.java            |    2 
 src/com/gitblit/GitBlitServer.java             |    2 
 src/com/gitblit/MakeCertificate.java           |    2 
 tests/com/gitblit/tests/JGitUtilsTest.java     |   66 ++++++++++++
 src/com/gitblit/models/PathModel.java          |   10 --
 src/com/gitblit/models/RepositoryModel.java    |    6 -
 15 files changed, 208 insertions(+), 58 deletions(-)

diff --git a/src/com/gitblit/FileSettings.java b/src/com/gitblit/FileSettings.java
index e6fb939..393e76c 100644
--- a/src/com/gitblit/FileSettings.java
+++ b/src/com/gitblit/FileSettings.java
@@ -34,10 +34,16 @@
 
 	private final Logger logger = LoggerFactory.getLogger(FileSettings.class);
 
+	private final File propertiesFile;
+	
 	private Properties properties = new Properties();
 
 	private long lastread;
 
+	public FileSettings(String file) {
+		this.propertiesFile = new File(file);
+	}
+	
 	@Override
 	public List<String> getAllKeys(String startingWith) {
 		startingWith = startingWith.toLowerCase();
@@ -138,15 +144,14 @@
 		return strings;
 	}
 
-	private synchronized Properties read() {
-		File file = new File(Constants.PROPERTIES_FILE);
-		if (file.exists() && (file.lastModified() > lastread)) {
+	private synchronized Properties read() {		
+		if (propertiesFile.exists() && (propertiesFile.lastModified() > lastread)) {
 			FileInputStream is = null;
 			try {
 				properties = new Properties();
-				is = new FileInputStream(Constants.PROPERTIES_FILE);
+				is = new FileInputStream(propertiesFile);
 				properties.load(is);
-				lastread = file.lastModified();
+				lastread = propertiesFile.lastModified();
 			} catch (FileNotFoundException f) {
 				// IGNORE - won't happen because file.exists() check above
 			} catch (Throwable t) {
@@ -166,6 +171,6 @@
 
 	@Override
 	public String toString() {
-		return new File(Constants.PROPERTIES_FILE).getAbsolutePath();
+		return propertiesFile.getAbsolutePath();
 	}
 }
diff --git a/src/com/gitblit/GitBlitServer.java b/src/com/gitblit/GitBlitServer.java
index 416c47a..28b1627 100644
--- a/src/com/gitblit/GitBlitServer.java
+++ b/src/com/gitblit/GitBlitServer.java
@@ -425,7 +425,7 @@
 	@Parameters(separators = " ")
 	private static class Params {
 		
-		private static final FileSettings FILESETTINGS = new FileSettings();
+		private static final FileSettings FILESETTINGS = new FileSettings(Constants.PROPERTIES_FILE);
 
 		/*
 		 * Server parameters
diff --git a/src/com/gitblit/GitBlitServlet.java b/src/com/gitblit/GitBlitServlet.java
index 4686884..a71012b 100644
--- a/src/com/gitblit/GitBlitServlet.java
+++ b/src/com/gitblit/GitBlitServlet.java
@@ -56,7 +56,7 @@
 		}
 		int forwardSlash = url.indexOf('/');
 		if (forwardSlash > -1) {
-			String repository = url.substring(0, forwardSlash);
+			String repository = url.substring(0, forwardSlash).toLowerCase();
 			String function = url.substring(forwardSlash + 1);
 			String query = req.getQueryString() == null ? "" : req.getQueryString();
 			RepositoryModel model = GitBlit.self().getRepositoryModel(repository);
diff --git a/src/com/gitblit/MakeCertificate.java b/src/com/gitblit/MakeCertificate.java
index 67b2fd9..cd01643 100644
--- a/src/com/gitblit/MakeCertificate.java
+++ b/src/com/gitblit/MakeCertificate.java
@@ -156,7 +156,7 @@
 	@Parameters(separators = " ")
 	private static class Params {
 
-		private static final FileSettings FILESETTINGS = new FileSettings();
+		private static final FileSettings FILESETTINGS = new FileSettings(Constants.PROPERTIES_FILE);
 		
 		@Parameter(names = { "--alias" }, description = "Server alias", required = true)
 		public String alias;
diff --git a/src/com/gitblit/models/PathModel.java b/src/com/gitblit/models/PathModel.java
index 17a7971..0841531 100644
--- a/src/com/gitblit/models/PathModel.java
+++ b/src/com/gitblit/models/PathModel.java
@@ -43,16 +43,6 @@
 		return FileMode.TREE.equals(mode);
 	}
 
-	public static PathModel getParentPath(String basePath, String commitId) {
-		String parentPath = null;
-		if (basePath.lastIndexOf('/') > -1) {
-			parentPath = basePath.substring(0, basePath.lastIndexOf('/'));
-		}
-		PathModel model = new PathModel("..", parentPath, 0, 40000, commitId);
-		model.isParentPath = true;
-		return model;
-	}
-
 	@Override
 	public int hashCode() {
 		return commitId.hashCode() + path.hashCode();
diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
index 7241d76..afe1b5a 100644
--- a/src/com/gitblit/models/RepositoryModel.java
+++ b/src/com/gitblit/models/RepositoryModel.java
@@ -37,11 +37,7 @@
 	public boolean isFrozen;
 
 	public RepositoryModel() {
-		this.name = "";
-		this.description = "";
-		this.owner = "";
-		this.lastChange = new Date(0);
-		this.accessRestriction = AccessRestrictionType.NONE;
+		this("", "", "", new Date(0));
 	}
 
 	public RepositoryModel(String name, String description, String owner, Date lastchange) {
diff --git a/src/com/gitblit/models/TicketModel.java b/src/com/gitblit/models/TicketModel.java
index b284340..d86a073 100644
--- a/src/com/gitblit/models/TicketModel.java
+++ b/src/com/gitblit/models/TicketModel.java
@@ -58,11 +58,6 @@
 		public String author;
 		public Date date;
 
-		public Comment(String text, Date date) {
-			this.text = text;
-			this.date = date;
-		}
-
 		public Comment(String filename, String content) throws ParseException {
 			String[] chunks = filename.split("_", -1);
 			this.date = new Date(Long.parseLong(chunks[1]) * 1000L);
diff --git a/src/com/gitblit/models/UserModel.java b/src/com/gitblit/models/UserModel.java
index 797c14e..f23fd29 100644
--- a/src/com/gitblit/models/UserModel.java
+++ b/src/com/gitblit/models/UserModel.java
@@ -34,12 +34,7 @@
 	}
 
 	public boolean canAccessRepository(String repositoryName) {
-		return canAdmin || repositories.contains(repositoryName);
-	}
-
-	public void setRepositories(List<String> repositories) {
-		this.repositories.clear();
-		this.repositories.addAll(repositories);
+		return canAdmin || repositories.contains(repositoryName.toLowerCase());
 	}
 
 	public void addRepository(String name) {
diff --git a/src/com/gitblit/utils/TimeUtils.java b/src/com/gitblit/utils/TimeUtils.java
index 16aea77..ac8e209 100644
--- a/src/com/gitblit/utils/TimeUtils.java
+++ b/src/com/gitblit/utils/TimeUtils.java
@@ -45,9 +45,9 @@
 	public static String duration(int days) {
 		if (days <= 60) {
 			return days + (days > 1 ? " days" : " day");
-		} else if (days <= 365) {
+		} else if (days < 365) {
 			int rem = days % 30;
-			return (days / 30) + " months, " + rem + (rem > 1 ? " days" : " day");
+			return (days / 30) + (rem >= 15 ? 1 : 0) + " months";
 		} else {
 			int years = days / 365;
 			int rem = days % 365;
@@ -56,23 +56,17 @@
 				if (rem == 0) {
 					return yearsString;
 				} else {
-					return yearsString + ", " + rem + (rem > 1 ? " days" : " day");
+					return yearsString + (rem >= 15 ? ", 1 month" : "");
 				}
 			} else {
 				int months = rem / 30;
 				int remDays = rem % 30;
-				String monthsString;
-				if (months == 0) {
-					monthsString = yearsString;
-				} else {
-					monthsString = yearsString + ", " + months
-							+ (months > 1 ? " months" : " month");
+				if (remDays >= 15) {
+					months++;
 				}
-				if (remDays == 0) {
-					return monthsString;
-				} else {
-					return monthsString + ", " + remDays + (remDays > 1 ? " days" : " day");
-				}
+				String monthsString = yearsString + ", " + months
+						+ (months > 1 ? " months" : " month");
+				return monthsString;
 			}
 		}
 	}
@@ -120,7 +114,7 @@
 		String ago = null;
 		if (isToday(date) || isYesterday(date)) {
 			int mins = minutesAgo(date, true);
-			if (mins > 120) {
+			if (mins >= 120) {
 				if (css) {
 					return "age1";
 				}
@@ -128,7 +122,7 @@
 				if (hours > 23) {
 					ago = "yesterday";
 				} else {
-					ago = hours + " hour" + (hours > 1 ? "s" : "") + " ago";
+					ago = hours + " hours ago";
 				}
 			} else {
 				if (css) {
@@ -158,8 +152,6 @@
 						months++;
 					}
 					ago = months + " month" + (months > 1 ? "s" : "") + " ago";
-				} else {
-					ago = days + " day" + (days > 1 ? "s" : "") + " ago";
 				}
 			} else if (days == 365) {
 				ago = "1 year ago";
diff --git a/src/com/gitblit/wicket/pages/EditUserPage.java b/src/com/gitblit/wicket/pages/EditUserPage.java
index fb647f7..fe40a3d 100644
--- a/src/com/gitblit/wicket/pages/EditUserPage.java
+++ b/src/com/gitblit/wicket/pages/EditUserPage.java
@@ -140,9 +140,10 @@
 				Iterator<String> selectedRepositories = repositories.getSelectedChoices();
 				List<String> repos = new ArrayList<String>();
 				while (selectedRepositories.hasNext()) {
-					repos.add(selectedRepositories.next());
+					repos.add(selectedRepositories.next().toLowerCase());
 				}
-				userModel.setRepositories(repos);
+				userModel.repositories.clear();
+				userModel.repositories.addAll(repos);				
 				try {
 					GitBlit.self().editUserModel(oldName, userModel, isCreate);
 				} catch (GitBlitException e) {
diff --git a/src/com/gitblit/wicket/pages/TreePage.java b/src/com/gitblit/wicket/pages/TreePage.java
index 4fc7119..ac84e73 100644
--- a/src/com/gitblit/wicket/pages/TreePage.java
+++ b/src/com/gitblit/wicket/pages/TreePage.java
@@ -65,7 +65,14 @@
 		// breadcrumbs
 		add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, path, objectId));
 		if (path != null && path.trim().length() > 0) {
-			paths.add(0, PathModel.getParentPath(path, objectId));
+			// add .. parent path entry
+			String parentPath = null;
+			if (path.lastIndexOf('/') > -1) {
+				parentPath = path.substring(0, path.lastIndexOf('/'));
+			}
+			PathModel model = new PathModel("..", parentPath, 0, 40000, objectId);
+			model.isParentPath = true;
+			paths.add(0, model);
 		}
 
 		final ByteFormat byteFormat = new ByteFormat();
diff --git a/tests/com/gitblit/tests/GitBlitSuite.java b/tests/com/gitblit/tests/GitBlitSuite.java
index a31b013..63c2646 100644
--- a/tests/com/gitblit/tests/GitBlitSuite.java
+++ b/tests/com/gitblit/tests/GitBlitSuite.java
@@ -11,6 +11,10 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.storage.file.FileRepository;
 
+import com.gitblit.FileSettings;
+import com.gitblit.GitBlit;
+import com.gitblit.JettyLoginService;
+
 public class GitBlitSuite extends TestSetup {
 	public static final File REPOSITORIES = new File("git");
 
@@ -20,7 +24,9 @@
 
 	public static Test suite() {
 		TestSuite suite = new TestSuite();
+		suite.addTestSuite(TimeUtilsTest.class);
 		suite.addTestSuite(JGitUtilsTest.class);
+		suite.addTestSuite(GitBlitTest.class);
 		return new GitBlitSuite(suite);
 	}
 
@@ -39,6 +45,11 @@
 			cloneOrFetch("nested/helloworld.git", "https://github.com/git/hello-world.git", true);
 			cloneOrFetch("ticgit.git", "https://github.com/jeffWelling/ticgit.git", true);
 		}
+		FileSettings settings = new FileSettings("distrib/gitblit.properties");
+		GitBlit.self().configureContext(settings);
+		JettyLoginService loginService = new JettyLoginService(new File("distrib/users.properties"));
+		loginService.loadUsers();
+		GitBlit.self().setLoginService(loginService);
 	}
 
 	private void cloneOrFetch(String toFolder, String fromUrl, boolean bare) throws Exception {
diff --git a/tests/com/gitblit/tests/GitBlitTest.java b/tests/com/gitblit/tests/GitBlitTest.java
new file mode 100644
index 0000000..50d3606
--- /dev/null
+++ b/tests/com/gitblit/tests/GitBlitTest.java
@@ -0,0 +1,36 @@
+package com.gitblit.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import com.gitblit.GitBlit;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
+
+public class GitBlitTest extends TestCase {
+
+	public void testRepositoryModel() throws Exception {
+		List<String> repositories = GitBlit.self().getRepositoryList();
+		assertTrue("Repository list is empty!", repositories.size() > 0);
+		assertTrue("Missing Helloworld repository!", repositories.contains(GitBlitSuite.getHelloworldRepository().getDirectory().getName()));
+		RepositoryModel model = GitBlit.self().getRepositoryModel(GitBlitSuite.getHelloworldRepository().getDirectory().getName());
+		assertTrue("Helloworld model is null!", model != null);
+		assertTrue(model.toString().equals(GitBlitSuite.getHelloworldRepository().getDirectory().getName()));
+	}
+	
+	public void testUserModel() throws Exception {
+		List<String> users = GitBlit.self().getAllUsernames();
+		assertTrue("No users found!", users.size() > 0);
+		assertTrue("Admin not found", users.contains("admin"));
+		UserModel model = GitBlit.self().getUserModel("admin");
+		assertTrue(model.toString().equals("admin"));
+		assertTrue("Admin missing #admin role!", model.canAdmin);
+		model.canAdmin = false;
+		assertFalse("Admin should not hae #admin!", model.canAdmin);
+		String repository = GitBlitSuite.getHelloworldRepository().getDirectory().getName();
+		assertFalse("Admin can still access repository!", model.canAccessRepository(repository));
+		model.addRepository(repository);
+		assertTrue("Admin can't access repository!", model.canAccessRepository(repository));
+	}
+}
diff --git a/tests/com/gitblit/tests/JGitUtilsTest.java b/tests/com/gitblit/tests/JGitUtilsTest.java
index 7fcf48d..39a4a36 100644
--- a/tests/com/gitblit/tests/JGitUtilsTest.java
+++ b/tests/com/gitblit/tests/JGitUtilsTest.java
@@ -29,9 +29,11 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTree;
 
+import com.gitblit.models.Metric;
 import com.gitblit.models.PathModel.PathChangeModel;
 import com.gitblit.models.RefModel;
 import com.gitblit.models.TicketModel;
+import com.gitblit.models.TicketModel.Comment;
 import com.gitblit.utils.DiffUtils;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.JGitUtils.DiffOutputType;
@@ -69,6 +71,38 @@
 				commit.getName().equals("f554664a346629dc2b839f7292d06bad2db4aece"));
 	}
 
+	public void testRefs() throws Exception {
+		Repository repository = GitBlitSuite.getTicgitRepository();
+		for (RefModel model : JGitUtils.getLocalBranches(repository, -1)) {
+			assertTrue(model.getName().startsWith(Constants.R_HEADS));
+			assertTrue(model.equals(model));
+			assertFalse(model.equals(""));
+			assertTrue(model.hashCode() == model.getCommitId().hashCode()
+					+ model.getName().hashCode());
+			assertTrue(model.getShortLog().equals(model.commit.getShortMessage()));
+		}
+		for (RefModel model : JGitUtils.getRemoteBranches(repository, -1)) {
+			assertTrue(model.getName().startsWith(Constants.R_REMOTES));
+			assertTrue(model.equals(model));
+			assertFalse(model.equals(""));
+			assertTrue(model.hashCode() == model.getCommitId().hashCode()
+					+ model.getName().hashCode());
+			assertTrue(model.getShortLog().equals(model.commit.getShortMessage()));
+		}
+		for (RefModel model : JGitUtils.getTags(repository, -1)) {
+			if (model.getObjectId().getName().equals("283035e4848054ff1803cb0e690270787dc92399")) {
+				assertTrue("Not an annotated tag!", model.isAnnotatedTag());
+			}
+			assertTrue(model.getName().startsWith(Constants.R_TAGS));
+			assertTrue(model.equals(model));
+			assertFalse(model.equals(""));
+			assertTrue(model.hashCode() == model.getCommitId().hashCode()
+					+ model.getName().hashCode());
+			assertTrue(model.getShortLog().equals(model.commit.getShortMessage()));
+		}
+		repository.close();
+	}
+
 	public void testRetrieveRevObject() throws Exception {
 		Repository repository = GitBlitSuite.getHelloworldRepository();
 		RevCommit commit = JGitUtils.getCommit(repository, Constants.HEAD);
@@ -95,6 +129,12 @@
 		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(repository, commit);
 		repository.close();
 		assertTrue("No changed paths found!", paths.size() == 1);
+		for (PathChangeModel path : paths) {
+			assertTrue("PathChangeModel hashcode incorrect!",
+					path.hashCode() == (path.commitId.hashCode() + path.path.hashCode()));
+			assertTrue("PathChangeModel equals itself failed!", path.equals(path));
+			assertFalse("PathChangeModel equals string failed!", path.equals(""));
+		}
 	}
 
 	public void testCommitDiff() throws Exception {
@@ -120,12 +160,34 @@
 		repository.close();
 	}
 
+	public void testMetrics() throws Exception {
+		Repository repository = GitBlitSuite.getHelloworldRepository();
+		List<Metric> metrics = JGitUtils.getDateMetrics(repository);
+		repository.close();
+		assertTrue("No metrics found!", metrics.size() > 0);
+	}
+
 	public void testTicGit() throws Exception {
 		Repository repository = GitBlitSuite.getTicgitRepository();
 		RefModel branch = JGitUtils.getTicketsBranch(repository);
 		assertTrue("Ticgit branch does not exist!", branch != null);
-		List<TicketModel> tickets = JGitUtils.getTickets(repository);
+		List<TicketModel> ticketsA = JGitUtils.getTickets(repository);
+		List<TicketModel> ticketsB = JGitUtils.getTickets(repository);
 		repository.close();
-		assertTrue("No tickets found!", tickets.size() > 0);
+		assertTrue("No tickets found!", ticketsA.size() > 0);
+		for (int i = 0; i < ticketsA.size(); i++) {
+			TicketModel ticketA = ticketsA.get(i);
+			TicketModel ticketB = ticketsB.get(i);
+			assertTrue("Tickets are not equal!", ticketA.equals(ticketB));
+			assertFalse(ticketA.equals(""));
+			assertTrue(ticketA.hashCode() == ticketA.id.hashCode());
+			for (int j = 0; j < ticketA.comments.size(); j++) {
+				Comment commentA = ticketA.comments.get(j);
+				Comment commentB = ticketB.comments.get(j);
+				assertTrue("Comments are not equal!", commentA.equals(commentB));
+				assertFalse(commentA.equals(""));
+				assertTrue(commentA.hashCode() == commentA.text.hashCode());
+			}
+		}
 	}
 }
\ No newline at end of file
diff --git a/tests/com/gitblit/tests/TimeUtilsTest.java b/tests/com/gitblit/tests/TimeUtilsTest.java
new file mode 100644
index 0000000..8227fcf
--- /dev/null
+++ b/tests/com/gitblit/tests/TimeUtilsTest.java
@@ -0,0 +1,60 @@
+package com.gitblit.tests;
+
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import com.gitblit.utils.TimeUtils;
+
+public class TimeUtilsTest extends TestCase {
+
+	public void testToday() throws Exception {
+		assertTrue("Is today failed!", TimeUtils.isToday(new Date()));
+	}
+
+	public void testYesterday() throws Exception {
+		assertTrue("Is yesterday failed!", TimeUtils.isYesterday(new Date(System.currentTimeMillis() - TimeUtils.ONEDAY)));
+	}
+
+	public void testDurations() throws Exception {
+		assertTrue(TimeUtils.duration(5).equals("5 days"));
+		assertTrue(TimeUtils.duration(364).equals("12 months"));
+		assertTrue(TimeUtils.duration(365 + 0).equals("1 year"));
+		assertTrue(TimeUtils.duration(365 + 10).equals("1 year"));
+		assertTrue(TimeUtils.duration(365 + 15).equals("1 year, 1 month"));
+		assertTrue(TimeUtils.duration(365 + 30).equals("1 year, 1 month"));
+		assertTrue(TimeUtils.duration(365 + 44).equals("1 year, 1 month"));
+		assertTrue(TimeUtils.duration(365 + 45).equals("1 year, 2 months"));
+		assertTrue(TimeUtils.duration(365 + 60).equals("1 year, 2 months"));
+		
+		assertTrue(TimeUtils.duration(2*365 + 0).equals("2 years"));
+		assertTrue(TimeUtils.duration(2*365 + 10).equals("2 years"));
+		assertTrue(TimeUtils.duration(2*365 + 15).equals("2 years, 1 month"));
+		assertTrue(TimeUtils.duration(2*365 + 30).equals("2 years, 1 month"));
+		assertTrue(TimeUtils.duration(2*365 + 44).equals("2 years, 1 month"));
+		assertTrue(TimeUtils.duration(2*365 + 45).equals("2 years, 2 months"));
+		assertTrue(TimeUtils.duration(2*365 + 60).equals("2 years, 2 months"));
+	}
+	
+	public void testTimeAgo() throws Exception {
+		long time = System.currentTimeMillis();
+		assertTrue(TimeUtils.timeAgo(new Date(time - 1*TimeUtils.MIN)).equals("1 min ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 60*TimeUtils.MIN)).equals("60 mins ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 120*TimeUtils.MIN)).equals("2 hours ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 15*TimeUtils.ONEHOUR)).equals("15 hours ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 24*TimeUtils.ONEHOUR)).equals("yesterday"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 2*TimeUtils.ONEDAY)).equals("2 days ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 35*TimeUtils.ONEDAY)).equals("5 weeks ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 84*TimeUtils.ONEDAY)).equals("3 months ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 95*TimeUtils.ONEDAY)).equals("3 months ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 104*TimeUtils.ONEDAY)).equals("4 months ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 365*TimeUtils.ONEDAY)).equals("1 year ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - 395*TimeUtils.ONEDAY)).equals("13 months ago"));
+		assertTrue(TimeUtils.timeAgo(new Date(time - (2*365 + 30)*TimeUtils.ONEDAY)).equals("2 years ago"));
+		
+		assertTrue(TimeUtils.timeAgoCss(new Date(time - 1*TimeUtils.MIN)).equals("age0"));
+		assertTrue(TimeUtils.timeAgoCss(new Date(time - 60*TimeUtils.MIN)).equals("age0"));
+		assertTrue(TimeUtils.timeAgoCss(new Date(time - 120*TimeUtils.MIN)).equals("age1"));
+		assertTrue(TimeUtils.timeAgoCss(new Date(time - 24*TimeUtils.ONEHOUR)).equals("age1"));
+		assertTrue(TimeUtils.timeAgoCss(new Date(time - 2*TimeUtils.ONEDAY)).equals("age2"));	}
+}

--
Gitblit v1.9.1