**FREE //===================================================================== // // Program.......: MEDDFNTSTX // // Description...: MEDDFN Parser Error Test Program // //===================================================================== ctl-opt option(*srcstmt:*nodebugio); /COPY './meddfn_h.rpgle' /COPY './meddfnap_h.rpgle' //===================================================================== // // Parser Prototype // //===================================================================== dcl-pr MD_ParseRetrieveBuffer; ReceiverBuffer char(32767) const options(*varsize); ReceiverLength int(10) const; MediaDefinition likeds(MD_MediaDefinition_T); Error likeds(MD_Error_T); end-pr; //===================================================================== // // Data // //===================================================================== dcl-s ReceiverBuffer char(32767); dcl-s ReceiverLength int(10); dcl-ds MediaDefinition likeds(MD_MediaDefinition_T); dcl-ds Error likeds(MD_Error_T); //===================================================================== // // Main // //===================================================================== TestReceiverTooSmall(); TestInvalidHeader(); TestInvalidDevice(); TestInvalidMediaFile(); TestInvalidVolumeArray(); dsply '----------------------------------------'; dsply 'MEDDFN Parser Error Test completed'; dsply '----------------------------------------'; *inlr = *on; return; //===================================================================== // // TestReceiverTooSmall // //===================================================================== dcl-proc TestReceiverTooSmall; dsply '----------------------------------------'; dsply 'Test: Receiver buffer too small'; dsply '----------------------------------------'; clear ReceiverBuffer; clear MediaDefinition; clear Error; ReceiverLength = 1; monitor; MD_ParseRetrieveBuffer( ReceiverBuffer : ReceiverLength : MediaDefinition : Error); on-error; dsply 'FAIL Unexpected runtime error'; return; endmon; if Error.HasError; dsply 'PASS Error.HasError'; else; dsply 'FAIL Error.HasError'; endif; if Error.MessageID = 'MDF2005'; dsply 'PASS Error.MessageID'; else; dsply 'FAIL Error.MessageID'; endif; if %trim(Error.MessageData) = ''; dsply 'PASS Error.MessageData'; else; dsply 'FAIL Error.MessageData'; endif; end-proc; //===================================================================== // // TestInvalidHeader // //===================================================================== dcl-proc TestInvalidHeader; dcl-ds Header likeds(MD_Tape0200Header_T) inz; dsply '----------------------------------------'; dsply 'Test: Invalid TAPE0200 header'; dsply '----------------------------------------'; clear ReceiverBuffer; clear MediaDefinition; clear Error; clear Header; Header.LengthOfHeader = 0; %subst( ReceiverBuffer : 1 : %size(Header)) = Header; ReceiverLength = %size(Header); monitor; MD_ParseRetrieveBuffer( ReceiverBuffer : ReceiverLength : MediaDefinition : Error); on-error; dsply 'FAIL Unexpected runtime error'; return; endmon; if Error.HasError; dsply 'PASS Error.HasError'; else; dsply 'FAIL Error.HasError'; endif; if Error.MessageID = 'MDF2001'; dsply 'PASS Error.MessageID'; else; dsply 'FAIL Error.MessageID'; endif; if %trim(Error.MessageData) = ''; dsply 'PASS Error.MessageData'; else; dsply 'FAIL Error.MessageData'; endif; end-proc; //===================================================================== // // TestInvalidDevice // //===================================================================== dcl-proc TestInvalidDevice; dcl-ds Header likeds(MD_Tape0200Header_T) inz; dcl-ds Device likeds(MD_Tape0200DeviceDefinition_T) inz; dsply '----------------------------------------'; dsply 'Test: Invalid TAPE0200 device definition'; dsply '----------------------------------------'; clear ReceiverBuffer; clear MediaDefinition; clear Error; clear Header; clear Device; Header.MaximumParallelDeviceResources = 0; Header.MinimumParallelDeviceResources = 0; Header.OffsetToFirstDeviceDefinition = %size(Header); Header.NumberOfDeviceDefinitions = 1; Header.LengthOfHeader = %size(Header); Header.DeviceAllocation = MD_DeviceAllocateAll; Header.SaveFormat = MD_SaveFormatSerial; Device.OffsetToNextDeviceDefinition = 0; Device.DeviceName = 'TAPMLBBRMS'; Device.OffsetToFirstMediaFileDefinition = %size(Device); Device.NumberOfMediaFileDefinitions = 1; Device.LengthOfDeviceDefinition = 0; %subst( ReceiverBuffer : 1 : %size(Header)) = Header; %subst( ReceiverBuffer : %size(Header) + 1 : %size(Device)) = Device; ReceiverLength = %size(Header) + %size(Device); monitor; MD_ParseRetrieveBuffer( ReceiverBuffer : ReceiverLength : MediaDefinition : Error); on-error; dsply 'FAIL Unexpected runtime error'; return; endmon; if Error.HasError; dsply 'PASS Error.HasError'; else; dsply 'FAIL Error.HasError'; endif; if Error.MessageID = 'MDF2002'; dsply 'PASS Error.MessageID'; else; dsply 'FAIL Error.MessageID'; endif; if %trim(Error.MessageData) = ''; dsply 'PASS Error.MessageData'; else; dsply 'FAIL Error.MessageData'; endif; end-proc; //===================================================================== // // TestInvalidMediaFile // //===================================================================== dcl-proc TestInvalidMediaFile; dcl-ds Header likeds(MD_Tape0200Header_T) inz; dcl-ds Device likeds(MD_Tape0200DeviceDefinition_T) inz; dcl-ds MediaFile likeds(MD_Tape0200MediaFileDefinition_T) inz; dsply '----------------------------------------'; dsply 'Test: Invalid TAPE0200 media file definition'; dsply '----------------------------------------'; clear ReceiverBuffer; clear MediaDefinition; clear Error; clear Header; clear Device; clear MediaFile; Header.MaximumParallelDeviceResources = 0; Header.MinimumParallelDeviceResources = 0; Header.OffsetToFirstDeviceDefinition = %size(Header); Header.NumberOfDeviceDefinitions = 1; Header.LengthOfHeader = %size(Header); Header.DeviceAllocation = MD_DeviceAllocateAll; Header.SaveFormat = MD_SaveFormatSerial; Device.OffsetToNextDeviceDefinition = 0; Device.DeviceName = 'TAPMLBBRMS'; Device.OffsetToFirstMediaFileDefinition = %size(Device); Device.NumberOfMediaFileDefinitions = 1; Device.LengthOfDeviceDefinition = %size(Device); MediaFile.OffsetToNextMediaFileDefinition = 0; MediaFile.SequenceNumber = 1; MediaFile.NumberOfVolumeIdentifiers = 0; MediaFile.OffsetToVolumeIdentifierArray = 0; MediaFile.LengthOfVolumeIdentifier = 0; MediaFile.StartingVolumeArrayElement = 0; // Deliberately invalid. MediaFile.LengthOfMediaFileDefinition = 0; %subst( ReceiverBuffer : 1 : %size(Header)) = Header; %subst( ReceiverBuffer : %size(Header) + 1 : %size(Device)) = Device; %subst( ReceiverBuffer : %size(Header) + %size(Device) + 1 : %size(MediaFile)) = MediaFile; ReceiverLength = %size(Header) + %size(Device) + %size(MediaFile); monitor; MD_ParseRetrieveBuffer( ReceiverBuffer : ReceiverLength : MediaDefinition : Error); on-error; dsply 'FAIL Unexpected runtime error'; return; endmon; if Error.HasError; dsply 'PASS Error.HasError'; else; dsply 'FAIL Error.HasError'; endif; if Error.MessageID = 'MDF2003'; dsply 'PASS Error.MessageID'; else; dsply 'FAIL Error.MessageID'; endif; if %trim(Error.MessageData) = ''; dsply 'PASS Error.MessageData'; else; dsply 'FAIL Error.MessageData'; endif; end-proc; //===================================================================== // // TestInvalidVolumeArray // // Tests parser handling of an invalid volume identifier array. // // The receiver contains a valid header, device definition and media // file definition. The media file contains one volume identifier, but // LengthOfVolumeIdentifier is deliberately set to 5 instead of 6. // // Expected error: // // MDF2004 - Invalid volume identifier array // //===================================================================== dcl-proc TestInvalidVolumeArray; dcl-ds Header likeds(MD_Tape0200Header_T) inz; dcl-ds Device likeds(MD_Tape0200DeviceDefinition_T) inz; dcl-ds MediaFile likeds(MD_Tape0200MediaFileDefinition_T) inz; dsply '----------------------------------------'; dsply 'Test: Invalid TAPE0200 volume identifier array'; dsply '----------------------------------------'; clear ReceiverBuffer; clear MediaDefinition; clear Error; clear Header; clear Device; clear MediaFile; //=============================================================== // Header //=============================================================== Header.MaximumParallelDeviceResources = 0; Header.MinimumParallelDeviceResources = 0; Header.OffsetToFirstDeviceDefinition = %size(Header); Header.NumberOfDeviceDefinitions = 1; Header.LengthOfHeader = %size(Header); Header.DeviceAllocation = MD_DeviceAllocateAll; Header.SaveFormat = MD_SaveFormatSerial; //=============================================================== // Device //=============================================================== Device.OffsetToNextDeviceDefinition = 0; Device.DeviceName = 'TAPMLBBRMS'; Device.OffsetToFirstMediaFileDefinition = %size(Device); Device.NumberOfMediaFileDefinitions = 1; Device.LengthOfDeviceDefinition = %size(Device); //=============================================================== // Media file //=============================================================== MediaFile.OffsetToNextMediaFileDefinition = 0; MediaFile.SequenceNumber = 1; MediaFile.NumberOfVolumeIdentifiers = 1; MediaFile.OffsetToVolumeIdentifierArray = %size(Header) + %size(Device) + %size(MediaFile); // Deliberately invalid: expected 6. MediaFile.LengthOfVolumeIdentifier = 5; MediaFile.StartingVolumeArrayElement = 1; MediaFile.LengthOfMediaFileDefinition = %size(MediaFile); //=============================================================== // Build receiver buffer //=============================================================== %subst( ReceiverBuffer : 1 : %size(Header)) = Header; %subst( ReceiverBuffer : %size(Header) + 1 : %size(Device)) = Device; %subst( ReceiverBuffer : %size(Header) + %size(Device) + 1 : %size(MediaFile)) = MediaFile; ReceiverLength = %size(Header) + %size(Device) + %size(MediaFile); //=============================================================== // Execute parser //=============================================================== monitor; MD_ParseRetrieveBuffer( ReceiverBuffer : ReceiverLength : MediaDefinition : Error); on-error; dsply 'FAIL Unexpected runtime error'; return; endmon; //=============================================================== // Result //=============================================================== if Error.HasError; dsply 'PASS Error.HasError'; else; dsply 'FAIL Error.HasError'; endif; if Error.MessageID = 'MDF2004'; dsply 'PASS Error.MessageID'; else; dsply 'FAIL Error.MessageID'; endif; if %trim(Error.MessageData) = ''; dsply 'PASS Error.MessageData'; else; dsply 'FAIL Error.MessageData'; endif; end-proc;