Skip to main content

ATG DUST: How to invoke OOB Droplets


ATG DUST(Dynamo Unit and System Tests) is a framework for building JUnit tests for applications built on the ATG Dynamo platform. This framework allows one to quickly write test code that depends up Nucleus or ATG Repositories.

You can download the latest version of ATG DUST from http://sourceforge.net/projects/atgdust/. It provides both both src and lib files.

To write an ATG JUNIT testcase to invoke an existing OOB Droplet, follow the following steps :

  1. Create an Eclipse project with the downloaded src and lib files.
  2. Give class path to the follwing files : <ATG_Folder>\das\lib\classes.jar , <ATG_Folder>\dps\lib\classes.jar  and <ATG_Folder>\das\lib\resources.jar ,  <ATG_Folder>\dps\lib\resources.jar
  3. Create an environment variable DUST_HOME and point it to your ATG junit folder, for example: D:\SonyTools\Atg_DUST_JUnitTest\java
  4. To compile the ATG DUST for ATG 2007 version, edit the downloaded DUST java src file atg.servlet.ServletTestUtils to correct the imports atg.test.io.ByteBufferInputStream; and atg.test.io.ByteBufferOutputStream;
  5. Create a folder named “licenseconfig” under DUST_HOME and copy the ATG License files from <ATG_Folder>\home\localconfig\ to this new licenseconfig folder.
  6. Create your test java file, for example find below the DropletInvokerTest.java to do the unit testing of the OOB droplets : /atg/dynamo/droplet/Switch  and /atg/dynamo/droplet/ForEach.
  7. Create a folder named \data\DropletInvokerTest\config\  in the  <DUST_HOME>\src folder if your test file is DropletInvokerTest.java
  8. After doing the build, execute your code by invoking Run as JUNIT Test from Eclipse.

     package com.mycompany.test;

     import java.io.IOException;
     import java.util.HashMap;
     import java.util.List;

     import javax.servlet.ServletException;

     import atg.droplet.DropletInvoker;
     import atg.droplet.DropletInvoker.DropletResult;
     import atg.droplet.DropletInvoker.RenderedOutputParameter;
     import atg.nucleus.Nucleus;
     import atg.nucleus.NucleusTestUtils;
     import atg.servlet.DynamoHttpServletRequest;
     import atg.servlet.ServletUtil;
     import atg.test.AtgDustCase;

     public class DropletInvokerTest extends AtgDustCase {
Nucleus mNucleus;
/**
* Start up Nucleus with Initial services
*/
protected void setUp() throws Exception {
 super.setUp();
 mNucleus = NucleusTestUtils.startNucleusWithModules(
new String[] {"DAS","DafEar"}, this.getClass(),
"/atg/dynamo/droplet/Switch");
}
/**
* Shut down Nucleus
*/
protected void tearDown() throws Exception {
super.tearDown();
ServletUtil.setCurrentRequest(null);
if (mNucleus != null) {
  NucleusTestUtils.shutdownNucleus(mNucleus);
  mNucleus = null;
 }
}
/** Test the DropletInvoker */
public void testInvoker() throws ServletException, IOException {
 doTestSwitch();
 doTestFor();
}
public void doTestSwitch() throws ServletException, IOException {
 DropletInvoker invoker = new DropletInvoker(mNucleus);
 DynamoHttpServletRequest request = invoker.getRequest();
 DropletResult result = null;
 request.setParameter("value", "foo");
 result = invoker.invokeDroplet("/atg/dynamo/droplet/Switch");
 assertNotNull("Make sure that foo got rendered",result.getRenderedOutputParameter("foo"));
 System.out.println("result.getRenderedOutputParameter(foo)-->"+ result.getRenderedOutputParameter("foo"));
}
public void doTestFor() throws ServletException, IOException {
 DropletInvoker invoker = new DropletInvoker(mNucleus);
 DynamoHttpServletRequest request = invoker.getRequest();
 DropletResult result = null;
 String[] strings = new String[] { "one", "two", "three", "four", "five" };
 HashMap<String, Object> params = new HashMap<String,Object>();
 params.put("array", strings);
 result = invoker.invokeDroplet("/atg/dynamo/droplet/ForEach", params);
 assertNotNull("Make sure output got rendered at least once",result.getRenderedOutputParameter("output", false));
 List<RenderedOutputParameter> listOutputs = result.getRenderedOutputParametersByName("output");
 assertEquals("Make sure output was rendered 5 times",5, listOutputs.size());
 for (int i = 0; i < strings.length; i++) {
   RenderedOutputParameter oparam = listOutputs.get(i);
   assertEquals("Should be the same as from the list ", oparam, result.getRenderedOutputParameter("output", i));
   System.out.println(" result.getRenderedOutputParameter(output, i)-->"+ result.getRenderedOutputParameter("output", i));
   assertEquals("Element should be our string", strings[i], (String)oparam.getFrameParameter("element"));
   System.out.println("(String)oparam.getFrameParameter(element)-->"+ (String)oparam.getFrameParameter("element"));
 }
}

Comments

  1. This comment has been removed by the author.

    ReplyDelete
  2. how to mock request and response for a formhandler in ATG Dust? Please explain

    ReplyDelete

Post a Comment

Popular posts from this blog

Google Chrome shortcut keys

If you are a Google Chromey guy, please find below the list of shortcut keys for some of the most used features  :-) Find more shortcut keys @  http://www.google.com/support/chrome/bin/static.py?page=guide.cs&guide=25799&topic=28650

Lucene, sample JAVA code to Search an indexed file folder

Please find below the Lucene sample JAVA code to search the files inside a folder. This code will search the indexed folder for a search query in an indexed field. This java code is expecting the index path ( where the index files were created ) , field which need to be searched and the query need be searched as program arguments like  "java SearchFiles [-index dir] [-field f] [-query string]" . import java.io.File; import java.util.ArrayList; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class SearchFiles { public static void main(Stri...

Tax Credit Statement ( Form 26AS )

Read more about Tax filing @  http://tips4ufromsony.blogspot.com/2011/07/income-tax-process-and-e-filing.html  . Form 26AS is a consolidated tax statement issued under Rule 31 AB of Income Tax Rules to PAN holders. This statement, with respect to a financial year, will include details of: Tax deducted at source (TDS). Tax collected at source (TCS). Advance tax/self assessment tax/regular assessment tax etc., deposited in the bank by the taxpayers (PAN holders). Paid refund received during the financial year. Form 26AS will be prepared only with respect to Financial Year 05-06 onwards. To view the Form26AS , log-in to https://incometaxindiaefiling.gov.in and click on ‘View Tax Credit Statement (From 26AS)’  in ‘My Account’. Read more about Form 26AS  @ http://www.incometaxindia.gov.in/26ASTaxCreditStatement.asp http://www.tin-nsdl.com/form26as.asp

Eclipse plug-in to create Class and Sequence diagrams

ModelGoon is an Eclipse plug-in avaiable for UML diagram generation from Java code. It can be used to generate Package Dependencies Diagram, Class Diagram, Interaction Diagram and Sequence Diagram. You coud get it from http://marketplace.eclipse.org/content/modelgoon-uml4java Read more about it and see some vedios about how to create the class and sequence diagram @ http://www.modelgoon.org/?tag=eclipse-plugin Find some snapshots below which gives an idea about the diagram generation.

ATG Search - search engine tuning settings

In this blog, I am going to list the best tuning settings for ATG Search engine. The AESoapConfig.xml, AESoapWaspConfig.xml  and AEConfig.xml are the xmls referred below and you can find it @  <ATG_DIR>\<Searchx.x>\SearchEngine\<operating_system>\bin\ folder. (1)  Make sure that the AESoapConfig.xml's rwTimeout is less than or equal to routing's readTimeoutMs. You could find the routing's readTimeoutMs @ atg\search\routing\SearchEngineService component.               rwTimeout is the  length of time in seconds to wait before a read or write operation times out on an active connection. The number can be decreased to improve performance. However, a value that is too low could cause slow connections to be prematurely closed. (2)  Adjust the number of engine threads to match the number of CPUs available to the engine. Note that the minimal value for maxThreads and maxSpar...