/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.servlets; import java.io.File; import java.io.StringWriter; import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.servletunit.ServletRunner; import com.meterware.servletunit.ServletUnitClient; import org.ldaptive.AbstractTest; import org.ldaptive.LdapEntry; import org.ldaptive.SearchResult; import org.ldaptive.TestUtils; import org.ldaptive.io.Dsmlv1Writer; import org.ldaptive.io.JsonWriter; import org.testng.AssertJUnit; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Parameters; import org.testng.annotations.Test; /** * Unit test for {@link SearchServlet}. * * @author Middleware Services */ public class ServletSearchExecutorTest extends AbstractTest { /** Entry created for tests. */ private static LdapEntry testLdapEntry; /** To test servlets with. */ private ServletRunner servletRunner; /** * @param ldifFile to create. * @param webXml web.xml for queries * * @throws Exception On test failure. */ @Parameters({ "createEntry11", "webXml" }) @BeforeClass(groups = {"servlet"}) public void createLdapEntry(final String ldifFile, final String webXml) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); testLdapEntry = TestUtils.convertLdifToResult(ldif).getEntry(); super.createLdapEntry(testLdapEntry); servletRunner = new ServletRunner(new File(webXml)); } /** @throws Exception On test failure. */ @AfterClass(groups = {"servlet"}) public void deleteLdapEntry() throws Exception { super.deleteLdapEntry(testLdapEntry.getDn()); servletRunner.shutDown(); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "ldifSearchServletQuery", "ldifSearchServletAttrs", "ldifSearchServletLdif" }) @Test(groups = {"servlet"}) public void ldifSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String expected = TestUtils.readFileIntoString(ldifFile); final ServletUnitClient sc = servletRunner.newClient(); final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/LdifSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/plain", response.getContentType()); final SearchResult result = TestUtils.convertLdifToResult(response.getText()); AssertJUnit.assertEquals(TestUtils.convertLdifToResult(expected), result); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "dsmlSearchServletQuery", "dsmlSearchServletAttrs", "dsmlSearchServletLdif" }) @Test(groups = {"servlet"}) public void dsmlSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); final SearchResult result = TestUtils.convertLdifToResult(ldif); // convert ldif into dsmlv1 final StringWriter s1w = new StringWriter(); final Dsmlv1Writer d1w = new Dsmlv1Writer(s1w); d1w.write(result); final String dsmlv1 = s1w.toString(); final ServletUnitClient sc = servletRunner.newClient(); // test basic dsml query final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/DsmlSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/xml", response.getContentType()); // active directory uppercases CN in the DN AssertJUnit.assertEquals( dsmlv1, response.getText().replaceAll("CN=", "cn=").replaceAll("OU=Test", "ou=test").replaceAll("DC=", "dc=")); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "jsonSearchServletQuery", "jsonSearchServletAttrs", "jsonSearchServletLdif" }) @Test(groups = {"servlet"}) public void jsonSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); final SearchResult result = TestUtils.convertLdifToResult(ldif); // convert ldif into json final StringWriter s1w = new StringWriter(); final JsonWriter j1w = new JsonWriter(s1w); j1w.write(result); final String json = s1w.toString(); final ServletUnitClient sc = servletRunner.newClient(); // test basic json query final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/JsonSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("application/json", response.getContentType()); // active directory uppercases CN in the DN AssertJUnit.assertEquals( json, response.getText().replaceAll("CN=", "cn=").replaceAll("OU=Test", "ou=test").replaceAll("DC=", "dc=")); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "ldifTemplateSearchQuery", "ldifTemplateSearchAttrs", "ldifTemplateSearchLdif" }) @Test(groups = {"servlet"}) public void templatesLdifSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String expected = TestUtils.readFileIntoString(ldifFile); final ServletUnitClient sc = servletRunner.newClient(); final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/TemplatesLdifSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/plain", response.getContentType()); final SearchResult result = TestUtils.convertLdifToResult(response.getText()); AssertJUnit.assertEquals(TestUtils.convertLdifToResult(expected), result); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "dsmlTemplateSearchQuery", "dsmlTemplateSearchAttrs", "dsmlTemplateSearchLdif" }) @Test(groups = {"servlet"}) public void templatesDsmlSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); final SearchResult result = TestUtils.convertLdifToResult(ldif); // convert ldif into dsmlv1 final StringWriter s1w = new StringWriter(); final Dsmlv1Writer d1w = new Dsmlv1Writer(s1w); d1w.write(result); final String dsmlv1 = s1w.toString(); final ServletUnitClient sc = servletRunner.newClient(); final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/TemplatesDsmlSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/xml", response.getContentType()); // active directory uppercases CN in the DN AssertJUnit.assertEquals( dsmlv1, response.getText().replaceAll("CN=", "cn=").replaceAll("OU=Test", "ou=test").replaceAll("DC=", "dc=")); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "jsonTemplateSearchQuery", "jsonTemplateSearchAttrs", "jsonTemplateSearchLdif" }) @Test(groups = {"servlet"}) public void templatesJsonSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String ldif = TestUtils.readFileIntoString(ldifFile); final SearchResult result = TestUtils.convertLdifToResult(ldif); // convert ldif into json final StringWriter s1w = new StringWriter(); final JsonWriter j1w = new JsonWriter(s1w); j1w.write(result); final String json = s1w.toString(); final ServletUnitClient sc = servletRunner.newClient(); final WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/TemplatesJsonSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); final WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("application/json", response.getContentType()); // active directory uppercases CN in the DN AssertJUnit.assertEquals( json, response.getText().replaceAll("CN=", "cn=").replaceAll("OU=Test", "ou=test").replaceAll("DC=", "dc=")); } /** * @param query to search for. * @param attrs attributes to return from search * @param ldifFile to compare with * * @throws Exception On test failure. */ @Parameters( { "ldifTemplateSearchQuery", "ldifTemplateSearchAttrs", "ldifTemplateSearchLdif" }) @Test(groups = {"servlet"}) public void templatesLdifIgnoreSearchServlet(final String query, final String attrs, final String ldifFile) throws Exception { final String expected = TestUtils.readFileIntoString(ldifFile); final ServletUnitClient sc = servletRunner.newClient(); WebRequest request = new PostMethodWebRequest("http://servlets.ldaptive.org/TemplatesLdifIgnoreSearch"); request.setParameter("query", query); request.setParameter("attrs", attrs.split("\\|")); WebResponse response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/plain", response.getContentType()); final SearchResult result = TestUtils.convertLdifToResult(response.getText()); AssertJUnit.assertEquals(TestUtils.convertLdifToResult(expected), result); request = new PostMethodWebRequest("http://servlets.ldaptive.org/TemplatesLdifIgnoreSearch"); request.setParameter("query", "df"); response = sc.getResponse(request); AssertJUnit.assertNotNull(response); AssertJUnit.assertEquals("text/plain", response.getContentType()); AssertJUnit.assertEquals("", response.getText()); } }