Sling JUnit sample integration tests fail when deployed and executed on CQ 5.4
------------------------------------------------------------------------------

                 Key: SLING-2091
                 URL: https://issues.apache.org/jira/browse/SLING-2091
             Project: Sling
          Issue Type: Bug
          Components: Testing
    Affects Versions: Commons Testing 2.0.6
         Environment: Windows 7 64bit, Maven 3.0.3, Adobe CQ 5.4
            Reporter: Mark Adamcin
            Priority: Minor


After deploying the sling junit runtime bundles, sling testing tools, and 
sample server-side tests to a local CQ 5.4 instance, several sample integration 
tests fail when trying to run `mvn install` for the integration tests bundle.

Bundles deployed to instance using JCR Install:
/apps/bundles/install/org.apache.sling.testing.tools-1.0.5-SNAPSHOT.jar
/apps/bundles/install/org.apache.sling.junit.core-1.0.7-SNAPSHOT.jar
/apps/bundles/install/org.apache.sling.junit.scriptable-1.0.7-SNAPSHOT.jar
/apps/bundles/install/org.apache.sling.junit.remote-1.0.7-SNAPSHOT.jar
/apps/bundles/install/org.apache.sling.testing.samples.sampletests-1.0.7-SNAPSHOT.jar
/apps/bundles/install/org.apache.sling.testing.samples.failingtests-1.0.7-SNAPSHOT.jar

I copied and modified the org.apache.sling.testing.samples.integrationtests 
module to run the tests against a running local CQ 5.4 instance listening on 
port 4502.

Upon the first execution, the following tests failed:

##########
Failed tests: 
  
testScriptableTest[0](org.apache.sling.testing.samples.integrationtests.serverside.scriptable.ScriptableTestsTest):
 MKCOL request to http://localhost:6502/apps/testing: expecting status 201 
expected:<201> but was:<405>
  
testScriptableTest[1](org.apache.sling.testing.samples.integrationtests.serverside.scriptable.ScriptableTestsTest):
 MKCOL request to http://localhost:6502/apps/testing: expecting status 201 
expected:<201> but was:<405>
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideSingleMethodTest):
 RetryLoop failed, condition is false after 30 seconds: Expecting 
/test/sling/1306687266726.junit to return HTTP status 200
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideTest):
 /test/sling/1306687266726.junit check failed previously, cannot run tests
##########

The first couple failures are related to the ScriptableTestsTest use of a 
SlingClient.mkdirs() method to create the /apps/testing/ScriptableTests path. 
The <405> response indicates that the client attempted to create a folder that 
already exists, even though it should be checking for existence first when 
mkdir calls SlingClient.exists(). 

The problem is that, unlike the MKCOL request in the mkdir() method, the 
SlingClient.exists() method does not pass the ADMIN credentials along with the 
GET request it creates, which results in a failure to read the nodes. I made 
progress in the tests by adding a ".withCredentials(username, password)" to the 
request builder call in SlingClient.java on line 206.


The next execution resulted in the following failed tests:

##########
Failed tests: 
  
testScriptableTest[0](org.apache.sling.testing.samples.integrationtests.serverside.scriptable.ScriptableTestsTest):
 Expected 0 failing tests but got 1: 
[verifyContent[0](org.apache.sling.junit.scriptable.TestAllPaths): Expecting 
HTTP status 200 for path /apps/testing/ScriptableTests/testnode.test.txt 
expected:<200> but was:<500>]
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideSingleMethodTest):
 RetryLoop failed, condition is false after 30 seconds: Expecting 
/test/sling/1306688554150.junit to return HTTP status 200
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideTest):
 /test/sling/1306688554150.junit check failed previously, cannot run tests
##########

The first failure, "testScriptableTest" referred to a 500 response, and the 
cause for this was a NullPointerException:

29.05.2011 10:02:33.985 *ERROR* [127.0.0.1 [1306688553968] POST 
/system/sling/junit/org.apache.sling.junit.scriptable.ScriptableTestsProvider.json
 HTTP/1.1] org.apache.sling.engine.impl.SlingRequestProcessorImpl service: 
Uncaught Throwable java.lang.NullPointerException
        at 
org.apache.sling.engine.impl.parameters.ParameterSupport.getContainerParameters(ParameterSupport.java:154)
        at 
org.apache.sling.engine.impl.parameters.ParameterSupport.getRequestParameterMapInternal(ParameterSupport.java:119)
        at 
org.apache.sling.engine.impl.parameters.ParameterSupport.getParameter(ParameterSupport.java:85)
        at 
org.apache.sling.engine.impl.SlingHttpServletRequestImpl.getParameter(SlingHttpServletRequestImpl.java:143)
        at 
org.apache.sling.bgservlets.impl.BackgroundServletStarterFilter.doFilter(BackgroundServletStarterFilter.java:105)
        at 
org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:60)
        at 
org.apache.sling.engine.impl.SlingRequestProcessorImpl.processRequest(SlingRequestProcessorImpl.java:161)
        at 
org.apache.sling.junit.scriptable.TestAllPaths.verifyContent(TestAllPaths.java:62)
        ...

This can be traced to the BackgroundServletStarterFilter attempting to get a 
parameter from the org.apache.sling.junit.scriptable.HttpRequest object that 
was passed to the request processor by the TestAllPaths.verifyContent() method. 
The HttpRequest.getParameterMap() method currently returns a null pointer and 
the ParameterSupport class does not check for. A quick workaround was to add a 
Map<String, String> member to the HttpRequest class and to return it in the 
getParameterMap() method.

The next execution result in the following failed tests:

##########
Failed tests: 
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideSingleMethodTest):
 RetryLoop failed, condition is false after 30 seconds: Expecting 
/test/sling/1306689608120.junit to return HTTP status 200
  
initializationError(org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideTest):
 /test/sling/1306689608120.junit check failed previously, cannot run tests
##########

The above failure resulted from missing admin credentials in the 
org.apache.sling.testing.tools.http.RetryingContentChecker's 
RetryLoop.Condition. I added a ".withCredentials(SlingTestBase.ADMIN, 
SlingTestBase.ADMIN)" call to the request builder, which seems to fix that 
problem.

The next execution resulted in the following reported errors:

##########
Tests in error: 
  
org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideSingleMethodTest:
 POST request to 
http://localhost:6502/test/sling/1306690571924.junit/org.apache.sling.testing.samples.sampletests.JUnit4Test/testRequiresBefore.json:
 expecting status 200 expected:<200> but was:<500>
  
org.apache.sling.testing.samples.integrationtests.serverside.sling.SlingServerSideTest:
 POST request to 
http://localhost:6502/test/sling/1306690571924.junit/org.apache.sling.testing.samples.sampletests.json:
 expecting status 200 expected:<200> but was:<500>
##########

The above errors were again the result of a lack of permission to execute a 
test's HTTP Request. Here are the associated entries in 
crx-quickstart/logs/error.log:

29.05.2011 10:36:11.977 *ERROR* [127.0.0.1 [1306690571975] POST 
/test/sling/1306690571924.junit/org.apache.sling.testing.samples.sampletests.JUnit4Test/testRequiresBefore.json
 HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation 
Access Denied cannot read item cafebabe-cafe-babe-cafe-babecafebabe 
29.05.2011 10:36:12.036 *ERROR* [127.0.0.1 [1306690572033] POST 
/test/sling/1306690571924.junit/org.apache.sling.testing.samples.sampletests.json
 HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation 
Access Denied cannot read item cafebabe-cafe-babe-cafe-babecafebabe 

In this case, the request originates from the 
org.apache.sling.junit.remote.httpclient.RemoteTestHttpClient.runTests() 
method. Again, I added a ".withCredentials(SlingTestBase.ADMIN, 
SlingTestBase.ADMIN)" call to the request builder, and this resolved the errors.

After making that change and running the tests again, no other errors were 
reported:

##########
Results :

Tests run: 22, Failures: 0, Errors: 0, Skipped: 0
##########


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to