@Test(
      groups = {"wso2.am"},
      description = "API Life cycle test case")
  public void testDAOTestCase() throws Exception {
    String APIName = "DAOTestAPI";
    String APIContext = "DAOTestAPI";
    String tags = "youtube, video, media";
    String url = "http://gdata.youtube.com/feeds/api/standardfeeds";
    String description = "This is test API create by API manager integration test";

    String APIVersion = "1.0.0";
    String apiContextAddedValue = APIContext + "/" + APIVersion;

    APIRequest apiRequest = new APIRequest(APIName, APIContext, new URL(url));
    apiRequest.setTags(tags);
    apiRequest.setDescription(description);
    apiRequest.setVersion(APIVersion);
    apiRequest.setProvider(providerName);
    apiPublisher.addAPI(apiRequest);
    apiPublisher.deleteAPI(APIName, APIVersion, providerName);
    apiPublisher.addAPI(apiRequest);
    APIBean apiBean =
        APIMTestCaseUtils.getAPIBeanFromHttpResponse(apiPublisher.getAPI(APIName, providerName));
    APILifeCycleStateRequest updateRequest =
        new APILifeCycleStateRequest(APIName, providerName, APILifeCycleState.PUBLISHED);
    apiPublisher.changeAPILifeCycleStatus(updateRequest);
    // Test API properties
    assertEquals(apiBean.getId().getApiName(), APIName, "API Name mismatch");
    assertTrue(apiBean.getContext().contains(apiContextAddedValue), "API context mismatch");
    assertEquals(apiBean.getId().getVersion(), APIVersion, "API version mismatch");
    assertEquals(apiBean.getId().getProviderName(), providerName, "Provider Name mismatch");
    for (String tag : apiBean.getTags()) {
      assertTrue(tags.contains(tag), "API tag data mismatched");
    }
    assertEquals(apiBean.getDescription(), description, "API description mismatch");

    apiStore.addApplication("DAOTestAPI-Application", "Gold", "", "this-is-test");
    SubscriptionRequest subscriptionRequest =
        new SubscriptionRequest(
            APIName, storeContext.getContextTenant().getContextUser().getUserName());
    subscriptionRequest.setApplicationName("DAOTestAPI-Application");
    apiStore.subscribe(subscriptionRequest);

    APPKeyRequestGenerator generateAppKeyRequest =
        new APPKeyRequestGenerator("DAOTestAPI-Application");
    String responseString = apiStore.generateApplicationKey(generateAppKeyRequest).getData();
    JSONObject response = new JSONObject(responseString);
    String accessToken =
        response.getJSONObject("data").getJSONObject("key").get("accessToken").toString();
    Map<String, String> requestHeaders = new HashMap<String, String>();
    requestHeaders.put("Authorization", "Bearer " + accessToken);
    Thread.sleep(2000);
  }
  @BeforeClass(alwaysRun = true)
  public void setEnvironment() throws Exception {
    super.init(userMode);
    apiPublisher = new APIPublisherRestClient(getPublisherURLHttp());
    apiStore = new APIStoreRestClient(getStoreURLHttp());
    providerName = user.getUserName();

    apiPublisher.login(user.getUserName(), user.getPassword());

    apiStore.login(user.getUserName(), user.getPassword());
  }
  @BeforeClass(alwaysRun = true)
  public void initialize()
      throws APIManagerIntegrationTestException, XPathExpressionException, RemoteException,
          ResourceAdminServiceExceptionException, MalformedURLException {
    super.init();
    apiEndPointUrl = getGatewayURLHttp() + API_END_POINT_POSTFIX_URL;
    providerName = user.getUserName();
    apiCreationRequestBean =
        new APICreationRequestBean(
            API_NAME, API_CONTEXT, API_VERSION_1_0_0, providerName, new URL(apiEndPointUrl));
    apiCreationRequestBean.setTags(API_TAGS);
    apiCreationRequestBean.setDescription(API_DESCRIPTION);
    String publisherURLHttp = getPublisherURLHttp();
    String storeURLHttp = getStoreURLHttp();
    apiPublisherClientUser1 = new APIPublisherRestClient(publisherURLHttp);
    APIStoreRestClient apiStoreClientUser1 = new APIStoreRestClient(storeURLHttp);

    // Login to API Publisher with  admin
    apiPublisherClientUser1.login(user.getUserName(), user.getPassword());

    // Login to API Store with  admin
    apiStoreClientUser1.login(user.getUserName(), user.getPassword());

    apiIdentifier = new APIIdentifier(providerName, API_NAME, API_VERSION_1_0_0);
    String artifactsLocation =
        TestConfigurationProvider.getResourceLocation()
            + File.separator
            + "artifacts"
            + File.separator
            + "AM"
            + File.separator
            + "lifecycletest"
            + File.separator
            + "tiers.xml";
    resourceAdminServiceClient =
        new ResourceAdminServiceClient(
            publisherContext.getContextUrls().getBackEndUrl(), createSession(publisherContext));
    originalTiersXML = resourceAdminServiceClient.getTextContent(TIER_XML_REG_CONFIG_LOCATION);
    newTiersXML = readFile(artifactsLocation);
  }
 @BeforeClass(alwaysRun = true)
 public void initialize()
     throws APIManagerIntegrationTestException, XPathExpressionException, MalformedURLException {
   super.init();
   api1EndPointUrl = getGatewayURLHttp() + API_END_POINT_POSTFIX_URL;
   providerName = user.getUserName();
   apiCreationRequestBean =
       new APICreationRequestBean(
           API_NAME, API_CONTEXT, API_VERSION_1_0_0, providerName, new URL(api1EndPointUrl));
   apiCreationRequestBean.setTags(API_TAGS);
   apiCreationRequestBean.setDescription(API_DESCRIPTION);
   String publisherURLHttp = getPublisherURLHttp();
   String storeURLHttp = getStoreURLHttp();
   apiPublisherClientUser1 = new APIPublisherRestClient(publisherURLHttp);
   apiStoreClientUser1 = new APIStoreRestClient(storeURLHttp);
   // Login to API Publisher with  admin
   apiPublisherClientUser1.login(user.getUserName(), user.getPassword());
   // Login to API Store with  admin
   apiStoreClientUser1.login(user.getUserName(), user.getPassword());
   apiIdentifier = new APIIdentifier(providerName, API_NAME, API_VERSION_1_0_0);
   apiStoreClientUser1.addApplication(APPLICATION_NAME, TIER_UNLIMITED, "", "");
 }
  @BeforeClass(alwaysRun = true)
  public void initialize()
      throws APIManagerIntegrationTestException, XPathExpressionException, RemoteException {
    super.init();
    apiEndPointUrl = getGatewayURLHttp() + API_END_POINT_POSTFIX_URL;
    providerName = user.getUserName();
    String publisherURLHttp = getPublisherURLHttp();
    String storeURLHttp = getStoreURLHttp();
    apiPublisherClientUser1 = new APIPublisherRestClient(publisherURLHttp);
    apiStoreClientUser1 = new APIStoreRestClient(storeURLHttp);

    // Login to API Publisher with  admin
    apiPublisherClientUser1.login(user.getUserName(), user.getPassword());

    // Login to API Store with  admin
    apiStoreClientUser1.login(user.getUserName(), user.getPassword());
    requestHeadersGet = new HashMap<String, String>();
    requestHeadersGet.put("accept", "text/plain");
    requestHeadersGet.put("Content-Type", "text/plain");
    apiIdentifier = new APIIdentifier(providerName, API_NAME, API_VERSION_1_0_0);
    // Create application
    apiStoreClientUser1.addApplication(
        APPLICATION_NAME, APIMIntegrationConstants.APPLICATION_TIER.UNLIMITED, "", "");
  }
  @BeforeClass(alwaysRun = true)
  public void setEnvironment() throws Exception {
    super.init();
    String publisherURLHttp = publisherUrls.getWebAppURLHttp();
    String storeURLHttp = storeUrls.getWebAppURLHttp();

    apiStore = new APIStoreRestClient(storeURLHttp);
    apiPublisher = new APIPublisherRestClient(publisherURLHttp);

    apiPublisher.login(
        publisherContext.getContextTenant().getContextUser().getUserName(),
        publisherContext.getContextTenant().getContextUser().getPassword());
    apiStore.login(
        storeContext.getContextTenant().getContextUser().getUserName(),
        storeContext.getContextTenant().getContextUser().getPassword());
  }
  @Test(description = "List all Subscriptions By by calling the getAllSubscriptionsOfApplication")
  public void testGetAllSubscriptionsOfApplication() throws Exception {
    String subscriptionData = apiStore.getAllSubscriptionsOfApplication().getData();
    JSONObject jsonSubscription = new JSONObject(subscriptionData);

    int returnedSubscriptions = 0;
    if (jsonSubscription.getString("error").equals("false")) {
      JSONObject jsonSubscriptionsObject = jsonSubscription.getJSONObject("subscriptions");
      JSONArray jsonApplicationsArray = jsonSubscriptionsObject.getJSONArray("applications");

      // Remove API Subscriptions
      for (int i = 0; i < jsonApplicationsArray.length(); i++) {
        JSONObject appObject = jsonApplicationsArray.getJSONObject(i);
        String applicationName = appObject.getString("name");
        if ("DefaultApplication".equals(applicationName)) {
          // This is the default application. We have not added any subscriptions for this. Hence
          // skipping
          // this one
          continue;
        }
        JSONArray subscribedAPIJSONArray = appObject.getJSONArray("subscriptions");
        int length = subscribedAPIJSONArray.length();
        if (i == 0) {
          // We are checking the first application as the method should return that.
          // check whether the subscriptions are empty.
          assertEquals(1, length, "No subscriptions found for application : " + applicationName);
        } else {
          // If there are subscriptions for other applications returned, that is wrong
          assertEquals(0, length, "Subscriptions found for application : " + applicationName);
        }

        if (length > 0) {
          returnedSubscriptions++;
        }
        // We do not check whether the subscriptions are correct or not since that is covered from
        // the other
        // test cases. What we are interested is that, the testGetAllSubscriptionsOfApplication() is
        // returning
        // subscription details for first application. If they are found, then our test case is
        // successful.
      }
      assertEquals(
          1, returnedSubscriptions, "More than the number of expected subscriptions were returned");
    } else {
      throw new Exception("Unable to get the list of subscriptions.");
    }
  }
  @Test(
      description =
          "List all Subscriptions By by calling the getAllSubscriptionsOfApplication with application name")
  public void testGetAllSubscriptionsOfApplicationWithSelectedApp() throws Exception {
    String selectedApplication = applicationNamePrefix + 1;
    String subscriptionData =
        apiStore.getAllSubscriptionsOfApplication(selectedApplication).getData();
    JSONObject jsonSubscription = new JSONObject(subscriptionData);

    if (jsonSubscription.getString("error").equals("false")) {
      JSONObject jsonSubscriptionsObject = jsonSubscription.getJSONObject("subscriptions");
      JSONArray jsonApplicationsArray = jsonSubscriptionsObject.getJSONArray("applications");

      // Remove API Subscriptions
      for (int i = 0; i < jsonApplicationsArray.length(); i++) {
        JSONObject appObject = jsonApplicationsArray.getJSONObject(i);
        String applicationName = appObject.getString("name");

        JSONArray subscribedAPIJSONArray = appObject.getJSONArray("subscriptions");
        int length = subscribedAPIJSONArray.length();
        if ("DefaultApplication".equals(applicationName)) {
          // This is the default application. We have not added any subscriptions for this. Hence
          // should be 0
          assertEquals(
              0, length, "subscriptions found for the default application : " + applicationName);
        } else if (selectedApplication.equals(applicationName)) {
          // check whether the subscriptions are empty.
          assertEquals(
              1,
              length,
              "No subscriptions found for the selected application : " + applicationName);
        } else {
          // check whether the subscriptions are empty.
          assertEquals(
              0, length, "subscriptions found for invalid application : " + applicationName);
        }
        // We do not check whether the subscriptions are correct or not since that is covered from
        // the other
        // test cases. What we are interested is that, the
        // testGetAllSubscriptionsOfApplication(selectedApplication) is returning subscription
        // details for given application. If they are found, then our test case is successful.
      }
    } else {
      throw new Exception("Unable to get the list of subscriptions.");
    }
  }
 @BeforeClass(alwaysRun = true)
 public void initialize() throws APIManagerIntegrationTestException, XPathExpressionException {
   super.init();
   apiEndPointUrl = gatewayUrls.getWebAppURLHttp() + API_END_POINT_POSTFIX_URL;
   providerName = publisherContext.getContextTenant().getContextUser().getUserName();
   String publisherURLHttp = publisherUrls.getWebAppURLHttp();
   String storeURLHttp = storeUrls.getWebAppURLHttp();
   apiPublisherClientUser1 = new APIPublisherRestClient(publisherURLHttp);
   apiStoreClientUser1 = new APIStoreRestClient(storeURLHttp);
   // Login to API Publisher with  admin
   apiPublisherClientUser1.login(
       publisherContext.getContextTenant().getContextUser().getUserName(),
       publisherContext.getContextTenant().getContextUser().getPassword());
   // Login to API Store with  admin
   apiStoreClientUser1.login(
       storeContext.getContextTenant().getContextUser().getUserName(),
       storeContext.getContextTenant().getContextUser().getPassword());
   apiIdentifier = new APIIdentifier(providerName, API_NAME, API_VERSION_1_0_0);
 }
  @Test(
      groups = {"wso2.am"},
      description = "Pizzashack Test")
  public void testPizzashackApiSample() throws Exception {

    List<APIResourceBean> resourceBeanList = new ArrayList<APIResourceBean>();

    APICreationRequestBean apiCreationRequestBean =
        new APICreationRequestBean(
            "PizzaAPI",
            "pizzashack",
            "1.0.0",
            "admin",
            new URL("http://localhost:9766/pizzashack-api-1.0.0/api/"));

    apiCreationRequestBean.setThumbUrl("/home/bhagya/WS/Pizza_Shack_Logo.jpeg");
    apiCreationRequestBean.setDescription(
        "Pizza API:Allows to manage pizza orders (create, update, retrieve orders)");
    apiCreationRequestBean.setTags("pizza, order, pizza-menu");
    apiCreationRequestBean.setResourceCount("4");

    resourceBeanList.add(
        new APIResourceBean("GET", "Application & Application User", "Unlimited", "/menu"));
    resourceBeanList.add(
        new APIResourceBean("POST", "Application & Application User", "Unlimited", "/order"));
    resourceBeanList.add(
        new APIResourceBean(
            "GET", "Application & Application User", "Unlimited", "/order/{orderid}"));
    resourceBeanList.add(
        new APIResourceBean("GET", "Application & Application User", "Unlimited", "/delivery"));
    apiCreationRequestBean.setResourceBeanList(resourceBeanList);

    apiCreationRequestBean.setTier("Unlimited");
    apiCreationRequestBean.setTiersCollection("Unlimited");

    apiPublisher.addAPI(apiCreationRequestBean);
    APILifeCycleStateRequest updateRequest =
        new APILifeCycleStateRequest(
            "PizzaAPI",
            publisherContext.getContextTenant().getContextUser().getUserName(),
            APILifeCycleState.PUBLISHED);
    apiPublisher.changeAPILifeCycleStatus(updateRequest);
    apiStore.addApplication("PizzaShack", "Unlimited", "", "");
    SubscriptionRequest subscriptionRequest =
        new SubscriptionRequest(
            "PizzaAPI", storeContext.getContextTenant().getContextUser().getUserName());
    subscriptionRequest.setApplicationName("PizzaShack");
    apiStore.subscribe(subscriptionRequest);

    APPKeyRequestGenerator generateAppKeyRequest = new APPKeyRequestGenerator("PizzaShack");
    String responseString = apiStore.generateApplicationKey(generateAppKeyRequest).getData();
    JSONObject response = new JSONObject(responseString);
    String accessToken =
        response.getJSONObject("data").getJSONObject("key").get("accessToken").toString();
    Map<String, String> requestHeaders = new HashMap<String, String>();
    requestHeaders.put("Authorization", "Bearer " + accessToken);

    Thread.sleep(2000);

    HttpResponse pizzaShackResponse =
        HttpRequestUtil.doGet(
            gatewayUrlsMgt.getWebAppURLNhttp() + "pizzashack/1.0.0/menu", requestHeaders);
    assertEquals(
        pizzaShackResponse.getResponseCode(),
        Response.Status.OK.getStatusCode(),
        "Response code mismatched when api invocation");
    System.out.println("My Response Code is " + pizzaShackResponse.getResponseCode());

    assertTrue(
        pizzaShackResponse.getData().contains("BBQ Chicken Bacon"),
        "Response data mismatched when api invocation");
    assertTrue(
        pizzaShackResponse.getData().contains("Grilled white chicken"),
        "Response data mismatched when api invocation");
    assertTrue(
        pizzaShackResponse.getData().contains("Chicken Parmesan"),
        "Response data mismatched when api invocation");
    assertTrue(
        pizzaShackResponse.getData().contains("Tuscan Six Cheese"),
        "Response data mismatched when api invocation");
    assertTrue(
        pizzaShackResponse.getData().contains("Asiago and Fontina"),
        "Response data mismatched when api invocation");
  }
  @BeforeClass(alwaysRun = true)
  public void setEnvironment() throws Exception {
    super.init(userMode);
    // Load the back-end dummy API
    if (TestUserMode.SUPER_TENANT_ADMIN == userMode) {
      String gatewaySessionCookie = createSession(gatewayContextMgt);
      loadSynapseConfigurationFromClasspath(
          "artifacts"
              + File.separator
              + "AM"
              + File.separator
              + "synapseconfigs"
              + File.separator
              + "rest"
              + File.separator
              + "dummy_api.xml",
          gatewayContextMgt,
          gatewaySessionCookie);
    }
    publisherURLHttp = getPublisherURLHttp();
    apiPublisher = new APIPublisherRestClient(publisherURLHttp);
    apiPublisher.login(user.getUserName(), user.getPassword());

    String providerName = user.getUserName();
    URL endpointUrl = new URL(getSuperTenantAPIInvocationURLHttp("response", "1.0.0"));
    ArrayList<APIResourceBean> resourceBeanList = new ArrayList<APIResourceBean>();
    resourceBeanList.add(
        new APIResourceBean(
            APIMIntegrationConstants.HTTP_VERB_GET,
            APIMIntegrationConstants.RESOURCE_AUTH_TYPE_APPLICATION_AND_APPLICATION_USER,
            APIMIntegrationConstants.RESOURCE_TIER.UNLIMITED,
            "/*"));
    apiCreationRequestBean =
        new APICreationRequestBean(
            API_NAME, API_CONTEXT, API_VERSION, providerName, endpointUrl, resourceBeanList);
    apiCreationRequestBean.setTags(TAGS);
    apiCreationRequestBean.setDescription(DESCRIPTION);
    String publisherURLHttp = getPublisherURLHttp();
    String storeURLHttp = getStoreURLHttp();
    apiPublisherClientUser1 = new APIPublisherRestClient(publisherURLHttp);
    apiStoreClientUser1 = new APIStoreRestClient(storeURLHttp);
    // Login to API Publisher with admin
    apiPublisherClientUser1.login(user.getUserName(), user.getPassword());
    // Login to API Store with  admin
    apiStoreClientUser1.login(user.getUserName(), user.getPassword());
    apiIdentifier = new APIIdentifier(providerName, API_NAME, API_VERSION);
    apiIdentifier.setTier(APIMIntegrationConstants.API_TIER.GOLD);
    // Create application
    apiStoreClientUser1.addApplication(
        APPLICATION_NAME, APIMIntegrationConstants.APPLICATION_TIER.LARGE, "", "");
    accessToken = generateApplicationKeys(apiStoreClientUser1, APPLICATION_NAME).getAccessToken();

    createPublishAndSubscribeToAPI(
        apiIdentifier,
        apiCreationRequestBean,
        apiPublisherClientUser1,
        apiStoreClientUser1,
        APPLICATION_NAME);
    waitForAPIDeploymentSync(
        user.getUserName(), API_NAME, API_VERSION, APIMIntegrationConstants.IS_API_EXISTS);
  }
 @AfterClass(alwaysRun = true)
 public void cleanUpArtifacts()
     throws APIManagerIntegrationTestException, XPathExpressionException {
   apiStoreClientUser1.removeApplication(APPLICATION_NAME);
   deleteAPI(apiIdentifier, apiPublisherClientUser1);
 }
 @Test(
     groups = {"wso2.am"},
     description = "test  invocation of  api under tier Silver.",
     dependsOnMethods = "testEditAPITierToSilver")
 public void testInvokingWithSilverTier()
     throws APIManagerIntegrationTestException, InterruptedException, IOException {
   applicationNameSilver = APPLICATION_NAME + TIER_SILVER;
   // create new application
   apiStoreClientUser1.addApplication(applicationNameSilver, TIER_GOLD, "", "");
   apiIdentifier.setTier(TIER_SILVER);
   // Do a API Silver subscription.
   subscribeToAPI(apiIdentifier, applicationNameSilver, apiStoreClientUser1);
   // get access token
   String accessToken =
       generateApplicationKeys(apiStoreClientUser1, applicationNameSilver).getAccessToken();
   // Create requestHeaders
   Map<String, String> requestHeadersSilverTier = new HashMap<String, String>();
   requestHeadersSilverTier.put("accept", "text/xml");
   requestHeadersSilverTier.put("Authorization", "Bearer " + accessToken);
   // millisecond to expire the throttling block
   Thread.sleep(THROTTLING_UNIT_TIME + THROTTLING_ADDITIONAL_WAIT_TIME);
   long startTime = System.currentTimeMillis();
   long currentTime;
   for (int invocationCount = 1;
       invocationCount <= SILVER_INVOCATION_LIMIT_PER_MIN;
       invocationCount++) {
     currentTime = System.currentTimeMillis();
     // Invoke  API
     HttpResponse invokeResponse =
         HttpRequestUtil.doGet(
             gatewayWebAppUrl + API_CONTEXT + "/" + API_VERSION_1_0_0 + API_END_POINT_METHOD,
             requestHeadersSilverTier);
     assertEquals(
         invokeResponse.getResponseCode(),
         HTTP_RESPONSE_CODE_OK,
         "Response code mismatched. "
             + "Invocation attempt:"
             + invocationCount
             + " failed  during :"
             + (currentTime - startTime)
             + " milliseconds under Silver API level tier");
     assertTrue(
         invokeResponse.getData().contains(API_RESPONSE_DATA),
         "Response data mismatched."
             + " Invocation attempt:"
             + invocationCount
             + " failed  during :"
             + (currentTime - startTime)
             + " milliseconds under Silver API level tier");
   }
   currentTime = System.currentTimeMillis();
   HttpResponse invokeResponse =
       HttpRequestUtil.doGet(
           gatewayWebAppUrl + API_CONTEXT + "/" + API_VERSION_1_0_0 + API_END_POINT_METHOD,
           requestHeadersSilverTier);
   assertEquals(
       invokeResponse.getResponseCode(),
       HTTP_RESPONSE_CODE_SERVICE_UNAVAILABLE,
       "Response code mismatched. Invocation attempt:"
           + (SILVER_INVOCATION_LIMIT_PER_MIN + 1)
           + " passed  during :"
           + (currentTime - startTime)
           + " milliseconds under Silver API level tier");
   assertTrue(
       invokeResponse.getData().contains(MESSAGE_THROTTLED_OUT),
       "Response data mismatched. Invocation attempt:"
           + (SILVER_INVOCATION_LIMIT_PER_MIN + 1)
           + " passed  during :"
           + (currentTime - startTime)
           + " milliseconds under Silver API level tier");
 }
 @AfterClass(alwaysRun = true)
 public void destroy() throws Exception {
   apiStore.removeApplication("DAOTestAPI-Application");
 }
 @AfterClass(alwaysRun = true)
 public void cleanUpArtifacts() throws APIManagerIntegrationTestException {
   apiStoreClientUser1.removeApplication(applicationNameGold);
   apiStoreClientUser1.removeApplication(applicationNameSilver);
   deleteAPI(apiIdentifier, apiPublisherClientUser1);
 }
  @Test(
      groups = {"wso2.am"},
      description = "test  invocation of  api under tier Gold.")
  public void testInvokingWithGoldTier() throws APIManagerIntegrationTestException, IOException {

    applicationNameGold = APPLICATION_NAME + TIER_GOLD;
    apiStoreClientUser1.addApplication(applicationNameGold, TIER_GOLD, "", "");
    apiCreationRequestBean =
        new APICreationRequestBean(
            API_NAME, API_CONTEXT, API_VERSION_1_0_0, providerName, new URL(apiEndPointUrl));
    apiCreationRequestBean.setTags(API_TAGS);
    apiCreationRequestBean.setDescription(API_DESCRIPTION);
    apiCreationRequestBean.setTier(TIER_GOLD);
    createPublishAndSubscribeToAPI(
        apiIdentifier,
        apiCreationRequestBean,
        apiPublisherClientUser1,
        apiStoreClientUser1,
        applicationNameGold);

    // get access token
    String accessToken =
        generateApplicationKeys(apiStoreClientUser1, applicationNameGold).getAccessToken();

    // Create requestHeaders
    requestHeadersGoldTier = new HashMap<String, String>();
    requestHeadersGoldTier.put("Authorization", "Bearer " + accessToken);
    requestHeadersGoldTier.put("accept", "text/xml");
    long startTime = System.currentTimeMillis();
    long currentTime;
    for (int invocationCount = 1;
        invocationCount <= GOLD_INVOCATION_LIMIT_PER_MIN;
        invocationCount++) {
      currentTime = System.currentTimeMillis();
      // Invoke  API
      HttpResponse invokeResponse =
          HttpRequestUtil.doGet(
              gatewayWebAppUrl + API_CONTEXT + "/" + API_VERSION_1_0_0 + API_END_POINT_METHOD,
              requestHeadersGoldTier);
      assertEquals(
          invokeResponse.getResponseCode(),
          HTTP_RESPONSE_CODE_OK,
          "Response code mismatched. Invocation attempt:"
              + invocationCount
              + " failed  during :"
              + (currentTime - startTime)
              + " milliseconds under Gold API level tier");
      assertTrue(
          invokeResponse.getData().contains(API_RESPONSE_DATA),
          "Response data mismatched. Invocation attempt:"
              + invocationCount
              + " failed  during :"
              + (currentTime - startTime)
              + " milliseconds under Gold API level tier");
    }
    currentTime = System.currentTimeMillis();
    HttpResponse invokeResponse =
        HttpRequestUtil.doGet(
            gatewayWebAppUrl + API_CONTEXT + "/" + API_VERSION_1_0_0 + API_END_POINT_METHOD,
            requestHeadersGoldTier);
    assertEquals(
        invokeResponse.getResponseCode(),
        HTTP_RESPONSE_CODE_SERVICE_UNAVAILABLE,
        "Response code mismatched. Invocation attempt:"
            + (GOLD_INVOCATION_LIMIT_PER_MIN + 1)
            + " passed  during :"
            + (currentTime - startTime)
            + " milliseconds under Gold API level tier");
    assertTrue(
        invokeResponse.getData().contains(MESSAGE_THROTTLED_OUT),
        "Response data mismatched. Invocation attempt:"
            + (GOLD_INVOCATION_LIMIT_PER_MIN + 1)
            + " passed  during :"
            + (currentTime - startTime)
            + " milliseconds under Gold API level tier");
  }
 @AfterClass(alwaysRun = true)
 public void destroy() throws Exception {
   apiStore.removeApplication("PizzaShack");
 }
  @BeforeClass(alwaysRun = true)
  public void setEnvironment() throws Exception {

    super.init(userMode);
    String publisherURLHttp = publisherUrls.getWebAppURLHttp();
    String storeURLHttp = storeUrls.getWebAppURLHttp();

    apiStore = new APIStoreRestClient(storeURLHttp);
    APIPublisherRestClient apiPublisher = new APIPublisherRestClient(publisherURLHttp);

    String APIName = "APIGetAllSubscriptionsTestAPI";
    String APIContext = "getAllSubscriptionsTestAPI";
    String tags = "youtube, video, media";
    String url = "http://gdata.youtube.com/feeds/api/standardfeeds";
    String description = "This is test API create by API manager integration test";
    String providerName = "admin";
    String APIVersion = "1.0.0";

    apiPublisher.login(
        publisherContext.getContextTenant().getContextUser().getUserName(),
        publisherContext.getContextTenant().getContextUser().getPassword());
    APIRequest apiRequest = new APIRequest(APIName, APIContext, new URL(url));
    apiRequest.setTags(tags);
    apiRequest.setDescription(description);
    apiRequest.setVersion(APIVersion);
    apiRequest.setVisibility("restricted");
    apiRequest.setRoles("admin");

    apiRequest.setTiersCollection(SILVER);
    apiRequest.setTier(SILVER);

    apiPublisher.addAPI(apiRequest);
    APILifeCycleStateRequest updateRequest =
        new APILifeCycleStateRequest(APIName, providerName, APILifeCycleState.PUBLISHED);
    apiPublisher.changeAPILifeCycleStatus(updateRequest);

    apiStore.login(
        storeContext.getContextTenant().getContextUser().getUserName(),
        storeContext.getContextTenant().getContextUser().getPassword());

    for (int i = 0; i < numberOfApplications; i++) {
      String applicationName = applicationNamePrefix + i;
      apiStore.addApplication(
          applicationName,
          APIMIntegrationConstants.APPLICATION_TIER.DEFAULT_APP_POLICY_FIFTY_REQ_PER_MIN,
          "",
          "this-is-test");

      SubscriptionRequest subscriptionRequest =
          new SubscriptionRequest(
              APIName, storeContext.getContextTenant().getContextUser().getUserName());
      subscriptionRequest.setApplicationName(applicationName);
      subscriptionRequest.setTier(SILVER);
      apiStore.subscribe(subscriptionRequest);

      APPKeyRequestGenerator generateAppKeyRequest = new APPKeyRequestGenerator(applicationName);
      String responseString = apiStore.generateApplicationKey(generateAppKeyRequest).getData();

      JSONObject response = new JSONObject(responseString);
      String error = response.getString("error");
      if ("true".equals(error)) {
        throw new Exception("Unable to generate the tokens. Hence unable to execute the test case");
      }
    }
    Thread.sleep(60000);
  }
  @Test(groups = "wso2.am", description = "Check functionality of the default version API")
  public void testDefaultVersionAPI() throws Exception {

    // Login to the API Publisher
    apiPublisher.login(user.getUserName(), user.getPassword());

    String apiName = "DefaultVersionAPI";
    String apiVersion = "1.0.0";
    String apiContext = "defaultversion";
    String endpointUrl = getGatewayURLNhttp() + "response";

    // Create the api creation request object
    APIRequest apiRequest = new APIRequest(apiName, apiContext, new URL(endpointUrl));
    apiRequest.setDefault_version("default_version");
    apiRequest.setDefault_version_checked("default_version");
    apiRequest.setVersion(apiVersion);
    apiRequest.setTiersCollection("Unlimited");
    apiRequest.setTier("Unlimited");
    apiRequest.setProvider(provider);

    // Add the API using the API publisher.
    HttpResponse response = apiPublisher.addAPI(apiRequest);

    APILifeCycleStateRequest updateRequest =
        new APILifeCycleStateRequest(apiName, user.getUserName(), APILifeCycleState.PUBLISHED);
    // Publish the API
    response = apiPublisher.changeAPILifeCycleStatus(updateRequest);

    // Login to the API Store
    apiStore.login(user.getUserName(), user.getPassword());

    // Add an Application in the Store.
    response = apiStore.addApplication("DefaultVersionAPP", "Unlimited", "", "");
    verifyResponse(response);

    // Subscribe the API to the DefaultApplication
    SubscriptionRequest subscriptionRequest =
        new SubscriptionRequest(apiName, apiVersion, provider, "DefaultVersionAPP", "Unlimited");
    response = apiStore.subscribe(subscriptionRequest);

    // Generate production token and invoke with that
    APPKeyRequestGenerator generateAppKeyRequest = new APPKeyRequestGenerator("DefaultVersionAPP");
    String responseString = apiStore.generateApplicationKey(generateAppKeyRequest).getData();
    JSONObject jsonResponse = new JSONObject(responseString);

    // Get the accessToken which was generated.
    String accessToken =
        jsonResponse.getJSONObject("data").getJSONObject("key").getString("accessToken");

    String apiInvocationUrl = getAPIInvocationURLHttp(apiContext);

    // Going to access the API without the version in the request url.
    HttpResponse directResponse = HttpRequestUtil.doGet(endpointUrl, new HashMap<String, String>());

    Map<String, String> headers = new HashMap<String, String>();
    headers.put("Authorization", "Bearer " + accessToken);
    // Invoke the API
    HttpResponse httpResponse = HttpRequestUtil.doGet(apiInvocationUrl, headers);

    // Check if accessing the back-end directly and accessing it via the API yield the same
    // responses.
    assertEquals(
        httpResponse.getData(),
        directResponse.getData(),
        "Default version API test failed while " + "invoking the API.");
  }