From 0484f4ee6d789019d288550289e588cd9fb914dd Mon Sep 17 00:00:00 2001 From: CGantert345 <57003061+CGantert345@users.noreply.github.com> Date: Fri, 3 Jan 2020 10:48:10 +0100 Subject: unit tests --- src/org/uic/ticket/api/test/DateTimeUtilsTest.java | 45 +++ .../ticket/api/test/UperEncodeTicketTestV1.java | 450 +++++++++++++++++++++ .../api/test/UperEncodeUICTicketExtensionTest.java | 127 ++++++ 3 files changed, 622 insertions(+) create mode 100644 src/org/uic/ticket/api/test/DateTimeUtilsTest.java create mode 100644 src/org/uic/ticket/api/test/UperEncodeTicketTestV1.java create mode 100644 src/org/uic/ticket/api/test/UperEncodeUICTicketExtensionTest.java diff --git a/src/org/uic/ticket/api/test/DateTimeUtilsTest.java b/src/org/uic/ticket/api/test/DateTimeUtilsTest.java new file mode 100644 index 0000000..1b809dd --- /dev/null +++ b/src/org/uic/ticket/api/test/DateTimeUtilsTest.java @@ -0,0 +1,45 @@ +package org.uic.ticket.api.test; + +import java.util.Calendar; +import java.util.TimeZone; +import org.junit.Test; +import org.uic.ticket.api.asn.omv1.DateTimeUtils; + + +public class DateTimeUtilsTest{ + + + + @Test public void testDateDiff1() throws IllegalArgumentException, IllegalAccessException { + + Calendar issuing = Calendar.getInstance(); + issuing.setTimeZone(TimeZone.getTimeZone("UTC")); + issuing.set(Calendar.YEAR,2017); + issuing.set(Calendar.DAY_OF_MONTH, 31); + issuing.set(Calendar.MONTH, 12); + issuing.set(Calendar.HOUR_OF_DAY, 23); + issuing.set(Calendar.MINUTE, 5); + + Calendar local = Calendar.getInstance(); + local.set(Calendar.YEAR,2018); + local.set(Calendar.DAY_OF_MONTH, 1); + local.set(Calendar.MONTH, 1); + issuing.set(Calendar.HOUR_OF_DAY, 0); + issuing.set(Calendar.MINUTE, 5); + + Long diff = DateTimeUtils.getDateDifference(issuing.getTime(), local.getTime()); + + + assert(diff.intValue() == 1); + } + + + + + + + + + + +} diff --git a/src/org/uic/ticket/api/test/UperEncodeTicketTestV1.java b/src/org/uic/ticket/api/test/UperEncodeTicketTestV1.java new file mode 100644 index 0000000..9fed854 --- /dev/null +++ b/src/org/uic/ticket/api/test/UperEncodeTicketTestV1.java @@ -0,0 +1,450 @@ +package org.uic.ticket.api.test; + +import static org.junit.Assert.assertEquals; + +import java.util.logging.Level; + +import net.gcdc.asn1.datatypesimpl.SequenceOfStringUTF8; +import net.gcdc.asn1.uper.UperEncoder; + +import org.junit.Test; +import org.uic.ticket.api.asn.omv1.CardReferenceType; +import org.uic.ticket.api.asn.omv1.ControlData; +import org.uic.ticket.api.asn.omv1.CustomerStatusType; +import org.uic.ticket.api.asn.omv1.DocumentData; +import org.uic.ticket.api.asn.omv1.ExtensionData; +import org.uic.ticket.api.asn.omv1.IssuingData; +import org.uic.ticket.api.asn.omv1.OpenTicketData; +import org.uic.ticket.api.asn.omv1.SequenceOfCardReferenceType; +import org.uic.ticket.api.asn.omv1.SequenceOfCustomerStatusType; +import org.uic.ticket.api.asn.omv1.SequenceOfDocumentData; +import org.uic.ticket.api.asn.omv1.SequenceOfExtensionData; +import org.uic.ticket.api.asn.omv1.SequenceOfTicketLinkType; +import org.uic.ticket.api.asn.omv1.SequenceOfTravelerType; +import org.uic.ticket.api.asn.omv1.StationPassageData; +import org.uic.ticket.api.asn.omv1.TicketDetailData; +import org.uic.ticket.api.asn.omv1.TicketLinkType; +import org.uic.ticket.api.asn.omv1.TokenType; +import org.uic.ticket.api.asn.omv1.TravelerData; +import org.uic.ticket.api.asn.omv1.TravelerType; +import org.uic.ticket.api.asn.omv1.UicRailTicketData; + + +public class UperEncodeTicketTestV1 { + + /** + * Example from the Standard on UPER. +
+     value UicRailTicketData ::=  {     
+       issuingDetail {
+            issuingYear       2018
+            issuingDay        1
+       	    specimen          TRUE,
+            securePaperTicket FALSE,
+            activated         TRUE,
+            issuerPNR         "issuerTestPNR",
+       	    issuedOnLine      12
+       }
+       ,travelerDetail{
+            traveler {
+               {
+                	firstName      "John"
+          	     	,secondName    "Dow"
+                	,idCard        "12345"
+                	,ticketHolder  TRUE
+          			,status        {{customerStatusDescr "senior" }}
+               }
+            }
+           ,groupName "myGroup"
+       }
+       ,transportDocument {
+          	{
+	         	 token {tokenProviderIA5 "VDV", token '82DA'H }
+	        	,ticket openTicket : {
+	        			returnIncluded    FALSE
+        				infoText          "openTicketInfo"
+	        	 }
+	       	}
+	      	,{
+	        	 ticket stationPassage : {
+       					 productName       "passage"
+       					,stationNameUTF8   { "Amsterdam" }       
+       					,validFromDay      0
+       					,numberOfDaysValid 123
+ 	        	}
+	       	}		
+       } 
+       ,controlDetail {
+          identificationByCardReference {
+            { trailingCardIdNum 100 }
+          }
+   	      ,identificationByIdCard	    FALSE
+    	  ,identificationByPassportId   FALSE
+          ,passportValidationRequired  	FALSE
+      	  ,onlineValidationRequired    	FALSE
+          ,ageCheckRequired            	FALSE   	
+    	  ,reductionCardCheckRequired  	FALSE          
+          ,infoText                     "cd"
+          ,includedTickets {
+          	{ productOwnerIA5 "test" }
+          }
+       } 
+       ,extension {
+            { extensionId "1", extensionData '82DA'H }
+           ,{ extensionId "2", extensionData '83DA'H }
+        }			
+     }
+     
+     
+     Encoding to the file 'data.uper' using PER UNALIGNED encoding rule...
+UicRailTicketData SEQUENCE [root fieldcount (not encoded) = 5]
+  issuingDetail IssuingData SEQUENCE [root fieldcount (not encoded) = 7]
+    issuingYear INTEGER [length (not encoded) = 1.0]
+      2018
+    issuingDay INTEGER [length (not encoded) = 1.1]
+      1
+    specimen BOOLEAN [length (not encoded) = 0.1]
+      TRUE
+    securePaperTicket BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    activated BOOLEAN [length (not encoded) = 0.1]
+      TRUE
+    issuerPNR IA5String [length = 13.0]
+      "issuerTestPNR"
+    issuedOnLine INTEGER [length = 1.0]
+      12
+  travelerDetail TravelerData SEQUENCE [root fieldcount (not encoded) = 2]
+    traveler SEQUENCE OF [count = 1]
+      TravelerType SEQUENCE [root fieldcount (not encoded) = 5]
+        firstName UTF8String [length = 4.0]
+          0x4a6f686e
+        secondName UTF8String [length = 3.0]
+          0x446f77
+        idCard IA5String [length = 5.0]
+          "12345"
+        ticketHolder BOOLEAN [length (not encoded) = 0.1]
+          TRUE
+        status SEQUENCE OF [count = 1]
+          CustomerStatusType SEQUENCE [fieldcount (not encoded) = 1]
+            customerStatusDescr IA5String [length = 6.0]
+              "senior"
+    groupName UTF8String [length = 7.0]
+      0x6d7947726f7570
+  transportDocument SEQUENCE OF [count = 2]
+    DocumentData SEQUENCE [root fieldcount (not encoded) = 2]
+      token TokenType SEQUENCE [fieldcount (not encoded) = 2]
+        tokenProviderIA5 IA5String [length = 3.0]
+          "VDV"
+        token OCTET STRING [length = 2.0]
+          0x82da
+      ticket CHOICE [index = 2]
+        openTicket OpenTicketData SEQUENCE [root fieldcount (not encoded) = 2]
+          returnIncluded BOOLEAN [length (not encoded) = 0.1]
+            FALSE
+          infoText UTF8String [length = 14.0]
+            0x6f70656e5469636b6574496e666f
+    DocumentData SEQUENCE [root fieldcount (not encoded) = 1]
+      ticket CHOICE [index = 9]
+        stationPassage StationPassageData SEQUENCE [root fieldcount (not encoded) = 4]
+          productName UTF8String [length = 7.0]
+            0x70617373616765
+          stationNameUTF8 SEQUENCE OF [count = 1]
+            UTF8String [length = 9.0]
+              0x416d7374657264616d
+          validFromDay INTEGER [length (not encoded) = 1.2]
+            0
+          numberOfDaysValid INTEGER [length = 1.0]
+            123
+  controlDetail ControlData SEQUENCE [root fieldcount (not encoded) = 9]
+    identificationByCardReference SEQUENCE OF [count = 1]
+      CardReferenceType SEQUENCE [root fieldcount (not encoded) = 1]
+        trailingCardIdNum INTEGER [length = 1.0]
+          100
+    identificationByIdCard BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    identificationByPassportId BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    passportValidationRequired BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    onlineValidationRequired BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    ageCheckRequired BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    reductionCardCheckRequired BOOLEAN [length (not encoded) = 0.1]
+      FALSE
+    infoText UTF8String [length = 2.0]
+      0x6364
+    includedTickets SEQUENCE OF [count = 1]
+      TicketLinkType SEQUENCE [root fieldcount (not encoded) = 1]
+        productOwnerIA5 IA5String [length = 4.0]
+          "test"
+  extension SEQUENCE OF [count = 2]
+    ExtensionData SEQUENCE [fieldcount (not encoded) = 2]
+      extensionId IA5String [length = 1.0]
+        "1"
+      extensionData OCTET STRING [length = 2.0]
+        0x82da
+    ExtensionData SEQUENCE [fieldcount (not encoded) = 2]
+      extensionId IA5String [length = 1.0]
+        "2"
+      extensionData OCTET STRING [length = 2.0]
+        0x83da
+Total encoded length = 133.7
+Encoded successfully in 134 bytes:
+78022020 050DD3CF 9F5CBCAA 65E7D284 EA40218A 02D00082 2537B437 01A237BB
+82B164CD A3580883 73CBBB4E FE40EDAF 28EE4DEE AE004A03 AD12B014 16D08000
+0000100E 6F70656E 5469636B 6574496E 666F1202 2040EE0C 2E6E6C2C ECA02128
+2DAE6E8C AE4C8C2D A0080BDA 60100402 C800131B 20082027 4CBCFA01 00B10282
+DA016405 07B4
+
+ 
+			
+    
+ */ + + + + @Test public void testEncodeTicket() throws IllegalArgumentException, IllegalAccessException { + UicRailTicketData ticket = new UicRailTicketData(); + populateTicket(ticket); + byte[] encoded = UperEncoder.encode(ticket); + String hex = UperEncoder.hexStringFromBytes(encoded); + UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex)); + + String expectedHex = "78022020050DD3CF9F5CBCAA65E7D284EA40218A02D000822537B43701A237BB82B164CDA358088373CBBB4EFE40EDAF28EE4DEEAE004A03AD12B01416D080000000100E6F70656E5469636B6574496E666F12022040EE0C2E6E6C2CECA021282DAE6E8CAE4C8C2DA0080BDA60100402C800131B200820274CBCFA0100B10282DA01640507B4"; + UperEncoder.logger.debug(String.format("first difference at index: %d",hex.compareTo(expectedHex))); + UperEncoder.logger.debug(String.format("data returned: %s",hex)); + UperEncoder.logger.debug(String.format("data expected: %s",expectedHex)); + assertEquals(hex,expectedHex); + } + + @Test public void testDecodeTicket() throws IllegalArgumentException, IllegalAccessException { + UicRailTicketData ticket = new UicRailTicketData(); + populateTicket(ticket); + byte[] encoded = UperEncoder.encode(ticket); + String hex = UperEncoder.hexStringFromBytes(encoded); + UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex)); + String expectedHex = "78022020050DD3CF9F5CBCAA65E7D284EA40218A02D000822537B43701A237BB82B164CDA358088373CBBB4EFE40EDAF28EE4DEEAE004A03AD12B01416D080000000100E6F70656E5469636B6574496E666F12022040EE0C2E6E6C2CECA021282DAE6E8CAE4C8C2DA0080BDA60100402C800131B200820274CBCFA0100B10282DA01640507B4"; + assertEquals(hex,expectedHex); + UicRailTicketData decodedTicket = UperEncoder.decode(encoded, UicRailTicketData.class); + assert(decodedTicket != null); + assertEquals(decodedTicket.controlDetail.ageCheckRequired , false ); + assertEquals(decodedTicket.controlDetail.getInfoText() , "cd" ); + assertEquals(decodedTicket.controlDetail.getIncludedTickets().get(0).getProductOwnerIA5() , "test" ); + assert(decodedTicket.controlDetail.getIdentificationByCardReference().get(0).getTrailingCardIdNum() == 100L ); + } + + private void populateTicket(UicRailTicketData ticket) { + + ticket.setControlDetail(new ControlData()); + populate(ticket.getControlDetail()); + + + ticket.setIssuingDetail(new IssuingData()); + populateIssuingData(ticket.getIssuingDetail()); + + TravelerData td = new TravelerData(); + populateTravelerData(td); + ticket.setTravelerDetail(td); + + SequenceOfDocumentData ds = new SequenceOfDocumentData(); + + + //OpenTicket + DocumentData do1 = new DocumentData(); + addOpenTicketData(do1); + ds.add(do1); + + //StationPassage + DocumentData do2 = new DocumentData(); + addStationPassage(do2); + ds.add(do2); + + ticket.setTransportDocument(ds); + + SequenceOfExtensionData ed = new SequenceOfExtensionData(); + populateExtensionSequence(ed); + ticket.setExtension(ed); + + } + + /* + ticket stationPassage : { + productName "passage" + ,stationNameUTF8 { "Amsterdam" } + ,validFromDay 0 + ,numberOfDaysValid 123 + } + */ + private void addStationPassage(DocumentData dd) { + TicketDetailData tdd = new TicketDetailData(); + StationPassageData sp = new StationPassageData(); + sp.setProductName("passage"); + sp.setValidFromDay(0L); + sp.setNumberOfDaysValid(123L); + SequenceOfStringUTF8 ss = new SequenceOfStringUTF8(); + ss.add("Amsterdam"); + sp.setStationNameUTF8(ss); + tdd.setStationPassage(sp); + dd.setTicket(tdd); + } + + /* + { + token {tokenProviderIA5 "VDV", token '82DA'H } + ,ticket openTicket : { + returnIncluded FALSE + infoText "openTicketInfo" + } + } + */ + + private void addOpenTicketData(DocumentData dd) { + TokenType to = new TokenType(); + to.setTokenProviderIA5("VDV"); + byte[] ba = { (byte) 0x82, (byte) 0xDA }; + to.setToken(ba); + dd.setToken(to); + + TicketDetailData tdd = new TicketDetailData(); + OpenTicketData otd = new OpenTicketData(); + otd.setInfoText("openTicketInfo"); + otd.setReturnIncluded(false); + tdd.setOpenTicket(otd); + dd.setTicket(tdd); + } + + + /* + ,travelerDetail{ + traveler { + { + firstName "John" + ,secondName "Dow" + ,idCard "12345" + ,ticketHolder TRUE + ,status {{customerStatusDescr "senior" }} + } + } + ,groupName "myGroup" + } + */ + + private void populateTravelerData(TravelerData td) { + td.setGroupName("myGroup"); + SequenceOfTravelerType trs = new SequenceOfTravelerType(); + TravelerType tr = new TravelerType(); + tr.setIdCard("12345"); + tr.setFirstName("John"); + tr.setSecondName("Dow"); + tr.setTicketHolder(true); + SequenceOfCustomerStatusType ts = new SequenceOfCustomerStatusType(); + CustomerStatusType cst = new CustomerStatusType(); + cst.setCustomerStatusDescr("senior"); + ts.add(cst); + tr.setStatus(ts); + trs.add(tr); + td.setTraveler(trs); + } + + /* + ,issuingDetail { + issuingYear 2018 + issuingDay 1 + specimen TRUE, + securePaperTicket FALSE, + activated TRUE, + issuerPNR "issuerTestPNR", + issuedOnLine 12 + } + */ + private void populateIssuingData(IssuingData issuingDetail) { + issuingDetail.setIssuingYear(2018L); + issuingDetail.setIssuingDay(1L); + issuingDetail.setIssuerPNR("issuerTestPNR"); + issuingDetail.setSpecimen(true); + issuingDetail.setSecurePaperTicket(false); + issuingDetail.setActivated(true); + issuingDetail.setIssuedOnLine(12L); + } + + /* + ,extension { + { extensionId "1", extensionData '82DA'H } + ,{ extensionId "2", extensionData '83DA'H } + } + */ + private void populateExtensionSequence(SequenceOfExtensionData ed) { + ExtensionData ed1 = new ExtensionData(); + ed1.setExtensionId("1"); + byte[] ba1 = { (byte) 0x82, (byte) 0xDA }; + ed1.setExtensionData(ba1); + ExtensionData ed2 = new ExtensionData(); + ed2.setExtensionId("2"); + byte[] ba2 = { (byte) 0x83, (byte) 0xDA }; + ed2.setExtensionData(ba2); + ed.add(ed1); + ed.add(ed2); + } + + /* + ,controlDetail { + identificationByCardReference { + { trailingCardIdNum 100 } + } + ,identificationByIdCard FALSE + ,identificationByPassportId FALSE + ,passportValidationRequired FALSE + ,onlineValidationRequired FALSE + ,ageCheckRequired FALSE + ,reductionCardCheckRequired FALSE + ,infoText "cd" + ,includedTickets { + { productOwnerIA5 "test" } + } + } + */ + private void populate(ControlData controlDetail) { + controlDetail.infoText = "cd"; + controlDetail.setAgeCheckRequired(false); + controlDetail.setIdentificationByIdCard(false); + controlDetail.setIdentificationByPassportId(false); + controlDetail.setOnlineValidationRequired(false); + controlDetail.setPassportValidationRequired(false); + controlDetail.setReductionCardCheckRequired(false); + controlDetail.setIdentificationByCardReference(new SequenceOfCardReferenceType()); + controlDetail.getIdentificationByCardReference().add(populateCardRefrence()); + SequenceOfTicketLinkType sit = new SequenceOfTicketLinkType(); + populateIncludedTickets(sit); + controlDetail.setIncludedTickets(sit); + } + + + /* + * + */ + private void populateIncludedTickets(SequenceOfTicketLinkType sequenceOfTicketLinkType) { + TicketLinkType tlt = new TicketLinkType(); + tlt.productOwnerIA5="test"; + sequenceOfTicketLinkType.add(tlt); + } + + /* + { + trailingCardIdNum 100 + } + */ + private CardReferenceType populateCardRefrence() { + CardReferenceType cr = new CardReferenceType(); + cr.setTrailingCardIdNum(100L); + return cr; + } + + + + + + + + +} diff --git a/src/org/uic/ticket/api/test/UperEncodeUICTicketExtensionTest.java b/src/org/uic/ticket/api/test/UperEncodeUICTicketExtensionTest.java new file mode 100644 index 0000000..3874b4e --- /dev/null +++ b/src/org/uic/ticket/api/test/UperEncodeUICTicketExtensionTest.java @@ -0,0 +1,127 @@ +package org.uic.ticket.api.test; + +import static org.junit.Assert.assertEquals; + +import java.util.logging.Level; + +import net.gcdc.asn1.datatypes.Asn1Optional; +import net.gcdc.asn1.datatypes.Sequence; +import net.gcdc.asn1.uper.UperEncoder; + +import org.junit.Test; +import org.uic.ticket.api.asn.omv1.ExtensionData; +import org.uic.ticket.api.asn.omv1.SequenceOfExtensionData; + + +public class UperEncodeUICTicketExtensionTest { + + /** + * Example from the Standard on UPER. +
+ 		World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
+		BEGIN
+		TestRecord ::= [APPLICATION 0] IMPLICIT SEQUENCE {     
+          extensionList			SEQUENCE OF ExtensionData 	OPTIONAL   
+        }
+        ExtensionData	::= SEQUENCE 	{	
+	      extensionId   IA5String, 
+	      extensionData OCTET STRING
+        }        
+        END
+     
+     
+		value TestRecord ::= { extensionList {
+       		{ extensionId "1", extensionData '82DA'H }
+      	   ,{ extensionId "2", extensionData '83DA'H }
+   		 }			
+		}
+     
+Encoding to the file 'data.uper' using PER UNALIGNED encoding rule...
+TestRecord SEQUENCE [fieldcount (not encoded) = 1]
+  extensionList SEQUENCE OF [count = 2]
+    ExtensionData SEQUENCE [fieldcount (not encoded) = 2]
+      extensionId IA5String [length = 1.0]
+        "1"
+      extensionData OCTET STRING [length = 2.0]
+        0x82da
+    ExtensionData SEQUENCE [fieldcount (not encoded) = 2]
+      extensionId IA5String [length = 1.0]
+        "2"
+      extensionData OCTET STRING [length = 2.0]
+        0x83da
+Total encoded length = 10.7
+Encoded successfully in 11 bytes:
+8100B102 82DA0164 0507B4
+    
+ */ + + + @Sequence + public static class TestRecord { + + @Asn1Optional public SequenceOfExtensionData extension; + + public TestRecord() {} + public void setExtensionList(SequenceOfExtensionData sd){ + this.extension = sd; + } + } + + + @Test public void testEncodeTicket() throws IllegalArgumentException, IllegalAccessException { + TestRecord ticket = new TestRecord(); + populateTicket(ticket); + byte[] encoded = UperEncoder.encode(ticket); + String hex = UperEncoder.hexStringFromBytes(encoded); + UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex)); + String expectedHex = "8100B10282DA01640507B4"; + UperEncoder.logger.debug(String.format("first diference at index: %d",hex.compareTo(expectedHex))); + assertEquals(hex,expectedHex); + } + + @Test public void testDecodeTicket() throws IllegalArgumentException, IllegalAccessException { + TestRecord ticket = new TestRecord(); + populateTicket(ticket); + byte[] encoded = UperEncoder.encode(ticket); + String hex = UperEncoder.hexStringFromBytes(encoded); + UperEncoder.logger.log(Level.FINEST,String.format("data hex: %s", hex)); + String expectedHex = "8100B10282DA01640507B4"; + TestRecord decodedTicket = UperEncoder.decode(encoded, TestRecord.class); + assert(decodedTicket != null); + assertEquals(hex,expectedHex); + } + + private void populateTicket(TestRecord ticket) { + + SequenceOfExtensionData ed = new SequenceOfExtensionData(); + populateExtensionSequence(ed); + ticket.setExtensionList(ed); + + } + + + + /* + ,extension { + { extensionId "1", extensionData '82DA'H } + ,{ extensionId "2", extensionData '83DA'H } + } + */ + private void populateExtensionSequence(SequenceOfExtensionData ed) { + ExtensionData ed1 = new ExtensionData(); + ed1.setExtensionId("1"); + byte[] ba1 = { (byte) 0x82, (byte) 0xDA }; + ed1.setExtensionData(ba1); + ExtensionData ed2 = new ExtensionData(); + ed2.setExtensionId("2"); + byte[] ba2 = { (byte) 0x83, (byte) 0xDA }; + ed2.setExtensionData(ba2); + ed.add(ed1); + ed.add(ed2); + } + + + + + +} -- cgit v1.2.3