Service Virtualization

  • 1.  Custom code fails at HTTPS responder step

    Posted Mar 16, 2016 03:04 PM

    Hi,

     

    I am manipulating the VS response in VSM using script.

     

    What I am doing is after 'VS Image Response Selection' I am adding scripted step and finding some values from the response and replacing with the hard coded values which I need and then sending back to 'HTTPs Responder'

     

    List list = testExec.getStateValue("lisa.vse.response");

    TransientResponse rsp = list.get(0);

    String responseBody = rsp.getBodyText();

    responseBody = responseBody.replaceAll("oldvalue","newvalue");

    testExec.setStateValue("lisa.vse.response",responseBody);

     

    My script execute properly and invokes the 'HTTPS Responder' but https responder fails with below error

     

     

     

     

    ============================================================================

    | com.thoughtworks.xstream.mapper.CannotResolveClassException: soapenv:Envelope

    ============================================================================

    | Step:        Virtual HTTPS Responder

    ----------------------------------------------------------------------------

    | Message:     soapenv:Envelope

    ----------------------------------------------------------------------------

    | Trapped Exception: soapenv:Envelope

    | Trapped Message:   com.thoughtworks.xstream.mapper.CannotResolveClassException: soapenv:Envelope

    ----------------------------------------------------------------------------

    STACK TRACE

    com.thoughtworks.xstream.mapper.CannotResolveClassException: soapenv:Envelope

      at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)

      at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45)

      at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)

      at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)

      at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)

      at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052)

      at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)

      at com.thoughtworks.xstream.XStream.fromXML(XStream.java:912)

      at com.thoughtworks.xstream.XStream.fromXML(XStream.java:903)

      at com.itko.lisa.vse.stateful.model.Streamer.fromXML(Streamer.java:92)

      at com.itko.lisa.vse.stateful.BaseRespondStep.getResponse(BaseRespondStep.java:312)

      at com.itko.lisa.vse.stateful.BaseRespondStep.getResponse(BaseRespondStep.java:296)

      at com.itko.lisa.vse.stateful.protocol.http.HttpRespondStep.respond(HttpRespondStep.java:111)

      at com.itko.lisa.vse.stateful.BaseRespondStep.execute(BaseRespondStep.java:231)

      at com.itko.lisa.test.TestNode.executeNode(TestNode.java:981)

      at com.itko.lisa.test.TestCase.execute(TestCase.java:1280)

      at com.itko.lisa.test.TestCase.execute(TestCase.java:1195)

      at com.itko.lisa.test.TestCase.executeNextNode(TestCase.java:1180)

      at com.itko.lisa.editor.WalkThruPanel.prepAndExecNode(WalkThruPanel.java:1048)

      at com.itko.lisa.editor.WalkThruPanel.access$900(WalkThruPanel.java:68)

      at com.itko.lisa.editor.WalkThruPanel$10.doCallback(WalkThruPanel.java:961)

      at com.itko.util.swing.panels.ProcessingDialog$2.run(ProcessingDialog.java:194)

      at java.lang.Thread.run(Unknown Source)

    ============================================================================



  • 2.  Re: Custom code fails at HTTPS responder step

    Posted Mar 16, 2016 08:15 PM

    Hey Hi,

     

    Can you print the values of rsp & final responseBody prepared by your custom script???



  • 3.  Re: Custom code fails at HTTPS responder step

    Posted Mar 16, 2016 09:09 PM

    yes I can print that..

     

    But the response I sent to HTTP responder is not able to parse it ( I guess)



  • 4.  Re: Custom code fails at HTTPS responder step

    Posted Mar 17, 2016 05:05 AM

    Hi,

     

    Here you are explicitly setting up the response in lisa.vse.response property with xml response (string).

    HTTP/S cannot interpret the raw response (XML) because it expects an object or you can say a transaction object.

    Therefore it is running into class exception.

     

    I will let you know the resolution to this ASAP.

     



  • 5.  Re: Custom code fails at HTTPS responder step

    Posted Mar 17, 2016 07:20 AM

    Thanks Rahul.. Thats what I am guessing too.

    I did try deserializing and convert xml to object but did not solve my issue.. 

     

    I am not sure why setStateObject also did not work..



  • 6.  Re: Custom code fails at HTTPS responder step

    Posted Mar 17, 2016 10:42 AM

    That's correct, the response needs to be set to a TransientResponse object.  Here is a working example of how to configure the lisa.vse.response object:

     

    import com.itko.lisa.vse.stateful.model.Response;

    import com.itko.lisa.vse.stateful.model.TransientResponse;

    import com.itko.util.Parameter;

    import com.itko.util.ParameterList;

     

    // Create the VSE Response Object

    Response response = new Response();

    response.setBody(lisa_vse_request.getBodyAsString());

     

    // Add HTTP Response Headers

    ParameterList metaData = new ParameterList();

    metaData.addParameter(new Parameter("HTTP-Response-Code", "200"));

    metaData.addParameter(new Parameter("HTTP-Response-Code-Text", "OK"));

    metaData.addParameter(new Parameter("Content-Type", "text/xml"));

    response.setMetaData(metaData);

     

    // The lisa.vse.response object is a TransientResponse object, so wrap it in that

    TransientResponse transientResponse = new TransientResponse(response);

    testExec.setStateObject("lisa.vse.response", transientResponse);

     

     

    The above example simply echo's the incoming request back as the response.  In your case you'll simply need to wrap your response object in a TransientResponse and set that as the lisa.vse.response.  Hopefully that should get you going in the right direction.

     

    Josh



  • 7.  Re: Custom code fails at HTTPS responder step

    Posted Mar 17, 2016 03:25 PM

    Josh_Hendrick

    Thanks a lot Josh for your time..

    I made lisa.vse.response into transient response and it works.. my code is below

     

    if (condition )

    {

    responseList = testExec.getStateObject("lisa.vse.response");

    String responseText = "";

    int i = 0;

    TransientResponse response = responseList.get(i);

    responseText = responseText + response.getBodyAsString();

    responseText = responseText.replaceAll("oldValue","newValue");

    testExec.setStateObject("lisa.vse.response", responseText);

    Response rescon = new Response();

    rescon.setBodyText(responseText);

    TransientResponse transientResponse = new TransientResponse(rescon);

    testExec.setStateObject("lisa.vse.response", transientResponse);

    }

    else

    {

    <other code;>

    }

     

    but I have seen other issue now ..

    the response object lisa.vse.response contains only soap response without any response meta data properties..

    Hence http responder fails as there are no meta data properties..

    I have added those via code and it works.. but I wanted to do so rather than add it via code and hard code it.. I wanted to use whatever available for the particular response in VSI..

    please suggest how can I do this ..

     

    and thanks for your help..



  • 8.  Re: Custom code fails at HTTPS responder step
    Best Answer

    Posted Mar 17, 2016 03:38 PM

    Since you created a new Response object in your code there will be no meta data parameters configured on that object.  You should be able to pull them from the original TransientResponse object using:

     

    public ParameterList getMetaData();

     

    ParameterList in this case is just a list of meta data parameters and is a wrapper around a Vector object.  You can use:

     

    public void setMetaData(ParameterList newMetaData)

     

    If you want to inspect the Parameters, you can use a loop and use the following on ParameterList:

     

    public Parameter get(int index)

     

    Parameter contains:

    public String getName();

    public String getValue();

     

    Let me know if you have any questions.