protected AdWordsApiConfig GetAdWordsApiConfig(TestConfig testConfig)
        {
            var config = new AdWordsApiConfig();

            config.AccessToken            = testConfig.Oauth2.AccessToken;
            config.ClientCustomerId       = testConfig.AdWords.ClientCustomerId;
            config.DeveloperToken         = testConfig.AdWords.DeveloperToken;
            config.EnableGzipCompression  = true;
            config.IncludeZeroImpressions = true;             // report of test account always has no data
            config.PartialFailure         = false;
            config.SkipColumnHeader       = false;
            config.SkipReportHeader       = false;
            config.SkipReportSummary      = false;
            config.Timeout          = 1000 * 60;
            config.UserAgent        = "Manychois.GoogleApis.Tests.AdWords";
            config.UseRawEnumValues = false;
            config.ValidateOnly     = false;
            return(config);
        }
        async Task RunAsync(INetUtility netUtil, ILoggerFactory loggerFactory)
        {
            try
            {
                var credential = InstalledAppCredential.ReadFromFile("Path of your json file downloaded from your Google API Console");
                var oauth2Util = new OAuth2Utility(netUtil);
                var tokenInfo  = await oauth2Util.GetTokenInfoAsync(credential, "refreshToken");                // assume you have already obtained your refresh token

                var adWordsApiConfig = new AdWordsApiConfig();
                adWordsApiConfig.AccessToken      = tokenInfo.AccessToken;
                adWordsApiConfig.ClientCustomerId = "Your client customer ID";
                adWordsApiConfig.DeveloperToken   = "Developer token";
                adWordsApiConfig.UserAgent        = "Testing example";          // this and the rest of the properties are optional

                // An example of using some AdWords service
                ICampaignService campaignService = new CampaignService(adWordsApiConfig, netUtil, loggerFactory);                 // loggerFactory can be null
                var selector = new Selector <CampaignServiceField>()
                               .AddFields(CampaignServiceField.Id, CampaignServiceField.Name)
                               .AddPredicate(CampaignServiceField.Status, PredicateOperator.Equals, CampaignStatus.Enabled.ToXmlValue());
                var campaignPage = await campaignService.GetAsync(selector);

                // An example of getting AdWords report
                IReportUtility reportUtil = new ReportUtility(adWordsApiConfig, netUtil, loggerFactory);                 // loggerFactory can be null
                var            rptDef     = new ReportDefinition();
                rptDef.DateRangeType  = ReportDefinitionDateRangeType.AllTime;
                rptDef.DownloadFormat = DownloadFormat.GzippedCsv;
                rptDef.ReportName     = "Testing Report";
                rptDef.ReportType     = ReportDefinitionReportType.CampaignPerformanceReport;
                rptDef.Selector       = new Selector
                {
                    Fields = new List <string>()
                };
                rptDef.Selector.Fields.AddRange(new string[] { "CampaignId", "CampaignName", "Impressions" });
                var reportCsv = await reportUtil.GetContentStringAsync(rptDef);
            }
            catch (Exception ex)
            {
                _logger.LogError("{0}: {1}{2}{3}", ex.GetType().Name, ex.Message, Environment.NewLine, ex.StackTrace);
            }
        }