blob: 42571d451d576efdd656cf0575af7ecee66fe58c [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2000-2019 Ericsson Telecom AB //
// //
// All rights reserved. This program and the accompanying materials //
// are made available under the terms of the Eclipse Public License v2.0 //
// which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Module: MyMessageTypeRingBuffer_Demo
//
// Purpose:
// This module demonstrates how to handle a ring buffer built from an arbitrary
// user defined type.
//
// Module depends on:
// <MyMessageTypeRingBuffer.ttcnpp>
//
// Current Owner:
// Istvan Falusi (eistfal)
//
// Last Review Date:
// 2007-11-19
//
///////////////////////////////////////////////////////////
module MyMessageTypeRingBuffer_Demo
{
import from MyMessageTypeRingBuffer_Functions all;
const MyMessageType c_MyGoodMessage := { OK, "Something good happened" }
const MyMessageType c_MyErrorMessage := { ERROR, "Something went wrong" }
type component MTC_CT {};
// function to generate a message:
// good message with 97% probability, or error message with 3% probability
function f_GenerateMessage(out MyMessageType pl_message)
{
if (rnd() > 0.03)
{
pl_message := c_MyGoodMessage;
}
else
{
pl_message := c_MyErrorMessage;
}
}
// Implementation of the demo use case:
// it stores incoming messages in a ring buffer, until an error message arrives.
// In case of error message, it logs the whole content of the buffer.
testcase tc_MyMessageTypeRingBuffer_Demo() runs on MTC_CT system MTC_CT
{
var MyMessageTypeRingBuffer v_buffer;
var MyMessageType v_myMessage;
log("================================================================================");
log("Init buffer with capacity of 50 elements...");
f_EPTF_MyMessageType_RB_init(v_buffer, 50);
log("================================================================================");
log("Generate messages and put them into ring buffer until error message received...");
do
{
f_GenerateMessage(v_myMessage);
f_EPTF_MyMessageType_RB_push_back(v_buffer, v_myMessage);
}
while ( v_myMessage.severity != ERROR);
log("================================================================================");
log("Error message received, dump the ring buffer");
log("The ring buffer contains " & int2str(f_EPTF_MyMessageType_RB_size(v_buffer)) & " messages");
while (not f_EPTF_MyMessageType_RB_empty(v_buffer))
{
log( f_EPTF_MyMessageType_RB_front(v_buffer) );
f_EPTF_MyMessageType_RB_pop_front(v_buffer);
}
log("================================ End of demo =====================================");
setverdict(pass);
}
// The following test case implements a similar use case, as the previous one,
// but logs the stored messages with reverse order.
testcase tc_MyMessageTypeRingBuffer_Demo_Reverse() runs on MTC_CT system MTC_CT
{
var MyMessageTypeRingBuffer v_buffer;
var MyMessageType v_myMessage;
log("================================================================================");
log("Init buffer with capacity of 50 elements...");
f_EPTF_MyMessageType_RB_init(v_buffer, 50);
log("================================================================================");
log("Generate messages and put them into ring buffer until error message received...");
do
{
f_GenerateMessage(v_myMessage);
f_EPTF_MyMessageType_RB_push_back(v_buffer, v_myMessage);
}
while ( v_myMessage.severity != ERROR);
log("================================================================================");
log("Error message received, dump the ring buffer with reverse order (from end to begin)");
log("The ring buffer contains " & int2str(f_EPTF_MyMessageType_RB_size(v_buffer)) & " messages");
while (not f_EPTF_MyMessageType_RB_empty(v_buffer))
{
log( f_EPTF_MyMessageType_RB_back(v_buffer) );
f_EPTF_MyMessageType_RB_pop_back(v_buffer);
}
log("================================ End of demo =====================================");
setverdict(pass);
}
control
{
execute(tc_MyMessageTypeRingBuffer_Demo());
execute(tc_MyMessageTypeRingBuffer_Demo_Reverse());
}
} // end of module