|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object junit.framework.TestCase com.jalios.jcms.test.JcmsTestCase
public abstract class JcmsTestCase
Provides a super class for development of JCMS unit tests.
Extending this class will automatically provides a working JCMS
during execution of all your unit tests.
The launched instance of JCMS will be using the following 3 files :
WEB-INF/data/store.xml.junit
: copy of WEB-INF/data/store.xml.release
if it exists, otherwise copy of WEB-INF/data/store.xml
WEB-INF/data/custom.prop.junit
: copy of WEB-INF/data/custom.prop.release
if it exists, otherwise copy of WEB-INF/data/custom.prop
WEB-INF/data/webapp.prop.junit
: copy of WEB-INF/data/webapp.prop.release
if it exists, otherwise copy of WEB-INF/data/webapp.prop
Also, if file WEB-INF/data/junit.prop
exists, its content is appended to the junit file WEB-INF/data/custom.prop.junit
.
Warning!: Even though, store.xml
, custom.prop
and webapp.prop
are not modified by launching a test case using this class, beware that a real JCMS is being launched, thus some other legitimate file
might be modified (monitor.xml, logs, stats, lucene index, etc).
Some useful protected variables are provided to your subclass for easier Data manipulation in your test cases :
admin
: default administrator (channel.getDefaultAdmin()
)defaultWorkspace
: default workspace (channel.getDefaultWorkspace()
)defaultGroup
: default group (channel.getDefaultGroup()
)"unittests."
, the log message will be appendended to standard console.
Example :
public class MyFeatureTest extends com.jalios.jcms.test.JcmsTestCase { private static final Logger logger = Logger.getLogger(MyFeatureTest.class.getName()); Data testData = null; protected void setUp() throws Exception { super.setUp(); logger.info("Creating new article for MyFeature test..."); Article article = new Article(); article.setWorkspace(defaultWorkspace); article.setTitle("en", "Article Title en " + new Date()); article.performCreate(admin); testData = article } public void testMethod1() { HttpSession testSession = getMockHttpSession(); assertTrue(MyFeature.method1(getMockHttpServletRequest(testSession), testData)); assertFalse(MyFeature.method1(getMockHttpServletRequest(testSession), testData)); ... } protected void tearDown() throws Exception { super.tearDown(); if (testData != null) { logger.info("Deleting article created for MyFeature test..."); testData.performDelete(admin); } } }
Field Summary | |
---|---|
protected static String |
A_VERY_LONG_TEXT
|
protected static Member |
admin
|
protected static long |
ASYNC_TEST__ITERATION_WAIT_TIME
|
protected static long |
ASYNC_TEST__MAX_ITERATION
|
protected static long |
ASYNC_TEST__MAX_WAIT_TIME_BEFORE_FAILURE
|
protected static Channel |
channel
Singleton used for testing |
protected static Group |
defaultGroup
|
protected static Workspace |
defaultWorkspace
|
protected static FriendlyURLFilter |
friendlyURLFilter
Instance of the FriendlyURLFilter being used for testing |
protected static String[] |
langs
Array of all channel languages ( channel.getLanguageList() ) |
Fields inherited from interface com.jalios.util.JaliosConstants |
---|
CRLF, MILLIS_IN_ONE_DAY, MILLIS_IN_ONE_HOUR, MILLIS_IN_ONE_MINUTE, MILLIS_IN_ONE_MONTH, MILLIS_IN_ONE_SECOND, MILLIS_IN_ONE_WEEK, MILLIS_IN_ONE_YEAR |
Constructor Summary | |
---|---|
JcmsTestCase()
|
Method Summary | ||
---|---|---|
protected void |
assertCanBeReadBy(Publication pub,
Group grp)
|
|
protected void |
assertCanBeReadBy(Publication pub,
Member mbr)
|
|
protected void |
assertCanBeReadBy(Publication pub,
Member mbr,
boolean searchInGroup)
|
|
protected void |
assertCanDeleteOther(Member mbr,
Data data)
|
|
protected void |
assertCannotBeReadBy(Publication pub,
Group grp,
RightInfo.Explanation restriction)
|
|
protected void |
assertCannotBeReadBy(Publication pub,
Member mbr,
boolean searchInGroup,
RightInfo.Explanation explanation)
|
|
protected void |
assertCannotBeReadBy(Publication pub,
Member mbr,
RightInfo.Explanation explanation)
|
|
protected void |
assertCannotDeleteOther(Member mbr,
Data data,
RightInfo.Explanation explanation)
|
|
protected void |
assertCannotUpdateOther(Member mbr,
Data data,
RightInfo.Explanation explanation)
|
|
protected void |
assertCannotWorkOn(Member mbr,
Publication pub,
RightInfo.Explanation explanation)
|
|
protected void |
assertCanUpdateOther(Member mbr,
Data data)
|
|
protected void |
assertCanWorkOn(Member mbr,
Publication pub)
|
|
protected
|
assertCmpEquals(Comparator<T> comparator,
T o1,
T o2)
|
|
protected
|
assertCmpGreater(Comparator<T> comparator,
T o1,
T o2)
|
|
protected
|
assertCmpLower(Comparator<T> comparator,
T o1,
T o2)
|
|
protected
|
assertCmpOpposite(Comparator<T> comparator,
T o1,
T o2)
|
|
protected
|
assertCmpSame(Comparator<T> c1,
Comparator<T> c2,
T o1,
T o2)
|
|
protected void |
assertDateRange(Date date,
Date lowerDate,
Date upperDate)
Assert the given date d1 is in range {d2, d3} |
|
protected void |
assertDateRangeStrict(Date date,
Date lowerDate,
Date upperDate)
Assert the given date date is in the range {lowerDate, upperDate} |
|
protected void |
assertIsEmpty(Object obj)
|
|
protected void |
assertNotEmpty(Object obj)
|
|
protected void |
assertNotSameContent(Date date1,
Date date2)
|
|
protected void |
assertNotSameContent(List<?> list1,
List<?> list2)
|
|
protected void |
assertNotSameContent(Map<?,?> map1,
Map<?,?> map2)
|
|
protected void |
assertNotSameContent(Object[] array1,
Object[] array2)
|
|
protected void |
assertNotSameContent(Set<?> set1,
Set<?> set2)
|
|
static void |
assertObjectIsGarbageCollected(WeakReference<? extends Object> wRef,
long timeout,
boolean heapDump)
Check that the specified Object (referenced through a WeakReference) is garbage collected in the designated time. |
|
protected void |
assertSameContent(Date date1,
Date date2)
|
|
protected void |
assertSameContent(List<?> list1,
List<?> list2)
|
|
protected void |
assertSameContent(Map<?,?> map1,
Map<?,?> map2)
|
|
protected void |
assertSameContent(Object[] array1,
Object[] array2)
|
|
protected void |
assertSameContent(Set<?> set1,
Set<?> set2)
|
|
protected void |
assertStatusForbidden(ControllerStatus status)
|
|
protected void |
assertStatusHasFailed(ControllerStatus status)
|
|
protected void |
assertStatusHasFailed(String prop,
ControllerStatus status)
|
|
protected void |
assertStatusOK(ControllerStatus status)
|
|
protected void |
beginTransaction()
|
|
protected void |
commitTransaction()
|
|
protected String |
dataToDebugString(Data data)
Produces output like:
[(Clazz' simple name) {data.toString()} (id)]
|
|
protected void |
deleteData(Data... array)
|
|
protected void |
deleteData(String... ids)
|
|
protected void |
deleteOnTearDown(Data data)
|
|
protected void |
deleteOnTearDown(Workspace ws,
Set<Data> initialDataSet)
Deletes on tear down the workspace, and all its Datas, but not those contained in optional initialDataSet. The initialDataSet should be initialized before the Workspace was created, using for example : |
|
protected Object |
deserialize(File file)
Deserialize the given file into a new object which is returned. |
|
protected javax.servlet.http.HttpServletRequest |
getMockHttpServletRequest()
Convenient Method to return a new instance of a fake http servlet request. |
|
protected javax.servlet.http.HttpServletRequest |
getMockHttpServletRequest(javax.servlet.http.HttpSession session)
Convenient Method to return a new instance of a fake http servlet request using the specified mock session |
|
protected javax.servlet.http.HttpServletResponse |
getMockHttpServletResponse()
Convenient Method to return a new instance of a fake http servlet response. |
|
protected javax.servlet.http.HttpServletResponse |
getMockHttpServletResponse(javax.servlet.http.HttpSession session)
Convenient Method to return a new instance of a fake http servlet response using the specified mock session |
|
protected javax.servlet.http.HttpSession |
getMockHttpSession()
Convenient Method to return a new instance of a fake http session. |
|
protected JcmsJspContext |
getMockJcmsJspContext()
Retrieve a mock explorer JcmsJspContext. |
|
protected JcmsJspContext |
getMockJcmsJspContext(javax.servlet.http.HttpServletRequest request)
Retrieve a mock explorer JcmsJspContext based on the specified request |
|
protected javax.servlet.ServletContext |
getMockServletContext()
Convenient Method to return the fake servlet context used for this test. |
|
protected File |
getResourceFile(String name)
Retrieves a new File instance pointing to the specified resource name. |
|
protected void |
prepareWorkspaceDeletion(Workspace workspace)
Remove WkRole which are referenced in other Workspaces to avoid unexpected WkRole deletion (due to Workspace.performDelete) |
|
protected void |
restoreIncomingMail()
Restores property "mail.incoming.enabled". |
|
protected void |
restoreProperties(Collection<String> names)
Restores given properties represented by their names. |
|
protected void |
restoreProperties(JProperties properties)
Restores given JProperties. |
|
protected void |
restoreProperty(String name)
Restores given property. |
|
protected File |
serialize(Object obj)
Serialize the given object into a temp file and return this file. |
|
protected void |
setIncomingMail(boolean enabled)
Sets property "mail.incoming.enabled" to enabled. |
|
protected void |
setProperties(JProperties properties)
Sets given JProperties. |
|
protected void |
setProperties(Map<String,String> map)
|
|
protected void |
setProperty(String name,
String value)
|
|
protected void |
setUp()
|
|
protected void |
sleep(long millis)
|
|
protected void |
tearDown()
|
|
protected void |
waitForAlarm(long time,
AlarmManager alarmMgr,
boolean reallyWaitFor,
String logPrefix)
|
|
protected void |
waitForLuceneIndexation(File... files)
Wait for the specified file(s) (which must be in upload directory) to be indexed in the lucene file index in its current last modified date as returned by File.lastModified() . |
|
protected void |
waitForLuceneIndexation(Publication... pubs)
Wait for the specified publication(s) to be indexed in all the lucene publication index in its current version as returned by Publication.getVersionString() . |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static FriendlyURLFilter friendlyURLFilter
protected static Channel channel
protected static String[] langs
channel.getLanguageList()
)
protected static Member admin
protected static Workspace defaultWorkspace
protected static Group defaultGroup
protected static String A_VERY_LONG_TEXT
protected static long ASYNC_TEST__MAX_WAIT_TIME_BEFORE_FAILURE
protected static long ASYNC_TEST__ITERATION_WAIT_TIME
protected static long ASYNC_TEST__MAX_ITERATION
Constructor Detail |
---|
public JcmsTestCase()
Method Detail |
---|
protected void setUp() throws Exception
Exception
protected void tearDown() throws Exception
Exception
protected javax.servlet.ServletContext getMockServletContext()
MockServletContext
protected javax.servlet.http.HttpSession getMockHttpSession()
HttpSession
protected javax.servlet.http.HttpServletRequest getMockHttpServletRequest()
MockHttpServletRequest
protected javax.servlet.http.HttpServletRequest getMockHttpServletRequest(javax.servlet.http.HttpSession session)
MockHttpServletRequest
protected javax.servlet.http.HttpServletResponse getMockHttpServletResponse()
MockHttpServletResponse
protected javax.servlet.http.HttpServletResponse getMockHttpServletResponse(javax.servlet.http.HttpSession session)
MockHttpServletResponse
protected JcmsJspContext getMockJcmsJspContext()
protected JcmsJspContext getMockJcmsJspContext(javax.servlet.http.HttpServletRequest request)
request
- the mock request to use, if null a new mock request is created
protected void assertStatusOK(ControllerStatus status)
protected void assertStatusForbidden(ControllerStatus status)
protected void assertStatusHasFailed(ControllerStatus status)
protected void assertStatusHasFailed(String prop, ControllerStatus status)
protected void assertCanBeReadBy(Publication pub, Member mbr)
protected void assertCannotBeReadBy(Publication pub, Member mbr, RightInfo.Explanation explanation)
protected void assertCanBeReadBy(Publication pub, Member mbr, boolean searchInGroup)
protected void assertCannotBeReadBy(Publication pub, Member mbr, boolean searchInGroup, RightInfo.Explanation explanation)
protected void assertCanBeReadBy(Publication pub, Group grp)
protected void assertCannotBeReadBy(Publication pub, Group grp, RightInfo.Explanation restriction)
protected void assertCanUpdateOther(Member mbr, Data data)
protected void assertCannotUpdateOther(Member mbr, Data data, RightInfo.Explanation explanation)
protected void assertCanDeleteOther(Member mbr, Data data)
protected void assertCannotDeleteOther(Member mbr, Data data, RightInfo.Explanation explanation)
protected void assertCanWorkOn(Member mbr, Publication pub)
protected void assertCannotWorkOn(Member mbr, Publication pub, RightInfo.Explanation explanation)
protected <T> void assertCmpGreater(Comparator<T> comparator, T o1, T o2)
protected <T> void assertCmpLower(Comparator<T> comparator, T o1, T o2)
protected <T> void assertCmpEquals(Comparator<T> comparator, T o1, T o2)
protected <T> void assertCmpOpposite(Comparator<T> comparator, T o1, T o2)
protected <T> void assertCmpSame(Comparator<T> c1, Comparator<T> c2, T o1, T o2)
protected void assertSameContent(Object[] array1, Object[] array2)
protected void assertNotSameContent(Object[] array1, Object[] array2)
protected void assertSameContent(Set<?> set1, Set<?> set2)
protected void assertNotSameContent(Set<?> set1, Set<?> set2)
protected void assertSameContent(List<?> list1, List<?> list2)
protected void assertNotSameContent(List<?> list1, List<?> list2)
protected void assertSameContent(Map<?,?> map1, Map<?,?> map2)
protected void assertNotSameContent(Map<?,?> map1, Map<?,?> map2)
protected void assertSameContent(Date date1, Date date2)
protected void assertNotSameContent(Date date1, Date date2)
protected void assertIsEmpty(Object obj)
protected void assertNotEmpty(Object obj)
protected void assertDateRange(Date date, Date lowerDate, Date upperDate)
date
- the date to be testedlowerDate
- the lower date limit (may be null)upperDate
- the upper date limit (may be null)protected void assertDateRangeStrict(Date date, Date lowerDate, Date upperDate)
date
- the date to be testedlowerDate
- the lower date limit (may be null)upperDate
- the upper date limit (may be null)public static void assertObjectIsGarbageCollected(WeakReference<? extends Object> wRef, long timeout, boolean heapDump)
IMPORTANT : in order for this method to work properly and success, you must get rid of all strong references of your object in the method callee. For example :
Publication pub1 = createSmallNews(admin, defaultWorkspace); pub1.performDelete(); // 1. Create WeakReference for the object WeakReference<Object> pub1WeakRef = new WeakReference<Object>(pub1); // 2. Remove strong reference for the object pub1 = null; // 3. Test object is garbage collected correctly, requesting a heap dump in case of failure assertObjectIsGarbageCollected(pub1WeakRef, 10*MILLIS_IN_ONE_SECOND, true);
Implementation note : this method will trigger a GC through System.gc()
every second until the timeout has been reached or the object is detected has garbage collected.
wRef
- the object WeakReference (required to prevent strong reference of object through callstack)timeout
- the timeout after which this method will consider (should be a multiple of 1000 ms with current implementation)heapDump
- perform HEAP dump on failure for easier debuggingprotected File getResourceFile(String name)
File testFile1 = getResourceFile("com/company/jcms/MyFeature_testFile1.txt");Current implementation is to invoke class loader of current class :
return new File(getClass().getClassLoader().getResource(name).getFile());
name
- the name of the resource, a '/'-separated path name that
identifies the resource. e.g "com/company/jcms/MyFeature_testFile1.txt"
protected File serialize(Object obj) throws Exception
obj
- the Object to be serialized
Exception
protected Object deserialize(File file) throws Exception
file
- the file
Exception
protected void beginTransaction()
protected void commitTransaction()
protected void deleteData(Data... array)
protected void deleteData(String... ids)
protected void prepareWorkspaceDeletion(Workspace workspace)
workspace
- the Workspace to be deleted.protected void deleteOnTearDown(Data data)
protected void deleteOnTearDown(Workspace ws, Set<Data> initialDataSet)
Set<Data> initialDataSet = channel.getAllDataSet();Then, the workspace is created, using :
Workspace workspace = new Workspace(); ... workspace.performCreate(admin);Then you might want to delete it on tear down, using :
deleteOnTearDown(workspace, initialDataSet);
Deleted datas will be :
ws
- the workspace to delete.initialDataSet
- a Set of Datas not to delete, since already
existing before the start of the testprotected void sleep(long millis)
millis
- the length of time to sleep in milliseconds.protected void waitForAlarm(long time, AlarmManager alarmMgr, boolean reallyWaitFor, String logPrefix)
protected void waitForLuceneIndexation(Publication... pubs)
Publication.getVersionString()
.
For this method to work properly with DBData, it must be
invoked in a different transaction than the transaction
in which the create/update operation of the DBData was
performed. Indeed indexing is trigger by the
PublicationSearchEngineListener
during the
transaction commit, thus indexing will have been performed
only after transaction end.
If needed, several verification for the maximum duration
specified ASYNC_TEST__MAX_WAIT_TIME_BEFORE_FAILURE
.
pubs
- the publications to found in index.protected void waitForLuceneIndexation(File... files)
File.lastModified()
.
If needed, several verification for the maximum duration
specified ASYNC_TEST__MAX_WAIT_TIME_BEFORE_FAILURE
.
files
- the File(s) to found in file index.protected String dataToDebugString(Data data)
[(Clazz' simple name) {data.toString()} (id)]
data
- the data to get the debug string.
protected void setProperty(String name, String value)
name
- the property name to setvalue
- the property value to setsetProperties(JProperties)
protected void setProperties(Map<String,String> map)
map
- the map of properties to setsetProperties(JProperties)
protected void setProperties(JProperties properties)
First call of this method will backup property's current value,
for automatic restore in tearDown()
.
Example:
// How to disabled channel mails setProperty("mail.enabled", "false"); // How to update several properties JProperties props = new JProperties(); props.put("my-first-property", "true"); props.put("my-second-property", "foo"); setProperties(props); // How to restore properties (If not done, it will be restored automatically during tearDown()) // Using a single String restoreProperty("mail.enabled"); // Restore one property // Using a Collection<String> restoreProperties(Util.getArrayList("my-first-property", "my-second-property"); // Restore several properties // Using a JProperties restoreProperties((JProperties) props); // Restore several properties
Complete Test Case:
If you had to write a unit test which is only relevant when site authentication is required.
Preparing and restoring the environnement at start and end of each test can be painful.
To make this initialization easier, you can do:
PrivateSiteTest extends JcmsTestCase { @Override protected void setUp() throws Exception { super.setUp(); logger.info("Channel authentication required: " + channel.isAuthenticationRequired()); // Prints "false" by default setAuthenticationRequired(true); } public void testPrivateSite() { assertTrue("The site must be private to run this test...", channel.isAuthenticationRequired()); ... } private void setAuthenticationRequired(boolean isPrivateSite) { setProperty("channel.is-authentication-required", String.valuedOf(isPrivateSite)); } }You may also want to restore initial value during the test:
PrivateSiteTest extends JcmsTestCase { ... public void testPrivateSite() { assertTrue("The site must be private to run this test...", channel.isAuthenticationRequired()); // ... first test with authentication required restoreAuthenticationRequired(); assertFalse("The site must be public to run this test...", channel.isAuthenticationRequired()); // ... second test with initial authentication required } private void restoreAuthenticationRequired() { restoreProperty("channel.is-authentication-required"); } }Implementation details:
properties
- the JProperties to setprotected void restoreProperty(String name)
name
- the name of property to restorerestoreProperties(JProperties)
protected void restoreProperties(Collection<String> names)
names
- the names of properties to restorerestoreProperties(JProperties)
protected void restoreProperties(JProperties properties)
properties
- the JProperties to restore.protected void setIncomingMail(boolean enabled)
enabled
- the value to set.protected void restoreIncomingMail()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |