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

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...

Good features of Eclipse 3.6 (Eclipse Helios) JDT

Read the Eclipse Galileo features @  http://tips4ufromsony.blogspot.com/2011/10/good-features-of-eclipse35-eclipse.html New options in Open Resource dialog : The Open Resource dialog supports three new features: • Path patterns: If the pattern contains a /, the part before the last / is used to match a path in the workspace: • Relative paths: For example, "./T" matches all files starting with T in the folder of the active editor or selection: • Closer items on top: If the pattern matches many files with the same name, the files that are closer to the currently edited or selected resource are shown on top of the matching items list. MarketPlace :  Searching and adding new plugins for Eclipse have always been a challenge. The Eclipse Marketplace makes this much easier – it allows you to not only search a central location of all Eclipse plugins, but also allows you to find the most recent and the most popular plugins. Fix multiple proble...

ATG Search Indexing - overview of different steps in search indexing

Read more about the search indexing behind the scene steps @  http://tips4ufromsony.blogspot.in/2011/12/atg-search-indexing-behind-scene-steps.html ATG Search prepares searchable content by indexing the products specified in the XML definition file (/atg/commerce/search/ProductCatalogOutputConfig). Generally there are two types of indexing 1.  Full Indexing  --> all data taken for indexing 2.  Incremental Indexing --> only changed data will be taken for indexing When full indexing is triggered, following happens:    1. The out of box component BulkLoader will call IndexedItemsGroup.getGroupMembers() to load the products to the XHTL document. It prevents uncategorized products from getting indexed. The definition file format begins with a top-level item as a product and includes the properties of parent category and childskus. For each product, the set of Variant Producers configured in ProductCatalogOutputConfig is execute...

GC Log Analyzer from IBM

This blog is about the GC( garbage collection) log analyzer from IBM. If you have a GC log and you want to analyze the file,  this IBM tool will help you with some graphical analyzer and some recommendations. You can download it from the following URL : https://www.ibm.com/support/pages/ibm-pattern-modeling-and-analysis-tool-java-garbage-collector-pmat Please find below some screenshots and details that might help you. 1. Screenshot 1: 2. Screenshot 2 : 3. Screenshot 3 : 4. Screenshot 4: