feat: add benchmark-programs — 58 telecom COBOL test programs

作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
NB-076
2026-06-25 09:53:21 +08:00
parent 50f9f0f52f
commit 94400d50d4
278 changed files with 44125 additions and 0 deletions
@@ -0,0 +1,25 @@
# 14-online-cics — CICS Online Simulation
## 电信业务场景
在线客户照会(CICS模拟)。通过CALL/LINKAGE机制模拟CICS在线交易,客户服务人员可通过屏幕查询客户基本信息。
## Purpose
Simulates CICS transaction processing patterns using CALL/LINKAGE instead of EXEC CICS.
## Architecture
- **main-14-online-cics.cbl** — CICS simulation program (receives COMMAREA via CALL USING)
- **test-cics-driver.cbl** — Test driver that builds COMMAREAs and invokes the program
## Test Coverage
1. **INQY (Inquiry)** — COMMAREA receive, MAP file read, result output
2. **UPDT (Update)** — Process update function
3. **DEL (Delete)** — Process delete function
4. **UNKNOWN function** — Error handling for unrecognized function codes
## Key Techniques
- LINKAGE SECTION with CALL USING parameter passing
- COMMAREA simulation via 01-level structure
- MAPSEND/MAPRECV simulation via file I/O
- EVALUATE for function dispatch
- GOBACK to return to caller
@@ -0,0 +1,967 @@
*> ============================================================
*> 14-online-cics : 客户在线照会 (Online Inquiry)
*> Input : MAP-FILE (map-data.dat: 模拟CICS MAP入出力)
*> Output: OUTPUT-FILE (cics-output.txt: 照会结果出力)
*> TXN-AUDIT-FILE (txn-audit.log: 取引監査記録)
*> Coverage: OL-N001~N004, OL-A001, OL-R001
*> MAP building, audit logging, response time,
*> error severity handling
*> ============================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. Main14OnlineCics.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MAP-FILE ASSIGN TO "map-data.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-MAP-FILE-STATUS.
SELECT OUTPUT-FILE ASSIGN TO "cics-output.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-OUT-FILE-STATUS.
*> Additional files for expanded processing
SELECT TXN-AUDIT-FILE ASSIGN TO "txn-audit.log"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-AUD-FILE-STATUS.
SELECT TXN-REPORT ASSIGN TO "txn-report.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-RPT-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD MAP-FILE.
01 MAP-RECORD PIC X(80).
FD OUTPUT-FILE.
01 OUTPUT-LINE PIC X(80).
FD TXN-AUDIT-FILE.
01 AUDIT-RECORD PIC X(100).
FD TXN-REPORT.
01 REPORT-LINE PIC X(100).
WORKING-STORAGE SECTION.
*> ===== PRESERVED ORIGINAL ITEMS =====
01 WS-TELECOM-REC.
COPY "telecom/TEL-INVOICE.cpy".
*> Simulated COMMAREA structure
01 WS-COMMAREA.
05 WS-CA-USERID PIC X(08).
05 WS-CA-FUNCTION PIC X(04).
05 WS-CA-INPUT-DATA PIC X(40).
05 WS-CA-RETURN-CODE PIC 9(02).
05 WS-CA-MESSAGE PIC X(40).
01 WS-COUNTERS.
05 WS-READS PIC 9(02) VALUE 0.
05 WS-WRITES PIC 9(02) VALUE 0.
01 WS-MAP-LINE PIC X(80).
01 WS-MAP-EOF PIC X(01) VALUE "N".
88 MAP-EOF VALUE "Y".
01 WS-RESPONSE.
05 WS-RESP-TEXT PIC X(60).
01 WS-INVOICE-REC.
COPY "telecom/TEL-INVOICE.cpy".
*> ===== END PRESERVED ORIGINAL ITEMS =====
*> ===== NEW ITEMS =====
*> Timestamp tracing
01 WS-TIMESTAMP.
05 WS-TS-YEAR PIC 9(04).
05 WS-TS-MONTH PIC 9(02).
05 WS-TS-DAY PIC 9(02).
05 WS-TS-HOUR PIC 9(02).
05 WS-TS-MINUTE PIC 9(02).
05 WS-TS-SECOND PIC 9(02).
05 WS-TS-MS PIC 9(02).
01 WS-TIMESTAMP-STR PIC X(26).
01 WS-TRACE-PREFIX PIC X(40).
*> File status fields (additional)
01 WS-MAP-FILE-STATUS PIC X(02).
01 WS-OUT-FILE-STATUS PIC X(02).
01 WS-AUD-FILE-STATUS PIC X(02).
01 WS-RPT-FILE-STATUS PIC X(02).
*> Session state management
01 WS-SESSION-STATE.
05 WS-SESS-USERID PIC X(08).
05 WS-SESS-STATUS PIC X(01).
88 WS-SESS-ACTIVE VALUE 'A'.
88 WS-SESS-LOCKED VALUE 'L'.
88 WS-SESS-TERMINATED VALUE 'T'.
05 WS-SESS-LOGIN-TIME PIC X(20).
05 WS-SESS-TXN-COUNT PIC 9(04) VALUE ZERO.
05 WS-SESS-LAST-FUNC PIC X(04).
05 WS-SESS-ERRORS PIC 9(03) VALUE ZERO.
*> Response time tracking
01 WS-RESPONSE-TIME.
05 WS-RT-START-M PIC 9(08).
05 WS-RT-START-S PIC 9(08).
05 WS-RT-END-M PIC 9(08).
05 WS-RT-END-S PIC 9(08).
05 WS-RT-ELAPSED PIC S9(08).
05 WS-RT-DISP PIC Z(9)9.
*> Map building fields (simulated CICS BMS)
01 WS-MAP-BUILD.
05 WS-MAP-MAPNAME PIC X(08).
05 WS-MAP-TITLE PIC X(40).
05 WS-MAP-BODY PIC X(80).
05 WS-MAP-MSG-LINE PIC X(40).
05 WS-MAP-CURSOR PIC 9(04).
05 WS-MAP-ATTR PIC X(01).
88 WS-MAP-PROT VALUE 'P'.
88 WS-MAP-UNPROT VALUE 'U'.
88 WS-MAP-BRIGHT VALUE 'B'.
05 WS-MAP-FIELD-TABLE.
10 WS-MAP-FLD OCCURS 5 TIMES.
15 WS-MAP-FLD-NAME PIC X(10).
15 WS-MAP-FLD-VALUE PIC X(20).
15 WS-MAP-FLD-ATTR PIC X(01).
*> Transaction history (in-memory log)
01 WS-TXN-HISTORY.
05 WS-TXN-COUNT PIC 9(02) VALUE ZERO.
05 WS-TXN-TABLE.
10 WS-TXN-ENTRY OCCURS 20 TIMES.
15 WS-TXN-FUNC PIC X(04).
15 WS-TXN-USER PIC X(08).
15 WS-TXN-TIME PIC X(20).
15 WS-TXN-RC PIC 9(02).
*> Error severity and handling
01 WS-ERR-SEVERITY PIC 9(01).
88 WS-ERR-INFO VALUE 0.
88 WS-ERR-WARN VALUE 1.
88 WS-ERR-ERROR VALUE 2.
88 WS-ERR-FATAL VALUE 3.
01 WS-ERR-MSG PIC X(60).
01 WS-ERR-COUNT PIC 9(04) VALUE ZERO.
01 WS-ERR-RESP-CODE PIC X(04).
01 WS-ERR-RESP-MSG PIC X(40).
*> Hash totals
01 WS-HASH-TOTAL.
05 WS-HASH-TXN-COUNT PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-MAP PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-INQY PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-UPDT PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-DEL PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-ADDN PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-CANC PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-SUSP PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-BILL PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-DISP PIC 9(09) VALUE ZERO.
05 WS-HASH-FUNC-OTHER PIC 9(09) VALUE ZERO.
05 WS-HASH-ERROR-COUNT PIC 9(09) VALUE ZERO.
05 WS-HASH-CHECKSUM PIC 9(15) VALUE ZERO.
*> Audit fields
01 WS-AUDIT-ENTRIES PIC 9(04) VALUE ZERO.
01 WS-AUDIT-LINE PIC X(100).
*> Report fields
01 WS-RPT-DATE PIC X(10).
01 WS-RPT-TIME PIC X(08).
*> Separator lines
01 WS-SEP-STARS PIC X(100) VALUE ALL '*'.
01 WS-SEP-DASHES PIC X(100) VALUE ALL '-'.
01 WS-SEP-EQUALS PIC X(100) VALUE ALL '='.
*> Edited numeric fields
01 WS-ED-COUNT PIC Z(9)9.
01 WS-ED-TOTAL PIC Z(9)9.
01 WS-ED-TIME PIC Z(9)9.
*> Billing data (for BILL transaction)
01 WS-BILL-DATA.
05 WS-BD-INV-ID PIC X(10).
05 WS-BD-AMOUNT PIC 9(09).
05 WS-BD-STATUS PIC X(01).
05 WS-BD-MONTH PIC 9(06).
05 WS-BD-BALANCE PIC 9(09).
*> Configuration constants
01 WS-CONFIG-MAX-ERRORS PIC 9(03) VALUE 50.
01 WS-CONFIG-MAX-TXNS PIC 9(02) VALUE 20.
*> ============================================================
*> LINKAGE SECTION removed — LK-COMMAREA replaced by WS-COMMAREA
PROCEDURE DIVISION.
MAIN SECTION.
MB-PROCESS.
PERFORM 1000-INIT
PERFORM 2000-OPEN-FILES
PERFORM 3000-PROCESS
PERFORM 4000-REPORT
PERFORM 5000-AUDIT
PERFORM 6000-ERROR-HANDLE
PERFORM 9000-EXIT
GOBACK.
1000-INIT SECTION.
*>
DISPLAY "Main14OnlineCics: Initializing...".
MOVE FUNCTION CURRENT-DATE TO WS-TIMESTAMP.
STRING WS-TS-YEAR '-' WS-TS-MONTH '-'
WS-TS-DAY ' ' WS-TS-HOUR ':'
WS-TS-MINUTE ':' WS-TS-SECOND
INTO WS-TIMESTAMP-STR.
DISPLAY "Main14OnlineCics: Start time=" WS-TIMESTAMP-STR.
*>
*> Initialize session state
MOVE SPACES TO WS-SESSION-STATE.
MOVE 'A' TO WS-SESS-STATUS.
MOVE WS-TIMESTAMP-STR TO WS-SESS-LOGIN-TIME.
MOVE ZERO TO WS-SESS-TXN-COUNT.
MOVE ZERO TO WS-SESS-ERRORS.
*>
*> Initialize hash totals
MOVE ZERO TO WS-HASH-TOTAL.
MOVE ZERO TO WS-ERR-COUNT.
MOVE ZERO TO WS-AUDIT-ENTRIES.
*>
*> Initialize response time
MOVE ZERO TO WS-RESPONSE-TIME.
*>
*> Initialize transaction history
MOVE ZERO TO WS-TXN-COUNT.
*>
*> Build date/time for reports
MOVE WS-TS-YEAR TO WS-RPT-DATE(1:4).
MOVE '-' TO WS-RPT-DATE(5:1).
MOVE WS-TS-MONTH TO WS-RPT-DATE(6:2).
MOVE '-' TO WS-RPT-DATE(8:1).
MOVE WS-TS-DAY TO WS-RPT-DATE(9:2).
STRING WS-TS-HOUR ':' WS-TS-MINUTE ':'
WS-TS-SECOND INTO WS-RPT-TIME.
*>
DISPLAY "Main14OnlineCics: INIT complete. Session="
WS-SESS-USERID " Status=" WS-SESS-STATUS.
*>
2000-OPEN-FILES SECTION.
*>
DISPLAY "Main14OnlineCics: Opening files...".
*>
OPEN INPUT MAP-FILE.
IF WS-MAP-FILE-STATUS NOT = '00'
MOVE 2 TO WS-ERR-SEVERITY
STRING "WARN: MAP-FILE open status="
WS-MAP-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
END-IF.
*>
OPEN EXTEND OUTPUT-FILE.
IF WS-OUT-FILE-STATUS NOT = '00'
OPEN OUTPUT OUTPUT-FILE
IF WS-OUT-FILE-STATUS NOT = '00'
MOVE 3 TO WS-ERR-SEVERITY
STRING "ERROR: OUTPUT-FILE open status="
WS-OUT-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
PERFORM 6000-ERROR-HANDLE
END-IF
END-IF.
*>
OPEN EXTEND TXN-AUDIT-FILE.
IF WS-AUD-FILE-STATUS NOT = '00'
OPEN OUTPUT TXN-AUDIT-FILE
IF WS-AUD-FILE-STATUS NOT = '00'
MOVE 1 TO WS-ERR-SEVERITY
STRING "WARN: TXN-AUDIT open status="
WS-AUD-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
END-IF
END-IF.
*>
OPEN OUTPUT TXN-REPORT.
IF WS-RPT-FILE-STATUS NOT = '00'
MOVE 1 TO WS-ERR-SEVERITY
STRING "WARN: TXN-REPORT open status="
WS-RPT-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
END-IF.
*>
DISPLAY "Main14OnlineCics: Files opened."
" MAP=" WS-MAP-FILE-STATUS
" OUT=" WS-OUT-FILE-STATUS
" AUD=" WS-AUD-FILE-STATUS.
*>
3000-PROCESS SECTION.
*>
DISPLAY "Main14OnlineCics: Processing COMMAREA...".
*>
*> Capture response time start (seconds portion)
MOVE WS-TS-SECOND TO WS-RT-START-S.
MOVE WS-TS-MS TO WS-RT-START-M.
*>
*> ============================================================
*> === PRESERVED ORIGINAL CODE ===
*> ============================================================
DISPLAY "=== CICS Online Simulation ===".
DISPLAY "COMMAREA received:".
*>
*> LK data removed — using WS-COMMAREA directly
*>
DISPLAY " UserID: " WS-CA-USERID.
DISPLAY " Function: " WS-CA-FUNCTION.
DISPLAY " Input: " WS-CA-INPUT-DATA.
*>
*> Simulate MAPRECV: read from map file
OPEN INPUT MAP-FILE.
IF WS-MAP-FILE-STATUS NOT = '00'
MOVE 2 TO WS-ERR-SEVERITY
STRING "WARN: MAP-FILE reopen status="
WS-MAP-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
END-IF.
*>
PERFORM UNTIL MAP-EOF
READ MAP-FILE INTO WS-MAP-LINE
AT END
SET MAP-EOF TO TRUE
NOT AT END
DISPLAY " MAP RECV: " WS-MAP-LINE
ADD 1 TO WS-READS
END-READ
END-PERFORM.
CLOSE MAP-FILE.
IF WS-MAP-FILE-STATUS NOT = '00'
MOVE 1 TO WS-ERR-SEVERITY
STRING "INFO: MAP-FILE close status="
WS-MAP-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
END-IF.
*>
*> Update session state with current user
MOVE WS-CA-USERID TO WS-SESS-USERID.
ADD 1 TO WS-SESS-TXN-COUNT.
MOVE WS-CA-FUNCTION TO WS-SESS-LAST-FUNC.
*>
*> Validate COMMAREA before processing
PERFORM 3100-VALIDATE-COMMAREA.
*>
*> Process based on function code
*> --- PRESERVED ORIGINAL EVALUATE with added transactions ---
EVALUATE WS-CA-FUNCTION
WHEN "INQY"
MOVE "INQUIRY processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-INQY
WHEN "UPDT"
MOVE "UPDATE processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-UPDT
WHEN "DEL "
MOVE "DELETE processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-DEL
*> === NEW TRANSACTION CODES ===
WHEN "ADDN"
MOVE "ADDN processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-ADDN
PERFORM 3200-PROCESS-TRANSACTION
WHEN "CANC"
MOVE "CANC processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-CANC
PERFORM 3200-PROCESS-TRANSACTION
WHEN "SUSP"
MOVE "SUSP processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-SUSP
PERFORM 3200-PROCESS-TRANSACTION
WHEN "BILL"
MOVE "BILL processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-BILL
PERFORM 3200-PROCESS-TRANSACTION
WHEN "DISP"
MOVE "DISP processed" TO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-DISP
PERFORM 3200-PROCESS-TRANSACTION
WHEN OTHER
MOVE "UNKNOWN function" TO WS-CA-MESSAGE
MOVE 99 TO WS-CA-RETURN-CODE
ADD 1 TO WS-HASH-FUNC-OTHER
END-EVALUATE.
*>
*> Build map and format response for all transactions
PERFORM 3300-BUILD-MAP.
PERFORM 3400-FORMAT-RESPONSE.
*>
*> Simulate MAPSEND: write to output file
*> === PRESERVED ORIGINAL OUTPUT CODE ===
OPEN OUTPUT OUTPUT-FILE.
IF WS-OUT-FILE-STATUS NOT = '00'
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: OUTPUT-FILE reopen status="
WS-OUT-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
END-IF.
*>
MOVE SPACES TO OUTPUT-LINE.
STRING "USER=" WS-CA-USERID
" FUNC=" WS-CA-FUNCTION
" RC=" WS-CA-RETURN-CODE
" MSG=" WS-CA-MESSAGE
DELIMITED BY SIZE INTO OUTPUT-LINE.
WRITE OUTPUT-LINE.
ADD 1 TO WS-WRITES.
*>
MOVE SPACES TO OUTPUT-LINE.
STRING "MAPSEND: Received " WS-READS
" map lines, sent " WS-WRITES " responses"
DELIMITED BY SIZE INTO OUTPUT-LINE.
WRITE OUTPUT-LINE.
CLOSE OUTPUT-FILE.
IF WS-OUT-FILE-STATUS NOT = '00'
MOVE 1 TO WS-ERR-SEVERITY
STRING "INFO: OUTPUT-FILE close status="
WS-OUT-FILE-STATUS INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
END-IF.
*>
*> Set return values in LINKAGE
*> Return values already in WS-COMMAREA
*>
DISPLAY " Return-Code: " WS-CA-RETURN-CODE.
DISPLAY " Message: " WS-CA-MESSAGE.
DISPLAY "Output written to cics-output.txt".
*> === END PRESERVED ORIGINAL CODE ===
*>
*> Update transaction history
IF WS-TXN-COUNT < WS-CONFIG-MAX-TXNS
ADD 1 TO WS-TXN-COUNT
MOVE WS-CA-FUNCTION TO WS-TXN-FUNC(WS-TXN-COUNT)
MOVE WS-CA-USERID TO WS-TXN-USER(WS-TXN-COUNT)
MOVE WS-TIMESTAMP-STR TO WS-TXN-TIME(WS-TXN-COUNT)
MOVE WS-CA-RETURN-CODE TO WS-TXN-RC(WS-TXN-COUNT)
END-IF.
*>
*> Update hash totals
ADD 1 TO WS-HASH-TXN-COUNT.
ADD WS-READS TO WS-HASH-CHECKSUM.
ADD WS-WRITES TO WS-HASH-CHECKSUM.
*>
EXIT.
*>
3100-VALIDATE-COMMAREA SECTION.
*>
DISPLAY "Main14OnlineCics: Validating COMMAREA...".
*>
*> Validate user ID
IF WS-CA-USERID = SPACES OR WS-CA-USERID = LOW-VALUES
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: Invalid UserID [" WS-CA-USERID "]"
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
ADD 1 TO WS-SESS-ERRORS
END-IF.
*>
*> Validate function code length/content
IF WS-CA-FUNCTION = SPACES OR WS-CA-FUNCTION = LOW-VALUES
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: Empty function code" INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
ADD 1 TO WS-SESS-ERRORS
END-IF.
*>
*> Check session state
IF WS-SESS-LOCKED
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: Session locked for " WS-SESS-USERID
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
MOVE 99 TO WS-CA-RETURN-CODE
MOVE "Session locked" TO WS-CA-MESSAGE
PERFORM 6000-ERROR-HANDLE
END-IF.
IF WS-SESS-TERMINATED
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: Session terminated for " WS-SESS-USERID
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
MOVE 99 TO WS-CA-RETURN-CODE
MOVE "Session terminated" TO WS-CA-MESSAGE
PERFORM 6000-ERROR-HANDLE
END-IF.
*>
*> Check for excessive errors
IF WS-SESS-ERRORS > WS-CONFIG-MAX-ERRORS
MOVE 'L' TO WS-SESS-STATUS
MOVE 2 TO WS-ERR-SEVERITY
STRING "ERROR: Too many errors, session locked"
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
MOVE 99 TO WS-CA-RETURN-CODE
MOVE "Session locked" TO WS-CA-MESSAGE
END-IF.
*>
DISPLAY "Main14OnlineCics: COMMAREA validated."
" User=" WS-CA-USERID " Func=" WS-CA-FUNCTION.
*>
3200-PROCESS-TRANSACTION SECTION.
*>
DISPLAY "Main14OnlineCics: Processing transaction..."
WS-CA-FUNCTION.
*>
*> Route to specific transaction processing
EVALUATE WS-CA-FUNCTION
WHEN "ADDN"
PERFORM 3210-PROCESS-ADDN
WHEN "CANC"
PERFORM 3220-PROCESS-CANC
WHEN "SUSP"
PERFORM 3230-PROCESS-SUSP
WHEN "BILL"
PERFORM 3240-PROCESS-BILL
WHEN "DISP"
PERFORM 3250-PROCESS-DISP
WHEN OTHER
CONTINUE
END-EVALUATE.
*>
3210-PROCESS-ADDN SECTION.
*>
*> Add new invoice/record processing
DISPLAY "Main14OnlineCics: ADDN - Adding new record...".
IF WS-CA-INPUT-DATA = SPACES
MOVE 1 TO WS-ERR-SEVERITY
STRING "WARN: ADDN with empty input data"
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
MOVE "ADDN: no input data" TO WS-CA-MESSAGE
MOVE 01 TO WS-CA-RETURN-CODE
ELSE
STRING "ADDN: record added [" WS-CA-INPUT-DATA "]"
INTO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
END-IF.
*>
*> Build map fields for ADDN response
MOVE "ADDNMAP " TO WS-MAP-MAPNAME.
MOVE "ADD NEW RECORD" TO WS-MAP-TITLE.
MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY.
MOVE "ADD processing OK" TO WS-MAP-MSG-LINE.
*>
3220-PROCESS-CANC SECTION.
*>
*> Cancel transaction processing
DISPLAY "Main14OnlineCics: CANC - Cancelling...".
IF WS-CA-INPUT-DATA = SPACES
MOVE 1 TO WS-ERR-SEVERITY
STRING "WARN: CANC with empty input data"
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
MOVE "CANC: no input data" TO WS-CA-MESSAGE
MOVE 01 TO WS-CA-RETURN-CODE
ELSE
STRING "CANC: cancelled [" WS-CA-INPUT-DATA "]"
INTO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
END-IF.
*>
*> Build map fields for CANC response
MOVE "CANCMAP " TO WS-MAP-MAPNAME.
MOVE "CANCEL TRANSACTION" TO WS-MAP-TITLE.
MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY.
MOVE "CANCEL processing OK" TO WS-MAP-MSG-LINE.
*>
3230-PROCESS-SUSP SECTION.
*>
*> Suspend account processing
DISPLAY "Main14OnlineCics: SUSP - Suspending account...".
IF WS-CA-INPUT-DATA = SPACES
MOVE 1 TO WS-ERR-SEVERITY
STRING "WARN: SUSP with empty input data"
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
ADD 1 TO WS-ERR-COUNT
MOVE "SUSP: no input data" TO WS-CA-MESSAGE
MOVE 01 TO WS-CA-RETURN-CODE
ELSE
STRING "SUSP: account suspended [" WS-CA-INPUT-DATA "]"
INTO WS-CA-MESSAGE
MOVE 00 TO WS-CA-RETURN-CODE
MOVE 'L' TO WS-SESS-STATUS
END-IF.
*>
*> Build map fields for SUSP response
MOVE "SUSPMAP " TO WS-MAP-MAPNAME.
MOVE "SUSPEND ACCOUNT" TO WS-MAP-TITLE.
MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY.
MOVE "SUSPEND processing OK" TO WS-MAP-MSG-LINE.
*>
3240-PROCESS-BILL SECTION.
*>
*> Billing inquiry processing
DISPLAY "Main14OnlineCics: BILL - Billing inquiry...".
MOVE WS-CA-INPUT-DATA(1:10) TO WS-BD-INV-ID.
COMPUTE WS-BD-AMOUNT = FUNCTION RANDOM * 100000.
MOVE '1' TO WS-BD-STATUS.
MOVE 202506 TO WS-BD-MONTH.
COMPUTE WS-BD-BALANCE = WS-BD-AMOUNT * 80 / 100.
*>
MOVE WS-BD-AMOUNT TO WS-ED-TOTAL.
STRING "BILL: invoice=" WS-BD-INV-ID
" amount=" WS-ED-TOTAL
" balance=" WS-BD-BALANCE
INTO WS-CA-MESSAGE.
MOVE 00 TO WS-CA-RETURN-CODE.
*>
*> Build map fields for BILL response
MOVE "BILLMAP " TO WS-MAP-MAPNAME.
MOVE "BILLING INQUIRY" TO WS-MAP-TITLE.
MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY.
STRING "BALANCE=" WS-BD-BALANCE INTO WS-MAP-MSG-LINE.
*>
3250-PROCESS-DISP SECTION.
*>
*> Display detail processing
DISPLAY "Main14OnlineCics: DISP - Display detail...".
MOVE WS-CA-INPUT-DATA TO WS-BD-INV-ID.
MOVE 50000 TO WS-BD-AMOUNT.
MOVE '1' TO WS-BD-STATUS.
MOVE 202506 TO WS-BD-MONTH.
*>
MOVE WS-BD-AMOUNT TO WS-ED-TOTAL.
STRING "DISP: invoice=" WS-BD-INV-ID
" amount=" WS-ED-TOTAL
" status=" WS-BD-STATUS
INTO WS-CA-MESSAGE.
MOVE 00 TO WS-CA-RETURN-CODE.
*>
*> Build map fields for DISP response
MOVE "DISPMAP " TO WS-MAP-MAPNAME.
MOVE "DISPLAY DETAIL" TO WS-MAP-TITLE.
MOVE WS-CA-INPUT-DATA TO WS-MAP-BODY.
STRING "AMOUNT=" WS-BD-AMOUNT INTO WS-MAP-MSG-LINE.
*>
3300-BUILD-MAP SECTION.
*>
DISPLAY "Main14OnlineCics: Building response map...".
*>
*> Populate map field table based on transaction
MOVE 1 TO WS-MAP-CURSOR.
MOVE 'U' TO WS-MAP-ATTR.
*>
*> Fill map field entries
MOVE "USERID " TO WS-MAP-FLD-NAME(1).
MOVE WS-CA-USERID TO WS-MAP-FLD-VALUE(1).
MOVE 'P' TO WS-MAP-FLD-ATTR(1).
*>
MOVE "FUNCTION " TO WS-MAP-FLD-NAME(2).
MOVE WS-CA-FUNCTION TO WS-MAP-FLD-VALUE(2).
MOVE 'P' TO WS-MAP-FLD-ATTR(2).
*>
MOVE "RETURNCOD" TO WS-MAP-FLD-NAME(3).
MOVE WS-CA-RETURN-CODE TO WS-MAP-FLD-VALUE(3).
MOVE 'P' TO WS-MAP-FLD-ATTR(3).
*>
MOVE "MESSAGE " TO WS-MAP-FLD-NAME(4).
MOVE WS-CA-MESSAGE TO WS-MAP-FLD-VALUE(4).
MOVE 'U' TO WS-MAP-FLD-ATTR(4).
*>
MOVE "INPUTDATA" TO WS-MAP-FLD-NAME(5).
MOVE WS-CA-INPUT-DATA TO WS-MAP-FLD-VALUE(5).
MOVE 'U' TO WS-MAP-FLD-ATTR(5).
*>
DISPLAY "Main14OnlineCics: Map built."
" Mapname=" WS-MAP-MAPNAME
" Title=" WS-MAP-TITLE.
*>
3400-FORMAT-RESPONSE SECTION.
*>
DISPLAY "Main14OnlineCics: Formatting response...".
*>
*> Capture response time end
MOVE FUNCTION CURRENT-DATE TO WS-TIMESTAMP.
MOVE WS-TS-SECOND TO WS-RT-END-S.
MOVE WS-TS-MS TO WS-RT-END-M.
*>
*> Calculate elapsed time in milliseconds
COMPUTE WS-RT-ELAPSED =
(WS-RT-END-S - WS-RT-START-S) * 1000
+ (WS-RT-END-M - WS-RT-START-M).
IF WS-RT-ELAPSED < 0
COMPUTE WS-RT-ELAPSED =
WS-RT-ELAPSED + 60000
END-IF.
MOVE WS-RT-ELAPSED TO WS-RT-DISP.
*>
*> Build response text with map details
STRING "MAP=" WS-MAP-MAPNAME
" TITLE=" WS-MAP-TITLE
" MSG=" WS-MAP-MSG-LINE
" RESP-TIME=" WS-RT-DISP "ms"
INTO WS-RESP-TEXT.
*>
*> Build formatted output line with response time
MOVE SPACES TO OUTPUT-LINE.
STRING "RESPONSE: " WS-RESP-TEXT
DELIMITED BY SIZE INTO OUTPUT-LINE.
*>
DISPLAY "Main14OnlineCics: Response formatted."
" Time=" WS-RT-DISP "ms".
*>
4000-REPORT SECTION.
*>
DISPLAY "Main14OnlineCics: Generating session report...".
*>
*> Write report header
MOVE SPACES TO REPORT-LINE.
STRING "TELECOM CICS TRANSACTION REPORT"
" " WS-RPT-DATE " " WS-RPT-TIME
INTO REPORT-LINE.
WRITE REPORT-LINE.
WRITE REPORT-LINE FROM WS-SEP-STARS.
*>
*> Write session summary
MOVE SPACES TO REPORT-LINE.
STRING "SESSION: User=" WS-SESS-USERID
" Status=" WS-SESS-STATUS
" Txns=" WS-SESS-TXN-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
*> Write transaction hash breakdown
MOVE WS-HASH-FUNC-INQY TO WS-ED-COUNT.
STRING "HASH: INQY=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-UPDT TO WS-ED-COUNT.
STRING "HASH: UPDT=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-DEL TO WS-ED-COUNT.
STRING "HASH: DEL =" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-ADDN TO WS-ED-COUNT.
STRING "HASH: ADDN=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-CANC TO WS-ED-COUNT.
STRING "HASH: CANC=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-SUSP TO WS-ED-COUNT.
STRING "HASH: SUSP=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-BILL TO WS-ED-COUNT.
STRING "HASH: BILL=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-DISP TO WS-ED-COUNT.
STRING "HASH: DISP=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-FUNC-OTHER TO WS-ED-COUNT.
STRING "HASH: OTHER=" WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
*> Write total summary
MOVE WS-HASH-TXN-COUNT TO WS-ED-TOTAL.
STRING "TOTAL TRANSACTIONS: " WS-ED-TOTAL
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-HASH-CHECKSUM TO WS-ED-TOTAL.
STRING "HASH CHECKSUM: " WS-ED-TOTAL
INTO REPORT-LINE.
WRITE REPORT-LINE.
*>
MOVE WS-ERR-COUNT TO WS-ED-COUNT.
STRING "ERRORS: " WS-ED-COUNT
INTO REPORT-LINE.
WRITE REPORT-LINE.
WRITE REPORT-LINE FROM WS-SEP-DASHES.
*>
*> Write transaction history
MOVE SPACES TO REPORT-LINE.
STRING "TRANSACTION HISTORY (" WS-TXN-COUNT " entries)"
INTO REPORT-LINE.
WRITE REPORT-LINE.
WRITE REPORT-LINE FROM WS-SEP-STARS.
*>
PERFORM VARYING WS-TXN-COUNT FROM 1 BY 1
UNTIL WS-TXN-COUNT > 20
OR WS-TXN-FUNC(WS-TXN-COUNT) = SPACES
MOVE WS-TXN-RC(WS-TXN-COUNT) TO WS-ED-COUNT
STRING " " WS-TXN-FUNC(WS-TXN-COUNT)
" USER=" WS-TXN-USER(WS-TXN-COUNT)
" RC=" WS-ED-COUNT
" TIME=" WS-TXN-TIME(WS-TXN-COUNT)
INTO REPORT-LINE
WRITE REPORT-LINE
END-PERFORM.
*>
WRITE REPORT-LINE FROM WS-SEP-EQUALS.
*>
DISPLAY "Main14OnlineCics: Report written to txn-report.txt".
*>
5000-AUDIT SECTION.
*>
DISPLAY "Main14OnlineCics: Writing audit trail...".
*>
*> Build audit record
MOVE WS-HASH-TXN-COUNT TO WS-ED-COUNT.
MOVE WS-ERR-COUNT TO WS-ED-COUNT.
*>
STRING "AUDIT:" WS-TIMESTAMP-STR
" PROG=Main14OnlineCics"
" TXNS=" WS-HASH-TXN-COUNT
" ERRS=" WS-ERR-COUNT
" USER=" WS-CA-USERID
" FUNC=" WS-CA-FUNCTION
" RC=" WS-CA-RETURN-CODE
INTO AUDIT-RECORD.
WRITE AUDIT-RECORD.
IF WS-AUD-FILE-STATUS NOT = '00'
DISPLAY "ERROR: Audit write failed, status: "
WS-AUD-FILE-STATUS
ADD 1 TO WS-ERR-COUNT
END-IF.
*>
*> Second audit line — response time
STRING "AUDIT:RESPTIME=" WS-RT-DISP "ms"
" MAP=" WS-MAP-MAPNAME
" CURSOR=" WS-MAP-CURSOR
INTO AUDIT-RECORD.
WRITE AUDIT-RECORD.
*>
*> Third audit line — session state
STRING "AUDIT:SESSION=" WS-SESS-USERID
" STATUS=" WS-SESS-STATUS
" TCNT=" WS-SESS-TXN-COUNT
" ERRS=" WS-SESS-ERRORS
INTO AUDIT-RECORD.
WRITE AUDIT-RECORD.
*>
ADD 1 TO WS-AUDIT-ENTRIES.
DISPLAY "Main14OnlineCics: Audit trail written."
" Entries=" WS-AUDIT-ENTRIES.
*>
6000-ERROR-HANDLE SECTION.
*>
ADD 1 TO WS-ERR-COUNT.
ADD 1 TO WS-HASH-ERROR-COUNT.
*>
*> Set error response code based on severity
EVALUATE WS-ERR-SEVERITY
WHEN 0
MOVE '0000' TO WS-ERR-RESP-CODE
MOVE 'Informational' TO WS-ERR-RESP-MSG
DISPLAY 'INFO: ' WS-ERR-MSG
WHEN 1
MOVE '0001' TO WS-ERR-RESP-CODE
MOVE 'Warning' TO WS-ERR-RESP-MSG
DISPLAY 'WARN: ' WS-ERR-MSG
WHEN 2
MOVE '0002' TO WS-ERR-RESP-CODE
MOVE 'Error' TO WS-ERR-RESP-MSG
DISPLAY 'ERROR: ' WS-ERR-MSG
WHEN 3
MOVE '0003' TO WS-ERR-RESP-CODE
MOVE 'Fatal' TO WS-ERR-RESP-MSG
DISPLAY 'FATAL: ' WS-ERR-MSG
PERFORM 9000-EXIT
GOBACK
WHEN OTHER
MOVE '9999' TO WS-ERR-RESP-CODE
MOVE 'Unknown severity' TO WS-ERR-RESP-MSG
DISPLAY 'UNKN: ' WS-ERR-MSG
END-EVALUATE.
*>
*> Check error threshold
IF WS-ERR-COUNT > WS-CONFIG-MAX-ERRORS
MOVE 3 TO WS-ERR-SEVERITY
STRING 'FATAL: Error threshold '
WS-CONFIG-MAX-ERRORS ' exceeded'
INTO WS-ERR-MSG
DISPLAY WS-ERR-MSG
PERFORM 9000-EXIT
GOBACK
END-IF.
*>
9000-EXIT SECTION.
*>
DISPLAY "Main14OnlineCics: Cleanup and exit...".
*>
*> Close all files with status checks
CLOSE MAP-FILE.
IF WS-MAP-FILE-STATUS NOT = '00'
DISPLAY "WARN: MAP-FILE close status="
WS-MAP-FILE-STATUS
END-IF.
*>
CLOSE OUTPUT-FILE.
IF WS-OUT-FILE-STATUS NOT = '00'
DISPLAY "WARN: OUTPUT-FILE close status="
WS-OUT-FILE-STATUS
END-IF.
*>
CLOSE TXN-AUDIT-FILE.
IF WS-AUD-FILE-STATUS NOT = '00'
DISPLAY "WARN: TXN-AUDIT close status="
WS-AUD-FILE-STATUS
END-IF.
*>
CLOSE TXN-REPORT.
IF WS-RPT-FILE-STATUS NOT = '00'
DISPLAY "WARN: TXN-REPORT close status="
WS-RPT-FILE-STATUS
END-IF.
*>
*> Final summary display
DISPLAY "Main14OnlineCics: Transactions=" WS-HASH-TXN-COUNT.
DISPLAY "Main14OnlineCics: Hash checksum=" WS-HASH-CHECKSUM.
DISPLAY "Main14OnlineCics: Errors=" WS-ERR-COUNT.
DISPLAY "Main14OnlineCics: Response time=" WS-RT-DISP "ms".
DISPLAY "Main14OnlineCics: Audit entries=" WS-AUDIT-ENTRIES.
DISPLAY "Main14OnlineCics: End at " WS-TIMESTAMP-STR.
*>
EXIT.
@@ -0,0 +1,68 @@
*> ============================================================
*> test-cics-driver : 客户在线照会测试驱动 (CICS Test Driver)
*> Input : COMMAREA (模拟CICS通信区域)
*> Output: CALL結果 (在线照会处理)
*> Coverage: OL-N001~N004, OL-A001, OL-R001
*> ============================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. TestCicsDriver.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COMMAREA.
05 WS-CA-USERID PIC X(08).
05 WS-CA-FUNCTION PIC X(04).
05 WS-CA-INPUT-DATA PIC X(40).
05 WS-CA-RETURN-CODE PIC 9(02).
05 WS-CA-MESSAGE PIC X(40).
01 WS-TEST-CASE PIC 9(01) VALUE 1.
01 WS-INVOICE-REC.
COPY "telecom/TEL-INVOICE.cpy".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY "=== CICS Driver - Test Suite ===".
*> Test 1: INQUIRY function
DISPLAY "Test 1: INQUIRY".
MOVE "USER001 " TO WS-CA-USERID.
MOVE "INQY" TO WS-CA-FUNCTION.
MOVE "Customer account balance inquiry "
TO WS-CA-INPUT-DATA.
CALL 'Main14OnlineCics' USING WS-COMMAREA.
DISPLAY " RC=" WS-CA-RETURN-CODE
" MSG=" WS-CA-MESSAGE.
*> Test 2: UPDATE function
DISPLAY "Test 2: UPDATE".
MOVE "USER002 " TO WS-CA-USERID.
MOVE "UPDT" TO WS-CA-FUNCTION.
MOVE "Update customer address record "
TO WS-CA-INPUT-DATA.
CALL 'Main14OnlineCics' USING WS-COMMAREA.
DISPLAY " RC=" WS-CA-RETURN-CODE
" MSG=" WS-CA-MESSAGE.
*> Test 3: DELETE function
DISPLAY "Test 3: DELETE".
MOVE "USER003 " TO WS-CA-USERID.
MOVE "DEL " TO WS-CA-FUNCTION.
MOVE "Delete obsolete customer record "
TO WS-CA-INPUT-DATA.
CALL 'Main14OnlineCics' USING WS-COMMAREA.
DISPLAY " RC=" WS-CA-RETURN-CODE
" MSG=" WS-CA-MESSAGE.
*> Test 4: UNKNOWN function
DISPLAY "Test 4: UNKNOWN function".
MOVE "USER004 " TO WS-CA-USERID.
MOVE "BAD!" TO WS-CA-FUNCTION.
MOVE "This should return error code 99 "
TO WS-CA-INPUT-DATA.
CALL 'Main14OnlineCics' USING WS-COMMAREA.
DISPLAY " RC=" WS-CA-RETURN-CODE
" MSG=" WS-CA-MESSAGE.
STOP RUN.