/* * Copyright 2011-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * 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://aws.amazon.com/apache2.0 * * This file 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.amazonaws.smoketest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.List; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Map; import com.amazonaws.AmazonServiceException; import com.amazonaws.AmazonWebServiceClient; import com.amazonaws.regions.RegionUtils; import com.amazonaws.util.Classes; import com.google.inject.Inject; import cucumber.api.java.en.And; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.runtime.java.guice.ScenarioScoped; /** * Step definitions that perform actions for every matcher that is agreed. */ @ScenarioScoped public class AWSCucumberStepdefs { private AmazonWebServiceClient client; private String packageName; private Object result; private AmazonServiceException exception; @Inject public AWSCucumberStepdefs(AmazonWebServiceClient client) { this.client = client; this.client.setRegion(RegionUtils.getRegion("us-east-1")); Class<?> httpClientClass = Classes.childClassOf(AmazonWebServiceClient.class, this.client); this.packageName = httpClientClass.getPackage().getName(); } @When("^I call the \"(.*?)\" API$") public void when_I_call_the_API(String operation) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { call(operation, null); } @When("^I call the \"(.*?)\" API with:$") public void when_I_call_the_API(String operation, Map<String, String> args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { call(operation, args); } @When("^I attempt to call the \"(.+?)\" API with:$") public void when_I_attempt_to_call_API(String operation, Map<String, String> args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { attemptCall(operation, args); } @Then("^the response should contain a \"([^\"]*)\"$") public void the_response_should_contain_a(String memberName) throws Throwable { String[] path = memberName.split("[.]"); Object member = ReflectionUtils.getByPath(result, Arrays.asList(path)); assertNotNull(member); } @Then("^the value at \"(.*?)\" should be a list") public void then_the_value_at_should_be_a_list(String memberName) { String[] path = memberName.split("[.]"); Object member = ReflectionUtils.getByPath(result, Arrays.asList(path)); assertTrue(member instanceof java.util.List); } @Then("^the value at \"(.*?)\" should be a map") public void then_the_value_at_should_be_a_map(String memberName) { String[] path = memberName.split("[.]"); Object member = ReflectionUtils.getByPath(result, Arrays.asList(path)); assertTrue(member instanceof java.util.Map); } @Then("^I expect the response error code to be \"(.+?)\"$") public void then_I_expect_response_error_code(String expected) { assertNotNull(exception); assertTrue(exception instanceof AmazonServiceException); String actual = exception.getErrorCode(); assertEquals("Error code doesn't match. Expected : " + expected + ". Actual :" + actual, expected, actual); } @And("^I expect the response error message to include:$") public void and_I_expect_the_response_error_message_include(String expected) { assertNotNull(exception); assertTrue(exception instanceof AmazonServiceException); String actual = exception.getErrorMessage().toLowerCase(); assertTrue("Error message doesn't match. Expected : " + expected + ". Actual :" + actual, actual.contains(expected.toLowerCase())); } private void attemptCall(String operation, Map<String, String> args) throws IllegalAccessException, IllegalArgumentException { try { call(operation, args); } catch (InvocationTargetException ite) { exception = (AmazonServiceException) ite.getCause(); } } private void call(String operation, Map<String, String> args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { final String requestClassName = packageName + ".model." + operation + "Request"; final String operationMethodName = operation.substring(0, 1).toLowerCase() + operation.substring(1); Class<Object> requestClass = ReflectionUtils.loadClass(this.getClass(), requestClassName); Object requestObject = ReflectionUtils.newInstance(requestClass); if (args != null && !args.isEmpty()) { for (Map.Entry<String, String> entry : args.entrySet()) { String key = entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); Object value = convertTo( ReflectionUtils.getParameterTypes(requestObject, Arrays.asList(key)), entry.getValue()); ReflectionUtils.setByPath(requestObject, value, Arrays.asList(key)); } } Method method = ReflectionUtils.findMethod(client, operationMethodName, requestClass); result = method.invoke(client, requestObject); } private Object convertTo(Class<?> type, String value) { if (type.equals(Integer.class)) return Integer.valueOf(value); else if (type.equals(Boolean.class)) return Boolean.valueOf(value); else if(type.equals(List.class)) { return Arrays.asList(value); } return value; } static class ServiceConfig { private String serviceInterfaceName; private String sourcePackageName; public void setServiceInterfaceName(String serviceInterfaceName) { this.serviceInterfaceName = serviceInterfaceName; } public String getServiceInterfaceName() { return this.serviceInterfaceName; } public void setSourcePackageName(String sourcePackageName) { this.sourcePackageName = sourcePackageName; } public String getSourcePackageName() { return this.sourcePackageName; } } }