// Copyright 2010 Google Inc. 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://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.google.api.adwords.lib;
import com.google.api.adwords.lib.utils.DataUtils;
import com.google.api.adwords.v13.AccountInterface;
import com.google.api.adwords.v200909.cm.AdGroup;
import com.google.api.adwords.v200909.cm.AdGroupAd;
import com.google.api.adwords.v200909.cm.AdGroupAdOperation;
import com.google.api.adwords.v200909.cm.AdGroupAdServiceInterface;
import com.google.api.adwords.v200909.cm.AdGroupCriterionOperation;
import com.google.api.adwords.v200909.cm.AdGroupCriterionServiceInterface;
import com.google.api.adwords.v200909.cm.AdGroupOperation;
import com.google.api.adwords.v200909.cm.AdGroupPage;
import com.google.api.adwords.v200909.cm.AdGroupReturnValue;
import com.google.api.adwords.v200909.cm.AdGroupSelector;
import com.google.api.adwords.v200909.cm.AdGroupServiceInterface;
import com.google.api.adwords.v200909.cm.ApiException;
import com.google.api.adwords.v200909.cm.Bid;
import com.google.api.adwords.v200909.cm.BiddableAdGroupCriterion;
import com.google.api.adwords.v200909.cm.Budget;
import com.google.api.adwords.v200909.cm.BudgetBudgetDeliveryMethod;
import com.google.api.adwords.v200909.cm.BudgetBudgetPeriod;
import com.google.api.adwords.v200909.cm.Campaign;
import com.google.api.adwords.v200909.cm.CampaignCriterionOperation;
import com.google.api.adwords.v200909.cm.CampaignCriterionServiceInterface;
import com.google.api.adwords.v200909.cm.CampaignOperation;
import com.google.api.adwords.v200909.cm.CampaignReturnValue;
import com.google.api.adwords.v200909.cm.CampaignSelector;
import com.google.api.adwords.v200909.cm.CampaignServiceInterface;
import com.google.api.adwords.v200909.cm.CampaignStatus;
import com.google.api.adwords.v200909.cm.CampaignTargetOperation;
import com.google.api.adwords.v200909.cm.CampaignTargetServiceInterface;
import com.google.api.adwords.v200909.cm.Image;
import com.google.api.adwords.v200909.cm.ImageAd;
import com.google.api.adwords.v200909.cm.Keyword;
import com.google.api.adwords.v200909.cm.KeywordMatchType;
import com.google.api.adwords.v200909.cm.ManualCPC;
import com.google.api.adwords.v200909.cm.ManualCPCAdGroupBids;
import com.google.api.adwords.v200909.cm.Money;
import com.google.api.adwords.v200909.cm.NegativeCampaignCriterion;
import com.google.api.adwords.v200909.cm.NetworkCoverageType;
import com.google.api.adwords.v200909.cm.NetworkTarget;
import com.google.api.adwords.v200909.cm.NetworkTargetList;
import com.google.api.adwords.v200909.cm.Operator;
import com.google.api.adwords.v200909.cm.Placement;
import com.google.api.adwords.v200909.cm.TextAd;
import junit.framework.TestCase;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Random;
import javax.xml.rpc.ServiceException;
/**
* Smoke tests the v200909 version of AdWords API. The credentials are taken
* from "test_data/test.properties".
*
* @author api.arogal@gmail.com (Adam Rogal)
*/
public class AdWordsV200909SmokeTest extends TestCase {
private AdWordsUser testUser;
private AdGroupAdServiceInterface adGroupAdService;
private AdGroupCriterionServiceInterface adGrouCriterionService;
private AdGroupServiceInterface adGroupService;
private CampaignCriterionServiceInterface campaignCriterionService;
private CampaignServiceInterface campaignService;
private CampaignTargetServiceInterface campaignTargetService;
/**
* Run before each test.
*/
@Override
protected void setUp() throws Exception {
super.setUp();
testUser = new AdWordsUser("test_data/test.properties");
String server = "https://adwords-sandbox.google.com";
adGroupAdService = testUser.getService(AdWordsService.V200909.ADGROUP_AD_SERVICE, server);
adGrouCriterionService =
testUser.getService(AdWordsService.V200909.ADGROUP_CRITERION_SERVICE, server);
adGroupService = testUser.getService(AdWordsService.V200909.ADGROUP_SERVICE, server);
campaignCriterionService =
testUser.getService(AdWordsService.V200909.CAMPAIGN_CRITERION_SERVICE, server);
campaignService = testUser.getService(AdWordsService.V200909.CAMPAIGN_SERVICE, server);
campaignTargetService =
testUser.getService(AdWordsService.V200909.CAMPAIGN_TARGET_SERVICE, server);
}
/**
* Tests logging in with incorrect credentials.
*/
public void testBadLogin() throws ApiException, RemoteException {
AdWordsUser user = new AdWordsUser("test@gmail.com", "test",
"client_1+test@gmail.com", "user-agent",
"incorrect developer token", "any app token", true);
try {
((CampaignServiceInterface) user.getService(
AdWordsService.V200909.CAMPAIGN_SERVICE)).get(new CampaignSelector(null, null, null, null));
} catch (ServiceException e) {
assertEquals(e.getMessage(), "Could not get ClientLogin token for user.");
}
campaignService.get(new CampaignSelector(null, null, null, null));
}
/**
* A smoke test to ensure that objects can be created and updated correctly.
*/
public void testCampaignAdGroupAdCriterionCreation() throws ServiceException, IOException {
((AccountInterface) testUser.generateClientAdWordsUser(null).getService(
AdWordsService.V13.ACCOUNT_SERVICE)).getClientAccounts();
Random generator = new Random();
int numCamp = generator.nextInt(4) + 1;
for (int i = 0; i < numCamp; i++) {
Campaign campaign = new Campaign();
campaign.setBudget(new Budget(BudgetBudgetPeriod.DAILY, new Money("USD", 1000000L),
BudgetBudgetDeliveryMethod.STANDARD));
campaign.setStatus(CampaignStatus.PAUSED);
campaign.setBiddingStrategy(new ManualCPC());
CampaignReturnValue crv =
campaignService.mutate(new CampaignOperation[] {new CampaignOperation(Operator.ADD, null,
null, campaign)});
campaign = crv.getValue()[0];
campaignTargetService.mutate(new CampaignTargetOperation[] {new CampaignTargetOperation(
Operator.SET, null, new NetworkTargetList(campaign.getId(), null,
new NetworkTarget[] {new NetworkTarget(null, NetworkCoverageType.GOOGLE_SEARCH)}))});
NegativeCampaignCriterion negativeCampaignCriterion = new NegativeCampaignCriterion();
negativeCampaignCriterion.setCampaignId(campaign.getId());
negativeCampaignCriterion.setCriterion(new Placement(null, null, "http://example.com/"));
CampaignCriterionOperation operation = new CampaignCriterionOperation();
operation.setOperator(Operator.ADD);
operation.setOperand(negativeCampaignCriterion);
campaignCriterionService.mutate(new CampaignCriterionOperation[] {operation});
int numAdGrp = generator.nextInt(6) + 1;
for (int j = 0; j < numAdGrp; j++) {
AdGroupPage adGroupPage =
adGroupService.get(new AdGroupSelector(campaign.getId(), null, null, null));
AdGroup[] adGroups = adGroupPage.getEntries();
AdGroup adGroup = null;
if (adGroups != null && j < adGroups.length) {
adGroup = adGroups[j];
} else {
adGroup = new AdGroup();
adGroup.setName("AdGroup " + (j + 1));
adGroup.setBids(new ManualCPCAdGroupBids(null, new Bid(new Money("USD",
generator.nextInt(10) * 50000L + 50000L)), null, null));
adGroup.setCampaignId(campaign.getId());
AdGroupReturnValue adGroupReturnValue =
adGroupService.mutate(new AdGroupOperation[] {new AdGroupOperation(Operator.ADD,
null, adGroup)});
adGroup = adGroupReturnValue.getValue()[0];
}
int numAds = generator.nextInt(10) + 1;
for (int k = 0; k < numAds; k++) {
TextAd ad = new TextAd();
ad.setDescription1("This is the description");
ad.setDescription2("Second line of the description");
ad.setHeadline("This is the headline " + generator.nextInt(5000));
ad.setDisplayUrl("http://google.com/");
ad.setUrl("http://example.com");
AdGroupAd adGroupAd = new AdGroupAd();
adGroupAd.setAd(ad);
adGroupAd.setAdGroupId(adGroup.getId());
adGroupAdService.mutate(new AdGroupAdOperation[] {new AdGroupAdOperation(Operator.ADD,
"ADD", adGroupAd, null)});
}
numAds = generator.nextInt(10) + 1;
for (int k = 0; k < numAds; k++) {
ImageAd ad = new ImageAd();
Image image = new Image();
image.setData(DataUtils.getTestImage());
image.setName("name.jpg");
ad.setImage(image);
ad.setDisplayUrl("http://google.com/");
ad.setUrl("http://example.com");
ad.setName("name.jpg");
AdGroupAd adGroupAd = new AdGroupAd();
adGroupAd.setAd(ad);
adGroupAd.setAdGroupId(adGroup.getId());
adGroupAdService.mutate(new AdGroupAdOperation[] {new AdGroupAdOperation(Operator.ADD,
"ADD", adGroupAd, null)});
}
ArrayList<AdGroupCriterionOperation> criteriaOps =
new ArrayList<AdGroupCriterionOperation>();
int numKeywords = generator.nextInt(10) + 1;
for (int k = 0; k < numKeywords; k++) {
Keyword keyword = new Keyword();
keyword.setText("test" + generator.nextInt(5000));
keyword.setMatchType(KeywordMatchType.PHRASE);
BiddableAdGroupCriterion criterion = new BiddableAdGroupCriterion();
criterion.setAdGroupId(adGroup.getId());
criterion.setCriterion(keyword);
criteriaOps.add(new AdGroupCriterionOperation(Operator.ADD, "ADD", criterion, null));
}
adGrouCriterionService.mutate(criteriaOps.toArray(new AdGroupCriterionOperation[] {}));
}
}
}
}