603 lines
12 KiB
RPGLE
603 lines
12 KiB
RPGLE
**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; |