/* * Copyright 2014, Simon Matić Langford * Copyright 2014, The Sporting Exchange Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.betfair.testing.utils.cougar; import com.betfair.testing.utils.JSONHelpers; import com.betfair.testing.utils.cougar.assertions.AssertionUtils; import com.betfair.testing.utils.cougar.beans.HttpCallBean; import com.betfair.testing.utils.cougar.beans.HttpResponseBean; import com.betfair.testing.utils.cougar.enums.CougarMessageContentTypeEnum; import com.betfair.testing.utils.cougar.enums.CougarMessageProtocolRequestTypeEnum; import com.betfair.testing.utils.cougar.helpers.CougarHelpers; import com.betfair.testing.utils.cougar.manager.CougarManager; import com.betfair.testing.utils.cougar.manager.LogTailer; import com.betfair.testing.utils.cougar.manager.RequestLogRequirement; import com.betfair.testing.utils.cougar.misc.XMLHelpers; import org.json.JSONObject; import org.w3c.dom.Document; import java.sql.Timestamp; import java.util.*; /** * New utility for writing integration tests via. Initially just delegates to old code. */ class LegacyCougarTestingInvoker implements CougarTestingInvoker { private CougarManager cougarManager = CougarManager.getInstance(); private HttpCallBean httpCallBeanBaseline; private String version; private String operation; private Map<String, String> headerParams = new HashMap<>(); private Map<String, String> queryParams = new HashMap<>(); private int expectedHttpStatusCode; private String expectedHttpStatusText; private Timestamp timestamp; private int numCalls; private Document expectedResponseXML; private JSONObject expectedResponseJson; private LogTailer.LogLine[] requestLogEntries; private String soapBody; private List<Map<String, String>> jsonCalls; private List<String> expectedResponsesJsonRpc; public LegacyCougarTestingInvoker() { httpCallBeanBaseline = cougarManager.getNewHttpCallBean(); jsonCalls = new LinkedList<>(); expectedResponsesJsonRpc = new ArrayList<>(); } public static LegacyCougarTestingInvoker create() { return new LegacyCougarTestingInvoker(); } public CougarTestingInvoker setService(String serviceName) { return setService(serviceName, serviceName); } public CougarTestingInvoker setService(String serviceName, String path) { httpCallBeanBaseline.setServiceName(serviceName, path); return this; } public CougarTestingInvoker setVersion(String version) { httpCallBeanBaseline.setVersion("v"+(version.substring(0,version.indexOf(".")))); this.version = version; return this; } public CougarTestingInvoker setOperation(String operation) { return setOperation(operation,operation); } public CougarTestingInvoker setOperation(String operation, String operationPath) { httpCallBeanBaseline.setOperationName(operationPath); this.operation = operation; return this; } public CougarTestingInvoker addHeaderParam(String key, String value) { headerParams.put(key, value); return this; } public CougarTestingInvoker addQueryParam(String key, String value) { queryParams.put(key, value); return this; } @Override public CougarTestingInvoker makeSoapCall() { this.timestamp = new Timestamp(System.currentTimeMillis()); this.numCalls = 1; httpCallBeanBaseline.setHeaderParams(headerParams); Document request = new XMLHelpers().getXMLObjectFromString(soapBody); httpCallBeanBaseline.setPostObjectForRequestType(request, "SOAP"); cougarManager.makeSoapCougarHTTPCalls(httpCallBeanBaseline); return this; } public CougarTestingInvoker makeMatrixRescriptCalls(CougarMessageContentTypeEnum... mediaTypes) { this.timestamp = new Timestamp(System.currentTimeMillis()); this.numCalls = mediaTypes.length*mediaTypes.length; // Set the parameters to empty lists of string httpCallBeanBaseline.setHeaderParams(headerParams); httpCallBeanBaseline.setQueryParams(queryParams); // Get current time for getting log entries later timestamp = new Timestamp(System.currentTimeMillis()); // Make the 4 REST calls to the operation // this ignores the media types that have been set cougarManager.makeRestCougarHTTPCalls(httpCallBeanBaseline); return this; } @Override public CougarTestingInvoker makeJsonRpcCalls() { this.timestamp = new Timestamp(System.currentTimeMillis()); this.numCalls = 1; httpCallBeanBaseline.setHeaderParams(headerParams); httpCallBeanBaseline.setJSONRPC(true); Map<String,String>[] mapArray = jsonCalls.toArray(new Map[jsonCalls.size()]); httpCallBeanBaseline.setBatchedRequests(mapArray); cougarManager.makeRestCougarHTTPCall(httpCallBeanBaseline, CougarMessageProtocolRequestTypeEnum.RESTJSON, CougarMessageContentTypeEnum.JSON); return this; } @Override public CougarTestingInvoker setSoapBody(String body) { this.soapBody = body; return this; } @Override public CougarTestingInvoker addJsonRpcMethodCall(String id, String method, String body) { Map<String,String> call = new HashMap<>(); call.put("id",id); call.put("method",method); call.put("params",body); jsonCalls.add(call); return this; } @Override public CougarTestingInvoker addJsonRpcExpectedResponse(String body) { expectedResponsesJsonRpc.add(body); return this; } public CougarTestingInvoker setExpectedResponse(CougarMessageContentTypeEnum mediaType, String response) { if (mediaType == CougarMessageContentTypeEnum.XML) { expectedResponseXML = new XMLHelpers().getXMLObjectFromString(response); } else if (mediaType == CougarMessageContentTypeEnum.JSON) { try { expectedResponseJson = new JSONHelpers().createAsJSONObject(new JSONObject(response)); } catch (Exception e) { throw new RuntimeException(e); } } else { throw new IllegalArgumentException("Unexpected media type: "+mediaType); } return this; } public CougarTestingInvoker setExpectedHttpResponse(int code, String text) { expectedHttpStatusCode = code; expectedHttpStatusText = text; return this; } public CougarTestingInvoker verify() { if (expectedResponseXML != null) { // Check the 4 responses are as expected HttpResponseBean response7 = httpCallBeanBaseline.getResponseObjectsByEnum(com.betfair.testing.utils.cougar.enums.CougarMessageProtocolResponseTypeEnum.RESTXMLXML); AssertionUtils.multiAssertEquals(expectedResponseXML, response7.getResponseObject()); AssertionUtils.multiAssertEquals(expectedHttpStatusCode, response7.getHttpStatusCode()); AssertionUtils.multiAssertEquals(expectedHttpStatusText, response7.getHttpStatusText()); HttpResponseBean response10 = httpCallBeanBaseline.getResponseObjectsByEnum(com.betfair.testing.utils.cougar.enums.CougarMessageProtocolResponseTypeEnum.RESTJSONXML); AssertionUtils.multiAssertEquals(expectedResponseXML, response10.getResponseObject()); AssertionUtils.multiAssertEquals(expectedHttpStatusCode, response10.getHttpStatusCode()); AssertionUtils.multiAssertEquals(expectedHttpStatusText, response10.getHttpStatusText()); } if (expectedResponseJson != null) { HttpResponseBean response8 = httpCallBeanBaseline.getResponseObjectsByEnum(com.betfair.testing.utils.cougar.enums.CougarMessageProtocolResponseTypeEnum.RESTJSONJSON); AssertionUtils.multiAssertEquals(expectedResponseJson, response8.getResponseObject()); AssertionUtils.multiAssertEquals(expectedHttpStatusCode, response8.getHttpStatusCode()); AssertionUtils.multiAssertEquals(expectedHttpStatusText, response8.getHttpStatusText()); HttpResponseBean response9 = httpCallBeanBaseline.getResponseObjectsByEnum(com.betfair.testing.utils.cougar.enums.CougarMessageProtocolResponseTypeEnum.RESTXMLJSON); AssertionUtils.multiAssertEquals(expectedResponseJson, response9.getResponseObject()); AssertionUtils.multiAssertEquals(expectedHttpStatusCode, response9.getHttpStatusCode()); AssertionUtils.multiAssertEquals(expectedHttpStatusText, response9.getHttpStatusText()); } if (!expectedResponsesJsonRpc.isEmpty()) { try { HttpResponseBean response = httpCallBeanBaseline.getResponseObjectsByEnum(com.betfair.testing.utils.cougar.enums.CougarMessageProtocolResponseTypeEnum.RESTJSONJSON); // Convert the returned json object to a map for comparison CougarHelpers cougarHelpers = new CougarHelpers(); Map<String, Object> map5 = cougarHelpers.convertBatchedResponseToMap(response); for (int i=0; i<expectedResponsesJsonRpc.size(); i++) { AssertionUtils.multiAssertEquals(expectedResponsesJsonRpc.get(i), map5.get("response"+(i+1))); } AssertionUtils.multiAssertEquals(expectedHttpStatusCode, map5.get("httpStatusCode")); AssertionUtils.multiAssertEquals(expectedHttpStatusText, map5.get("httpStatusText")); } catch (Exception e) { throw new RuntimeException(e); } } ensureHaveRequestLogEntries(); return this; } private void ensureHaveRequestLogEntries() { if (requestLogEntries == null) { try { RequestLogRequirement[] reqs = new RequestLogRequirement[numCalls]; for (int i=0; i<numCalls; i++) { reqs[i] = new RequestLogRequirement(version, operation); } requestLogEntries = CougarManager.getInstance().verifyRequestLogEntriesAfterDate(timestamp, reqs); } catch (Exception e) { throw new RuntimeException(e); } } } public LogTailer.LogLine[] getRequestLogEntries() { ensureHaveRequestLogEntries(); return requestLogEntries; } }