/* * Cobertura - http://cobertura.sourceforge.net/ * * Copyright (C) 2005 Mark Doliner * Copyright (C) 2006 Jiri Mares * * Cobertura 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. * * Cobertura 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 Cobertura; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package net.sourceforge.cobertura.coveragedata; import junit.framework.TestCase; import java.util.concurrent.atomic.AtomicReference; public class LineDataTest extends TestCase { private final LineData a = new LineData(10, "test1", "(I)B"); private final LineData b = new LineData(11, "test1", "(I)B"); private final LineData c = new LineData(12, "test2", "(I)B"); private final LineData d = new LineData(13, "test2", "(I)B"); private final LineData e = new LineData(14); private final LineData f = new LineData(15); public void testEquals() { assertFalse(a.equals(null)); assertFalse(a.equals(new Integer(4))); assertTrue(a.equals(a)); assertFalse(a.equals(b)); assertFalse(a.equals(c)); assertFalse(a.equals(d)); assertFalse(a.equals(e)); assertFalse(a.equals(f)); LineData aPrime = new LineData(10, "test1", "(I)B"); assertTrue(a.equals(aPrime)); } public void testHashCode() { assertEquals(a.hashCode(), a.hashCode()); LineData aPrime = new LineData(10, "test1", "(I)B"); assertEquals(a.hashCode(), aPrime.hashCode()); } public void testGetLineNumber() { assertEquals(10, a.getLineNumber()); assertEquals(11, b.getLineNumber()); assertEquals(12, c.getLineNumber()); assertEquals(13, d.getLineNumber()); assertEquals(14, e.getLineNumber()); assertEquals(15, f.getLineNumber()); } public void testGetNumbers() { assertEquals(1, a.getBranchCoverageRate(), 0); assertEquals(0, a.getLineCoverageRate(), 0); assertEquals(0, a.getNumberOfCoveredLines()); assertEquals(0, a.getNumberOfCoveredBranches()); assertEquals(0, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); a.addJump(0); a.addJump(1); assertEquals(0, a.getBranchCoverageRate(), 0); assertEquals(0, a.getLineCoverageRate(), 0); assertEquals(0, a.getNumberOfCoveredLines()); assertEquals(0, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); for (int i = 0; i < 5; i++) { a.touch(1); assertEquals(0, a.getBranchCoverageRate(), 0); assertEquals(1, a.getLineCoverageRate(), 0); assertEquals(1, a.getNumberOfCoveredLines()); assertEquals(0, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); } a.touchJump(0, true, 1); assertEquals(0.25, a.getBranchCoverageRate(), 0); assertEquals(1, a.getLineCoverageRate(), 0); assertEquals(1, a.getNumberOfCoveredLines()); assertEquals(1, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); a.touchJump(1, false, 1); assertEquals(0.5, a.getBranchCoverageRate(), 0); assertEquals(1, a.getLineCoverageRate(), 0); assertEquals(1, a.getNumberOfCoveredLines()); assertEquals(2, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); a.touchJump(1, true, 1); assertEquals(0.75, a.getBranchCoverageRate(), 0); assertEquals(1, a.getLineCoverageRate(), 0); assertEquals(1, a.getNumberOfCoveredLines()); assertEquals(3, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); a.touchJump(0, false, 1); assertEquals(1, a.getBranchCoverageRate(), 0); assertEquals(1, a.getLineCoverageRate(), 0); assertEquals(1, a.getNumberOfCoveredLines()); assertEquals(4, a.getNumberOfCoveredBranches()); assertEquals(4, a.getNumberOfValidBranches()); assertEquals(1, a.getNumberOfValidLines()); } public void testSetConditional() { assertFalse(c.hasBranch()); c.addJump(0); assertTrue(c.hasBranch()); c.addJump(1); assertTrue(c.hasBranch()); } public void testSetMethodNameAndDescriptor() { e.setMethodNameAndDescriptor("test3", "(I)B"); assertEquals("test3", e.getMethodName()); assertEquals("(I)B", e.getMethodDescriptor()); f.setMethodNameAndDescriptor("test4", "(I)B"); assertEquals("test4", f.getMethodName()); assertEquals("(I)B", f.getMethodDescriptor()); } public void testTouch() { assertEquals(0, a.getHits()); for (int i = 0; i < 400; i++) a.touch(2); assertEquals(800, a.getHits()); } private static void getSwitchDataIteratively(LineData data) { /* * When this test fails, it usually does so well before 2000 iterations. If it * gets past 2000, it will usually pass, so there is not much need in going much * past 2000. */ for (int i = 0; i < 2000; i++) { /* * The following yield is needed to make sure the other thread gets * some CPU. Otherwise, this thread will get too much of a jump ahead * of the other thread. */ Thread.yield(); data.getSwitchData(i, new SwitchData(1, Integer.MAX_VALUE)); } } private void runGetSwitchDataTestWithTwoThreads() throws Throwable { final LineData data = new LineData(2); final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>(); ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") { public void uncaughtException(Thread thread, Throwable t) { /* * Save the Throwable for later use and interrupt this thread so it exits */ possibleThrowable.set(t); thread.interrupt(); } }; /* * Create two threads using the above thread group */ Thread thread1 = new Thread(threadGroup, "1") { public void run() { getSwitchDataIteratively(data); } }; Thread thread2 = new Thread(threadGroup, "2") { public void run() { getSwitchDataIteratively(data); } }; thread1.start(); thread2.start(); /* * Wait for the threads to exit */ if (thread1.isAlive()) thread1.join(); if (thread2.isAlive()) thread2.join(); Throwable t = possibleThrowable.get(); if (t != null) { throw t; } } public void testMultiThreadedGetSwitchData() throws Throwable { /* * This test will often pass with only one iteration. * It passes once in a while with 10. It never passes * with 100 (I hope). */ for (int i = 0; i < 100; i++) { runGetSwitchDataTestWithTwoThreads(); } } private static void getJumpDataIteratively(LineData data) { /* * When this test fails, it usually does so well before 2000 iterations. If it * gets past 2000, it will usually pass, so there is not much need in going much * past 2000. */ for (int i = 0; i < 2000; i++) { /* * The following yield is needed to make sure the other thread gets * some CPU. Otherwise, this thread will get too much of a jump ahead * of the other thread. */ Thread.yield(); data.getJumpData(i); } } private void runGetJumpDataTestWithTwoThreads() throws Throwable { final LineData data = new LineData(2); final AtomicReference<Throwable> possibleThrowable = new AtomicReference<Throwable>(); ThreadGroup threadGroup = new ThreadGroup("TestThreadGroup") { public void uncaughtException(Thread thread, Throwable t) { /* * Save the Throwable for later use and interrupt this thread so it exits */ possibleThrowable.set(t); thread.interrupt(); } }; /* * Create two threads using the above thread group */ Thread thread1 = new Thread(threadGroup, "1") { public void run() { getJumpDataIteratively(data); } }; Thread thread2 = new Thread(threadGroup, "2") { public void run() { getJumpDataIteratively(data); } }; thread1.start(); thread2.start(); /* * Wait for the threads to exit */ if (thread1.isAlive()) thread1.join(); if (thread2.isAlive()) thread2.join(); Throwable t = possibleThrowable.get(); if (t != null) { throw t; } } public void testMultiThreadedGetJumpData() throws Throwable { /* * This test will often pass with only one iteration. * It passes once in a while with 10. It never passes * with 100 (I hope). */ for (int i = 0; i < 100; i++) { runGetJumpDataTestWithTwoThreads(); } } }