package org.ebayopensource.turmeric.tools.codegen.proto;
import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_OPTIONAL_TAG_START_NUMBER;
import static org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.tag.ProtobufTagConstants.S_PROTO_REQUIRED_TAG_START_NUMBER;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import junit.framework.Assert;
import org.ebayopensource.turmeric.tools.TestResourceUtil;
import org.ebayopensource.turmeric.tools.codegen.AbstractServiceGeneratorTestCase;
import org.ebayopensource.turmeric.tools.codegen.CodeGenContext;
import org.ebayopensource.turmeric.tools.codegen.external.wsdl.parser.WSDLParserException;
import org.ebayopensource.turmeric.tools.codegen.external.wsdl.parser.schema.SchemaType;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.FastSerFormatCodegenBuilder;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.ProtobufSchemaMapper;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.dotproto.DotProtoGenerator;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.model.ProtobufField;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.model.ProtobufFieldModifier;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.model.ProtobufMessage;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.model.ProtobufSchema;
import org.junit.Test;
public class ProtoFileBasedTagGeneratorTest extends AbstractServiceGeneratorTestCase
{
private String [] WSDLS = new String [] {
"AAIADecoderService_for_tags",
"AdBillingService_for_tags",
"AddressBookService_for_tags",
"AddressVerificationService_for_tags",
"AdGroupService_for_tags",
"AdjustmentService_for_tags",
"AdminApplicationCatalogService_for_tags",
"AdminService_for_tags",
"AnonymizerService_for_tags",
"ApplicationAuthorizationService_for_tags",
"ApplicationCatalogService_for_tags",
"ApplicationLoggingService_for_tags",
"APTopoBuilderService_for_tags",
"ARService_for_tags",
"AsacAdminService_for_tags",
"AssertionsService_for_tags",
"AuthenticationService_for_tags",
"AuthorizationService_for_tags",
"AutoCompleteQueryService_for_tags",
"AVSMonitoringAlertsService_for_tags",
"BCOut_for_tags",
"BdxStatisticsService_for_tags",
"BillingTransactionService_for_tags",
"BlacklistService_for_tags",
"BRService_for_tags",
"BRS_for_tags",
"BSADAdminService_for_tags",
"BuildServiceService_for_tags",
"BulkDataExchangeService_for_tags",
"BuyerProtectionService_for_tags",
"BuyingListService_for_tags",
"BuyingService_for_tags",
"CallTreeService_for_tags",
"CalMetaDataService_for_tags",
"CalPoolDataService_for_tags",
"CalSearchService_for_tags",
"CampaignService_for_tags",
"CartService_for_tags",
"CatalogContentService_for_tags",
"CatalogLanguageProcessingService_for_tags",
"CatalogMatchProductService_for_tags",
"CatalogService_for_tags",
"CategoryServiceInternal_for_tags",
"ChallengeService_for_tags",
"ChargeService_for_tags",
"CheckoutCartService_for_tags",
"ClassifiedAdAdminService_for_tags",
"ClassifiedAdManagementPrivateService_for_tags",
"ClassifiedAdMetadataService_for_tags",
"ClassifiedAdPeeringService_for_tags",
"ClassifiedAdSearchService_for_tags",
"ClassifiedAdUserPrivateService_for_tags",
"CMDBService_for_tags",
"CollectionsService_for_tags",
"CommonMobileAppService_for_tags",
"CommunityProductMediaService_for_tags",
"CommunityProductService_for_tags",
"CommunityProductUserAccountService_for_tags",
"ConsumerService_for_tags",
"ContactInfoUtilityService_for_tags",
"CoreCatalogMetadataService_for_tags",
"CoreProductService_for_tags",
"CoreShippingService_for_tags",
"CreativeService_for_tags",
"CSPolicyDetailsService_for_tags",
"CSUserPolicyViolationService_for_tags",
"CTFKernelService_for_tags",
"CurrencyRateService_for_tags",
"DataNormalizerService_for_tags",
"DataTransferService_for_tags",
"DealsDataService_for_tags",
"DealsService_for_tags",
"DemoEightService_for_tags",
"DemoNineService_for_tags",
"DemoServiceChanService3_for_tags",
"DemoService_for_tags",
"DemoSevenService_for_tags",
"DemoSix_for_tags",
"DemoTenService_for_tags",
"DeviceConfigurationService_for_tags",
"DeviceIdentificationService_for_tags",
"DPNewResolutionService_for_tags",
"EasyReturnService_for_tags",
"EbayDailyDealService_for_tags",
"EbayDecoderService_for_tags",
"EbayScheduledDealsService_for_tags",
"EchoEaisService_for_tags",
"EchoEciService_for_tags",
"EchoEidpService_for_tags",
"EimPeeringService_for_tags",
"EmailMessagingRenderingService_for_tags",
"EmailService_for_tags",
"EntitlementService_for_tags",
"EsamsBridgeService_for_tags",
"ExperimentationExecutionService_for_tags",
"ExperimentationManagementService_for_tags",
"FeatureContingencyService_for_tags",
"FeedbackService_for_tags",
"FileTransferService_for_tags",
"FindingDemandService_for_tags",
"FindingMetadataService_for_tags",
"FindingRecommendationService_for_tags",
"FindingUserPreferenceService_for_tags",
"FindingUserSettingsService_for_tags",
"FindItemServiceCore_for_tags",
"FindItemService_for_tags",
"FindProductService1_for_tags",
"FindProductService_for_tags",
"FindStoreService_for_tags",
"FundRaisingService_for_tags",
"FundStatusServiceV1_for_tags",
"GemDashboardService_for_tags",
"GetNaturalSearchPageContentService_for_tags",
"HalfIncentiveService_for_tags",
"HalfRentalManagementService_for_tags",
"ImageTextService_for_tags",
"ImageTransformationService_for_tags",
"ImageUtilityService_for_tags",
"IncentiveService_for_tags",
"IPhoneApplicationProcessService_for_tags",
"ItemAccessoryClassificationService_for_tags",
"ItemAccessoryClassificationSupportService_for_tags",
"ItemClassificationPersistenceService_for_tags",
"ItemClassificationService_for_tags",
"ItemClassificationSupportService_for_tags",
"ItemQualityClassificationService_for_tags",
"ItemQualityClassificationSupportService_for_tags",
"ItemService_for_tags",
"ItemToProductAssociationService_for_tags",
"ItemToProductSuggestionService_for_tags",
"ItemToProductSuggestionSupportService_for_tags",
"ListingDraftService_for_tags",
"ListingDraftWorkspaceService_for_tags",
"ListingTnSEvaluationService_for_tags",
"ListService_for_tags",
"MachineMetricAnalyzerService_for_tags",
"MachineMetricDataService_for_tags",
"MaestroDecisionService_for_tags",
"MayThird_for_tags",
"MetadataDependencyService_for_tags",
"MobileDeviceNotificationService_for_tags",
"MostSharedDataService_for_tags",
"MyEbayApplicationService_for_tags",
"MyGarageService_for_tags",
"NewAnalyticService_for_tags",
"NewARService_for_tags",
//"NewResolutionService_for_tags",
"NewService_for_tags",
"NormalizerDAO_for_tags",
"NotificationEventMetadataService_for_tags",
"NotificationsService_for_tags",
"ObjectIdMapperService_for_tags",
"OCSChannelService_for_tags",
"ODRService_for_tags",
"OpeneBayAdminService_for_tags",
"OpeneBayApplicationIntegrationService_for_tags",
"OpeneBayIdentityProviderService_for_tags",
"OpeneBaySubscriptionService_for_tags",
"OrderManagementService_for_tags",
"PackageInsuranceService_for_tags",
"PageJudgmentService_for_tags",
"PageMetadataService_for_tags",
"PageModelResolutionService_for_tags",
"PaymentService_for_tags",
"PersonalizationDataService_for_tags",
"PgwService_for_tags",
"PolicyEnforcementService_for_tags",
"ProductBundleService_for_tags",
"ProductCandidateService_for_tags",
"ProductReviewService_for_tags",
"ProductStatisticsService_for_tags",
"QueryService_for_tags",
"RadarEvaluationService_for_tags",
"RateLimiterService_for_tags",
"RegressService_for_tags",
"RemedyService_for_tags",
"RemotePortletSoa_for_tags",
"RepositoryMetadataService_for_tags",
"ResolutionCaseManagementServiceV1_for_tags",
"ResolutionCaseManagementService_for_tags",
"ResourcePersistenceService_for_tags",
"RetrieveArtifactDirectly_for_tags",
"RewardsAdminService_for_tags",
"RewardsCSService_for_tags",
"RewardsMemberService_for_tags",
"RewardsService_for_tags",
"RewardsTransactionService_for_tags",
"RIMApplicationProcessService_for_tags",
"RService_for_tags",
"SafeMarkupService_for_tags",
"SecurityAdminService_for_tags",
"SellerDiscountOfferManagementService_for_tags",
"SellerLimitsService_for_tags",
"SellerPerformanceAdminService_for_tags",
"SellerPerformanceService_for_tags",
"ServiceManagerService_for_tags",
"ShippingCalculatorServiceV2_for_tags",
"ShippingEngineService_for_tags",
"ShippingLabelService_for_tags",
"ShippingRateService_for_tags",
"ShippingRecommendationService_for_tags",
"ShippingService_for_tags",
"ShortURIService1_for_tags",
"ShortURIService_for_tags",
"SKUService_for_tags",
"SOAMetricDAO_for_tags",
"SOAMetricsQueryService_for_tags",
"SolutionDirectoryService_for_tags",
"StagingServiceService_for_tags",
"StorageService_for_tags",
"StorageStaasMgrServiceV1_for_tags",
"StorageStaasMgrService_for_tags",
"StoreInfoService_for_tags",
"TaxCalculationService_for_tags",
"TaxService_for_tags",
"TestServiceForMailingConfirmation_for_tags",
"TextGenomicsATORiskInfoService_for_tags",
"ThirdPartyAuthConsentService_for_tags",
"TnsTaxonomyService_for_tags",
"TokenService_for_tags",
"TrackingEventValidationService_for_tags",
"TransactionFeedbackService_for_tags",
"TranslationService1_for_tags",
"TranslationService_for_tags",
"UGCEnforcerService_for_tags",
"UserAccountEntityService_for_tags",
"UserAccountProcessService_for_tags",
"UserAuthenticationService_for_tags",
"UserContentClassificationService_for_tags",
"UserEntityBlackListService_for_tags",
"UserIncentivesService_for_tags",
"UserProfileService_for_tags",
"UserRiskService_for_tags",
"UserService_for_tags",
"UserVerificationService_for_tags",
"UserVoiceAdminService_for_tags",
"UserVoiceBaseService_for_tags",
"UserVoiceCommonService_for_tags",
"UserVoiceMetadataService_for_tags",
"UserVoiceService_for_tags",
"VehicleCatalogService_for_tags",
"ViewItemCounterService_for_tags",
"ViewItemService_for_tags",
"WhitelistService_for_tags",
"ProtoTagMaster"};
private String baseprotoPath = null;
public File getProtobufRelatedInput(String name) {
return TestResourceUtil.getResource("org/ebayopensource/turmeric/test/tools/codegen/data/proto/"
+ name);
}
public String[][] getWsdlArgs(File dest, File bin)
{
String testArgs[][] = new String[350][];
int counter=0;
for(String wsdl: WSDLS)
{
testArgs[counter] = new String[]{ "-servicename", wsdl, "-wsdl",
getProtobufRelatedInput(wsdl +".wsdl").getAbsolutePath(),"-genType",
"ClientNoConfig", "-src", dest.getAbsolutePath(), "-dest", dest.getAbsolutePath(), "-scv", "1.0.0", "-bin",bin.getAbsolutePath(),
"-enabledNamespaceFolding", "-nonXSDFormats", "protobuf" };
counter++;
}
return testArgs;
}
@Test
public void testDotprotoGenerationForMasterWSDL() throws Exception
{
File destDir = testingdir.getDir();
baseprotoPath = destDir.getAbsolutePath() + "/meta-src/META-INF/soa/services/proto";
File binDir = new File(destDir,"bin");
deleteOldProtoFiles();
String[][] wsdlArgs = getWsdlArgs(destDir,binDir);
for(String[] args : wsdlArgs)
{
if(args==null)
{
break;
}
CodeGenContext context = ProtobufSchemaMapperTestUtils.getCodeGenContext(args);
FastSerFormatCodegenBuilder.getInstance().validateServiceIfApplicable(context);
List<SchemaType> listOfSchemaTypes;
try
{
listOfSchemaTypes = FastSerFormatCodegenBuilder.getInstance().generateSchema(context);
}
catch (WSDLParserException e)
{
Assert.fail("Generate Schema Failed." + e.getMessage());
throw e;
}
ProtobufSchema schema = ProtobufSchemaMapper.getInstance().createProtobufSchema(listOfSchemaTypes, context);
try
{
DotProtoGenerator.getInstance().generate(schema, context);
}
catch (Exception e1)
{
Assert.fail("Dot Proto generation failed." + e1.getMessage());
throw e1;
}
ProtobufSchemaMapperTestUtils.validateTagNumberGeneration( context, schema );
}
verifyProtoFileTagAssignments();
}
public void verifyProtoFileTagAssignments() throws Exception
{
for(String wsdlName : WSDLS)
{
String path = baseprotoPath + File.separator + wsdlName + File.separator + wsdlName + ".proto";
System.out.println("Checking proto: " + path);
List<ProtobufMessage> loadFindItemServiceManuallyWrittenProtoFile = ProtobufSchemaMapperTestUtils.loadFindItemServiceManuallyWrittenProtoFile(path);
for(ProtobufMessage message : loadFindItemServiceManuallyWrittenProtoFile)
{
List<ProtobufField> fields = message.getFields();
boolean [] allReqFields = new boolean[S_PROTO_OPTIONAL_TAG_START_NUMBER-1];
for(ProtobufField field : fields)
{
ProtobufFieldModifier fieldModifier = field.getFieldModifier();
int sequenceTagNumber = field.getSequenceTagNumber();
sequenceTagNumber--;
if(fieldModifier == ProtobufFieldModifier.REPEATED || fieldModifier == ProtobufFieldModifier.REQUIRED)
{
if(sequenceTagNumber<= S_PROTO_OPTIONAL_TAG_START_NUMBER-2)
{
allReqFields[sequenceTagNumber]=true;
}
}
}
boolean allRequredFieldsAssinged = true;
for(boolean temp : allReqFields)
{
allRequredFieldsAssinged &= temp;
}
Set<Integer> optionalTagSet = new TreeSet<Integer>();
Set<Integer> repeatedTagSet = new TreeSet<Integer>();
for(ProtobufField field : fields)
{
ProtobufFieldModifier fieldModifier = field.getFieldModifier();
String fieldName = field.getFieldName();
int sequenceTagNumber = field.getSequenceTagNumber();
if(fieldModifier == ProtobufFieldModifier.REPEATED || fieldModifier == ProtobufFieldModifier.REQUIRED)
{
repeatedTagSet.add(sequenceTagNumber);
if(!allRequredFieldsAssinged)
{
if(sequenceTagNumber>S_PROTO_OPTIONAL_TAG_START_NUMBER-1)
{
Assert.fail("Required tag " + fieldName + " has value " + sequenceTagNumber );
}
}
}
else
{
optionalTagSet.add(sequenceTagNumber);
if(sequenceTagNumber<S_PROTO_OPTIONAL_TAG_START_NUMBER)
{
Assert.fail("Optional tag " + fieldName + " has value " + sequenceTagNumber );
}
}
}
System.out.println("Verifying " + message.getMessageName());
boolean optionalContinuityPassed = verifyOverallContinuity(optionalTagSet, ProtobufFieldModifier.OPTIONAL);
boolean repeatedContinuityPassed = verifyOverallContinuity(repeatedTagSet, ProtobufFieldModifier.REPEATED);
if(!(optionalContinuityPassed&&repeatedContinuityPassed))
{
repeatedTagSet.addAll(optionalTagSet);
boolean verifyContinuity = verifyContinuity(repeatedTagSet);
if(!verifyContinuity)
{
fail("Tags are not continuous");
}
}
}
}
}
private boolean verifyOverallContinuity(Set<Integer> tags, ProtobufFieldModifier fieldModifier )
{
if(tags.size()>0)
{
Integer next = tags.iterator().next();
if(fieldModifier != ProtobufFieldModifier.OPTIONAL)
{
Assert.assertTrue(next.equals(S_PROTO_REQUIRED_TAG_START_NUMBER));
}
}
return verifyContinuity(tags);
}
private boolean verifyContinuity(Set<Integer> tags)
{
int lastNum=Integer.MIN_VALUE;
for(int num : tags)
{
if(lastNum == Integer.MIN_VALUE)
{
lastNum = num;
}
else
{
int result = num-lastNum;
if(result != 1)
{
return false;
}
lastNum = num;
}
}
return true;
}
private void deleteOldProtoFiles()
{
File file = new File(baseprotoPath);
if(file.exists())
{
String[] list = file.list();
for(String dirPath : list)
{
File dirProto = new File(baseprotoPath + File.separator + dirPath);
if(dirProto.exists())
{
File[] listFiles = dirProto.listFiles();
for(File protoFile : listFiles)
{
protoFile.delete();
}
boolean delete = dirProto.delete();
System.out.println("Deleted " + dirPath + " " + delete);
}
}
}
}
}