Neue testfälle für TAPE0200

This commit is contained in:
2026-09-15 13:40:52 +02:00
parent f075081ec5
commit 44f14e3e98
3 changed files with 394 additions and 84 deletions
+309 -27
View File
@@ -31,6 +31,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr; end-pr;
@@ -47,6 +50,8 @@ end-pr;
// - Media File Definitions // - Media File Definitions
// - Volume Identifier Arrays // - Volume Identifier Arrays
// //
// Parser errors are returned in Error.
//
//===================================================================== //=====================================================================
dcl-proc MD_ParseRetrieveBuffer export; dcl-proc MD_ParseRetrieveBuffer export;
@@ -60,6 +65,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pi; end-pi;
@@ -81,6 +89,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
// Working variables // Working variables
//================================================================== //==================================================================
dcl-s ReceiverLength
int(10);
dcl-s DeviceOffset dcl-s DeviceOffset
int(10); int(10);
@@ -99,12 +110,32 @@ dcl-proc MD_ParseRetrieveBuffer export;
dcl-s VolumeIndex dcl-s VolumeIndex
int(10); int(10);
dcl-s RequiredLength
int(10);
//================================================================== //==================================================================
// Initialize result // Initialize
//================================================================== //==================================================================
clear MediaDefinition; clear MediaDefinition;
clear Error;
ReceiverLength = %len(ReceiverBuffer);
//==================================================================
// Receiver buffer
//==================================================================
if ReceiverLength < %size(Header);
Error.HasError = *on;
Error.MessageID = 'MDF2005';
Error.MessageData = *blanks;
return;
endif;
//================================================================== //==================================================================
@@ -118,6 +149,80 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(Header)); %size(Header));
//==================================================================
// Validate Header
//==================================================================
if Header.LengthOfHeader <> %size(Header);
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.NumberOfDeviceDefinitions < 1
or Header.NumberOfDeviceDefinitions > MD_MaxDeviceDefinitions;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.OffsetToFirstDeviceDefinition < %size(Header)
or Header.OffsetToFirstDeviceDefinition >
ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.DeviceAllocation <> MD_DeviceAllocateAll
and Header.DeviceAllocation <> MD_DeviceAllocateOne
and Header.DeviceAllocation <> MD_DeviceAllocateMinimum;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.SaveFormat <> MD_SaveFormatAuto
and Header.SaveFormat <> MD_SaveFormatSerial
and Header.SaveFormat <> MD_SaveFormatParallel;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.MaximumParallelDeviceResources < 0
or Header.MinimumParallelDeviceResources < 0
or Header.MinimumParallelDeviceResources >
Header.MaximumParallelDeviceResources;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
//================================================================== //==================================================================
// Header -> Media Definition // Header -> Media Definition
//================================================================== //==================================================================
@@ -150,9 +255,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
to Header.NumberOfDeviceDefinitions; to Header.NumberOfDeviceDefinitions;
//--------------------------------------------------------------- //===============================================================
// Validate Device Offset
//===============================================================
if DeviceOffset < 0
or DeviceOffset > ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
//===============================================================
// Read Device Definition // Read Device Definition
//--------------------------------------------------------------- //===============================================================
Device = Device =
%subst( %subst(
@@ -161,9 +281,54 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(Device)); %size(Device));
//--------------------------------------------------------------- //===============================================================
// Validate Device Definition
//===============================================================
if Device.LengthOfDeviceDefinition <> %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if Device.NumberOfMediaFileDefinitions < 1
or Device.NumberOfMediaFileDefinitions > MD_MaxMediaDefinitions;
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if %trim(Device.DeviceName) = '';
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if Device.OffsetToFirstMediaFileDefinition < %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
//===============================================================
// Device -> Media Definition // Device -> Media Definition
//--------------------------------------------------------------- //===============================================================
MediaDefinition.Device(DeviceIndex).DeviceName = MediaDefinition.Device(DeviceIndex).DeviceName =
Device.DeviceName; Device.DeviceName;
@@ -172,14 +337,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
Device.NumberOfMediaFileDefinitions; Device.NumberOfMediaFileDefinitions;
//--------------------------------------------------------------- //===============================================================
// Media Files // Media Files
//--------------------------------------------------------------- //===============================================================
if Device.NumberOfMediaFileDefinitions > 0;
// OffsetToFirstMediaFileDefinition is relative
// to the Device Definition.
MediaOffset = MediaOffset =
DeviceOffset DeviceOffset
@@ -190,9 +350,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
to Device.NumberOfMediaFileDefinitions; to Device.NumberOfMediaFileDefinitions;
//---------------------------------------------------------- //============================================================
// Validate Media Offset
//============================================================
if MediaOffset < 0
or MediaOffset > ReceiverLength - %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
//============================================================
// Read Media File Definition // Read Media File Definition
//---------------------------------------------------------- //============================================================
MediaFile = MediaFile =
%subst( %subst(
@@ -201,9 +376,79 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(MediaFile)); %size(MediaFile));
//---------------------------------------------------------- //============================================================
// Validate Media File Definition
//============================================================
if MediaFile.LengthOfMediaFileDefinition <> %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
if MediaFile.NumberOfVolumeIdentifiers < 0
or MediaFile.NumberOfVolumeIdentifiers > MD_MaxVolumeIdentifiers;
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
if MediaFile.NumberOfVolumeIdentifiers = 0;
if MediaFile.OffsetToVolumeIdentifierArray <> 0
or MediaFile.LengthOfVolumeIdentifier <> 0
or MediaFile.StartingVolumeArrayElement <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
else;
if MediaFile.OffsetToVolumeIdentifierArray <= 0
or MediaFile.LengthOfVolumeIdentifier <> MD_VOLUME_ID_LENGTH
or MediaFile.StartingVolumeArrayElement < 1;
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
RequiredLength =
MediaFile.NumberOfVolumeIdentifiers
* MediaFile.LengthOfVolumeIdentifier;
if MediaFile.OffsetToVolumeIdentifierArray >
ReceiverLength - RequiredLength
or MediaFile.OffsetToVolumeIdentifierArray <
MediaOffset + %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
endif;
//============================================================
// Media File -> Media Definition // Media File -> Media Definition
//---------------------------------------------------------- //============================================================
MediaDefinition.Device(DeviceIndex) MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex) .MediaFile(MediaIndex)
@@ -223,9 +468,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
MediaFile.NumberOfVolumeIdentifiers; MediaFile.NumberOfVolumeIdentifiers;
//---------------------------------------------------------- //============================================================
// Volume Identifier Array // Volume Identifier Array
//---------------------------------------------------------- //============================================================
if MediaFile.NumberOfVolumeIdentifiers > 0; if MediaFile.NumberOfVolumeIdentifiers > 0;
@@ -236,7 +481,6 @@ dcl-proc MD_ParseRetrieveBuffer export;
for VolumeIndex = 1 for VolumeIndex = 1
to MediaFile.NumberOfVolumeIdentifiers; to MediaFile.NumberOfVolumeIdentifiers;
MediaDefinition.Device(DeviceIndex) MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex) .MediaFile(MediaIndex)
.VolumeIdentifier(VolumeIndex) .VolumeIdentifier(VolumeIndex)
@@ -249,24 +493,42 @@ dcl-proc MD_ParseRetrieveBuffer export;
+ 1 : + 1 :
MediaFile.LengthOfVolumeIdentifier); MediaFile.LengthOfVolumeIdentifier);
endfor; endfor;
endif; endif;
//---------------------------------------------------------- //============================================================
// Next Media File // Next Media File
//---------------------------------------------------------- //============================================================
if MediaIndex if MediaIndex
< Device.NumberOfMediaFileDefinitions; < Device.NumberOfMediaFileDefinitions;
if MediaFile.OffsetToNextMediaFileDefinition > 0; if MediaFile.OffsetToNextMediaFileDefinition <=
MediaOffset
or MediaFile.OffsetToNextMediaFileDefinition >
ReceiverLength - %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
MediaOffset = MediaOffset =
MediaFile.OffsetToNextMediaFileDefinition; MediaFile.OffsetToNextMediaFileDefinition;
else;
if MediaFile.OffsetToNextMediaFileDefinition <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif; endif;
endif; endif;
@@ -274,18 +536,39 @@ dcl-proc MD_ParseRetrieveBuffer export;
endfor; endfor;
endif;
//================================================================ //================================================================
// Next Device // Next Device
//================================================================ //================================================================
if Device.OffsetToNextDeviceDefinition > 0; if DeviceIndex < Header.NumberOfDeviceDefinitions;
if Device.OffsetToNextDeviceDefinition <=
DeviceOffset
or Device.OffsetToNextDeviceDefinition >
ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
DeviceOffset = DeviceOffset =
Device.OffsetToNextDeviceDefinition; Device.OffsetToNextDeviceDefinition;
else;
if Device.OffsetToNextDeviceDefinition <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
endif; endif;
@@ -293,4 +576,3 @@ dcl-proc MD_ParseRetrieveBuffer export;
end-proc; end-proc;
+15 -1
View File
@@ -68,6 +68,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr; end-pr;
@@ -555,7 +558,18 @@ dcl-proc MD_RetrieveMediaDefinition export;
MD_ParseRetrieveBuffer( MD_ParseRetrieveBuffer(
Receiver.Data : Receiver.Data :
MediaDefinition); MediaDefinition :
Error);
if Error.HasError;
MD_SendEscape(
Error.MessageID :
Error.MessageData);
return;
endif;
end-proc; end-proc;
+14
View File
@@ -76,6 +76,20 @@ dsply '----------------------------------------';
dsply 'MEDDFN Error Test completed'; dsply 'MEDDFN Error Test completed';
dsply '----------------------------------------'; dsply '----------------------------------------';
//=====================================================================
// End
//=====================================================================
*inlr = *on;
return;
//=====================================================================
//
// TestCreateValidation
//
//=====================================================================
//===================================================================== //=====================================================================
// //