rtps-fpga/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd

2116 lines
79 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
entity L0_dds_writer_test1_afk is
end entity;
-- This testbench tests the General Operation of the DDS Writer. It tests the correctness of the RTPS
-- GET_MIN_SN, GET_MAX_SN, GET_CACHE_CHANGE, REMOVE_CACHE_CHANGE, ACK_CACHE_CHANGE, and NACK_CACHE_CHANGE Operations and the
-- DDS REGISTER_INSTANCE, UNREGISTER_INSTANCE, WRITE, DISPOSE, and LOOKUP_INSTANCE Operations.
-- More specifically the testbench covers following tests:
-- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY
-- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE
-- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE
-- TEST: ADD SAMPLE WITH KEY_HASH [UNKNOWN INSTANCE]
-- TEST: ADD SAMPLE WITH KEY_HASH [KNOWN INSTANCE]
-- TEST: ADD SAMPLE WITH HANDLE_NIL [UNKNOWN INSTANCE]
-- TEST: ADD SAMPLE WITH HANDLE_NIL [KNOWN INSTANCE]
-- TEST: NORMAL WRITE
-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
-- TEST: WRITE ON DISPOSED INSTANCE
-- TEST: WRITE ON UNREGISTERED INSTANCE
-- TEST: WRITE ALIGNED PAYLOAD
-- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT]
-- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT]
-- TEST: NORMAL REGISTER
-- TEST: REGISTER INSTANCE [KNOWN INSTANCE]
-- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE]
-- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
-- TEST: REGISTER ON UNREGISTERED INSTANCE
-- TEST: NORMAL DISPOSE
-- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
-- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
-- TEST: DISPOSE ON UNREGISTERED INSTANCE
-- TEST: GET_CACHE_CHANGE [UNKNOWN SN]
-- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD]
-- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT]
-- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT]
-- TEST: NORMAL ACK_CACHE_CHANGE
-- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN]
-- TEST: NORMAL NACK_CACHE_CHANGE
-- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN]
-- TEST: REMOVE_CACHE_CHANGE [KNOWN SN]
-- TEST: NORMAL UNREGISTER
-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
-- TEST: UNREGISTER ON DISPOSED INSTANCE
-- TEST: UNREGISTER UNKNOWN INSTANCE
-- TEST: REMOVE STALE INSTANCE WITH 0 SAMPLES
-- TEST: REMOVE STALE INSTANCE WITH 1 SAMPLES
-- TEST: REMOVE STALE INSTANCE WITH >1 SAMPLES
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCES]
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH FULLY ACKed INSTANCE, WITHOUT STALE INSTANCE]
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITHOUT ACKed SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLE]
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLES(>1)]
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLE]
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITHOUT ACKed SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed INSTANCE SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITHOUT ACKed SAMPLE]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCES,WITHOUT ACKed SAMPLES]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCE, WITH ACKed SAMPLE]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)]
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE]
-- TEST: ADD SAMPLE ON PAYLOAD FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove)
-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES]
-- TEST: INSTANCE LOOKUP [KNOWN INSTANCE]
-- TEST: INSTANCE LOOKUP [UNKNOWN INSTANCE]
architecture testbench of L0_dds_writer_test1_afk is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK);
type RTPS_WRITER_TEST_TYPE is record
opcode : HISTORY_CACHE_OPCODE_TYPE;
cc : CACHE_CHANGE_TYPE;
ret_code : HISTORY_CACHE_RESPONSE_TYPE;
end record;
constant DEFAULT_RTPS_WRITER_TEST : RTPS_WRITER_TEST_TYPE := (
opcode => NOP,
cc => DEFAULT_CACHE_CHANGE,
ret_code => OK
);
type DDS_TEST_TYPE is record
opcode : DDS_WRITER_OPCODE_TYPE;
cc : CACHE_CHANGE_TYPE;
ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
end record;
constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := (
opcode => NOP,
cc => DEFAULT_CACHE_CHANGE,
ret_code => RETCODE_OK
);
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_WRITER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal seq_nr_rtps, cc_seq_nr : SEQUENCENUMBER_TYPE := SEQUENCENUMBER_UNKNOWN;
signal ready_out_rtps, valid_out_rtps, last_word_out_rtps : std_logic := '0';
signal ready_in_dds, ready_out_dds, valid_in_dds, valid_out_dds, last_word_in_dds, last_word_out_dds : std_logic := '0';
signal data_out_rtps, data_in_dds, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_rtps, liveliness_assertion, data_available : std_logic := '0';
signal cc_source_timestamp, source_ts_dds : TIME_TYPE := TIME_INVALID;
signal cc_kind : CACHE_CHANGE_KIND_TYPE := ALIVE;
signal cc_instance_handle, instance_handle_in_dds, instance_handle_out_dds : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_wait_dds : DURATION_TYPE := DURATION_INFINITE;
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_TEST_TYPE := DEFAULT_DDS_TEST;
shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST;
signal inst_id, kind_id, sn_id, ts_id, ih_id, ret_id, data_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
begin
-- Unit Under Test
uut : entity work.dds_writer(arch)
generic map(
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
DEADLINE_QOS => DURATION_INFINITE,
LIFESPAN_QOS => gen_duration(1,0),
LEASE_DURATION => DURATION_INFINITE,
WITH_KEY => TRUE,
MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)),
PAYLOAD_FRAME_SIZE => 11
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
seq_nr_rtps => seq_nr_rtps,
get_data_rtps => get_data_rtps,
data_out_rtps => data_out_rtps,
valid_out_rtps => valid_out_rtps,
ready_out_rtps => ready_out_rtps,
last_word_out_rtps => last_word_out_rtps,
liveliness_assertion => liveliness_assertion,
data_available => data_available,
cc_instance_handle => cc_instance_handle,
cc_kind => cc_kind,
cc_source_timestamp => cc_source_timestamp,
cc_seq_nr => cc_seq_nr,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_handle_in_dds => instance_handle_in_dds,
source_ts_dds => source_ts_dds,
max_wait_dds => max_wait_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
instance_handle_out_dds => instance_handle_out_dds,
ready_in_dds => ready_in_dds,
valid_in_dds => valid_in_dds,
data_in_dds => data_in_dds,
last_word_in_dds => last_word_in_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
begin
SetAlertLogName("L0_dds_writer_test1_afk - (KEEP ALL, Finite Lifespan, Keyed) - General");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
inst_id <= GetAlertLogID("Instance", ALERTLOG_BASE_ID);
kind_id <= GetAlertLogID("Cache Change Kind", ALERTLOG_BASE_ID);
sn_id <= GetAlertLogID("SequenceNumber", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("TimeStamp", ALERTLOG_BASE_ID);
ih_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
-- Key Hashes
kh1 := gen_key_hash;
kh2 := gen_key_hash;
kh3 := gen_key_hash;
kh4 := gen_key_hash;
Log("Initiating Test", INFO);
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
-- Stored CC: 0, 0, 0, 0
-- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY
Log("RTPS Operation GET_MIN_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN;
start_rtps;
wait_on_rtps;
-- TEST: WRITE ALIGNED PAYLOAD
-- TEST: NORMAL WRITE
-- TEST: ADD SAMPLE WITH KEY_HASH [UNKNOWN INSTANCE]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(1);
cc.src_timestamp := gen_duration(1,0);
Log("DDS Operation WRITE [TS 1s, Instance 1] (REJECTED: Instance not Registered)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_BAD_PARAMETER;
start_dds;
wait_on_dds;
-- TEST: ADD SAMPLE WITH HANDLE_NIL [UNKNOWN INSTANCE]
Log("DDS Operation WRITE [TS 1s, Instance 1, HANDLE_NIL] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I1S1, 0, 0, 0
-- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE
Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(1);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 1)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(1);
start_rtps;
wait_on_rtps;
-- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,12);
cc.seq_nr := gen_sn(2);
cc.src_timestamp := gen_duration(2,0);
Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (REJECTED: Instance not Registered)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_BAD_PARAMETER;
start_dds;
wait_on_dds;
-- TEST: NORMAL REGISTER
Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
-- TEST: ADD SAMPLE WITH KEY_HASH [KNOWN INSTANCE]
Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I1S1, I2S2, 0, 0
-- TEST: ADD SAMPLE WITH HANDLE_NIL [KNOWN INSTANCE]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,15);
cc.seq_nr := gen_sn(3);
cc.src_timestamp := gen_duration(3,0);
Log("DDS Operation WRITE [TS 3s, Instance 1, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I1S1, I2S2, I1S3, 0
-- TEST: GET_CACHE_CHANGE [UNKNOWN SN]
Log("RTPS Operation GET_CACHE_CHANGE SN 4 (Invalid)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc.seq_nr := gen_sn(4);
rtps.ret_code := INVALID;
start_rtps;
wait_on_rtps;
-- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD]
Log("RTPS Operation GET_CACHE_CHANGE SN 1", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT]
Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 3", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,8);
cc.seq_nr := gen_sn(4);
cc.src_timestamp := gen_duration(4,0);
-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (REJECTED: Payload Memory Full)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
-- Stored CC: I1S1, I2S2, I1S3, 0
-- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN]
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 5 (Invalid)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc.seq_nr := gen_sn(5);
rtps.ret_code := INVALID;
start_rtps;
wait_on_rtps;
-- TEST: REMOVE_CACHE_CHANGE [KNOWN SN]
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 2", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- Stored CC: I1S1, 0, I1S3, 0
Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I1S1, I3S4, I1S3, 0
-- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT]
Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- TEST: REGISTER INSTANCE [KNOWN INSTANCE]
Log("DDS Operation REGISTER_INSTANCE 3 (No Change)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc2;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
-- TEST: NORMAL DISPOSE
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_DISPOSED;
cc.instance := kh1;
cc.payload := gen_payload(kh1,5);
cc.seq_nr := gen_sn(5);
cc.src_timestamp := gen_duration(5,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITHOUT ACKed SAMPLES]
Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
-- TEST: NORMAL ACK_CACHE_CHANGE
Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES]
Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 1", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLE]
Log("DDS Operation DISPOSE [TS 5s, Instance 1] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I1S5, I3S4, I1S3, 0
-- VALIDATE STATE
-- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE
Log("RTPS Operation GET_MIN_SN (Expected SN 3)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(3);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 5)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(5);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 5", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(6);
cc.src_timestamp := gen_duration(6,0);
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCES]
Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 3", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN]
Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 5", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH FULLY ACKed INSTANCE, WITHOUT STALE INSTANCE]
Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
-- TEST: NORMAL UNREGISTER
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh1;
cc.payload := gen_payload(kh1,5);
cc.seq_nr := gen_sn(6);
cc.src_timestamp := gen_duration(6,0);
-- TEST: UNREGISTER ON DISPOSED INSTANCE
Log("DDS Operation UNREGISTER_INSTANCE [TS 6s, Instance 1] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I1S5, I3S4, I1S6, 0
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(4);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 6)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(6);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(7);
cc.src_timestamp := gen_duration(7,0);
Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 6", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
-- TEST: REMOVE STALE INSTANCE WITH >1 SAMPLES
Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I4S7, I3S4, 0, 0
Log("RTPS Operation GET_CACHE_CHANGE SN 5 (Invalid)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc.seq_nr := gen_sn(5);
rtps.ret_code := INVALID;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 6 (Invalid)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc.seq_nr := gen_sn(6);
rtps.ret_code := INVALID;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 7", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,15);
cc.seq_nr := gen_sn(8);
cc.src_timestamp := gen_duration(8,0);
Log("DDS Operation WRITE [TS 8s, Instance 2, Unaligned Payload (2 Slot)] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I4S7, I3S4, I2S8, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(9);
cc.src_timestamp := gen_duration(9,0);
Log("DDS Operation WRITE [TS 9s, Instance 1, Aligned Payload] (REJECTED: Instance not Registered)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_BAD_PARAMETER;
start_dds;
wait_on_dds;
-- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE]
Log("DDS Operation REGISTER_INSTANCE 1 (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
start_dds;
wait_on_dds;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh3;
cc.payload := gen_payload(kh3,5);
cc.seq_nr := gen_sn(9);
cc.src_timestamp := gen_duration(9,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 9s, Instance 3] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I4S7, I3S4, I2S8, I3S9
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(4);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(9);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 8", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 9", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 9", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(10);
cc.src_timestamp := gen_duration(10,0);
-- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
Log("DDS Operation REGISTER_INSTANCE 1 (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
Log("DDS Operation WRITE [TS 10s, Instance 1, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I4S7, I1S10, I2S8, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(11);
cc.src_timestamp := gen_duration(11,0);
Log("DDS Operation WRITE [TS 11s, Instance 1, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I4S7, I1S10, I2S8, I4S11
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.seq_nr := gen_sn(12);
cc.src_timestamp := gen_duration(12,0);
Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (REJECTED: Payload Memory Full)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 8", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I4S7, I1S10, I2S12, I4S11
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(13);
cc.src_timestamp := gen_duration(13,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES]
Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 7", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES]
Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I4S13, I1S10, I2S12, I4S11
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(10);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(13);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 10", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 11", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 12", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 13", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 12", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh2;
cc.payload := gen_payload(kh2,5);
cc.seq_nr := gen_sn(14);
cc.src_timestamp := gen_duration(14,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 14s, Instance 2] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I4S13, I1S10, I2S14, I4S11
Log("RTPS Operation ACK_CACHE_CHANGE SN 11", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,20);
cc.seq_nr := gen_sn(15);
cc.src_timestamp := gen_duration(15,0);
-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES]
Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (REJECTED: Payload Memory Full)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 11", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
-- Stored CC: I4S13, I1S10, I2S14, 0
Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I4S13, I1S10, I2S14, I4S15
-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh1;
cc.payload := gen_payload(kh1,5);
cc.seq_nr := gen_sn(16);
cc.src_timestamp := gen_duration(16,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 10", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I4S13, I1S16, I2S14, I4S15
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_DISPOSED;
cc.instance := kh3;
cc.payload := gen_payload(kh3,5);
cc.seq_nr := gen_sn(17);
cc.src_timestamp := gen_duration(17,0);
-- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES]
Log("DDS Operation DISPOSE [TS 17s, Instance 3] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 13", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 14", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES]
-- TEST: ADD SAMPLE ON PAYLOAD FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove)
-- TEST: REMOVE STALE INSTANCE WITH 1 SAMPLES
Log("DDS Operation DISPOSE [TS 17s, Instance 3] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I3S17, I1S16, 0, I4S15
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 15)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(15);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 17)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(17);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 15", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 16", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 17", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 15", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
-- Stored CC: I3S17, I1S16, 0, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.seq_nr := gen_sn(18);
cc.src_timestamp := gen_duration(18,0);
-- TEST: WRITE ON DISPOSED INSTANCE
Log("DDS Operation WRITE [TS 18s, Instance 3, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I3S17, I1S16, I3S18, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(19);
cc.src_timestamp := gen_duration(19,0);
Log("DDS Operation WRITE [TS 19s, Instance 4, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I3S17, I1S16, I3S18, I4S19
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.seq_nr := gen_sn(20);
cc.src_timestamp := gen_duration(20,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCES,WITHOUT ACKed SAMPLES]
Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 16", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)]
Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I3S17, I2S20, I3S18, I4S19
Log("RTPS Operation ACK_CACHE_CHANGE SN 17", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh4;
cc.payload := gen_payload(kh4,5);
cc.seq_nr := gen_sn(21);
cc.src_timestamp := gen_duration(21,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 21s, Instance 4] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I4S21, I2S20, I3S18, I4S19
Log("RTPS Operation ACK_CACHE_CHANGE SN 19", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(22);
cc.src_timestamp := gen_duration(22,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCE, WITH ACKed SAMPLE]
Log("DDS Operation WRITE [TS 22s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 19", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
-- Stored CC: I4S21, I2S20, I3S18, 0
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 21", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- Stored CC: 0, I2S20, I3S18, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh2;
cc.payload := gen_payload(kh2,5);
cc.seq_nr := gen_sn(22);
cc.src_timestamp := gen_duration(22,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 22s, Instance 2] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I2S22, I2S20, I3S18, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh3;
cc.payload := gen_payload(kh3,5);
cc.seq_nr := gen_sn(23);
cc.src_timestamp := gen_duration(23,0);
Log("DDS Operation UNREGISTER_INSTANCE [TS 23s, Instance 3] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I2S22, I2S20, I3S18, I3S23
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITHOUT ACKed SAMPLE]
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(24);
cc.src_timestamp := gen_duration(24,0);
Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 20", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
-- TEST: REMOVE STALE INSTANCE WITH 0 SAMPLES
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE]
Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I2S22, I1S24, I3S18, I3S23
Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: NORMAL NACK_CACHE_CHANGE
Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := NACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(25);
cc.src_timestamp := gen_duration(25,0);
Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: REGISTER ON UNREGISTERED INSTANCE
Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc1;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 18", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.seq_nr := gen_sn(25);
cc.src_timestamp := gen_duration(25,0);
-- TEST: WRITE ON UNREGISTERED INSTANCE
Log("DDS Operation WRITE [TS 25s, Instance 3, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I2S22, I1S24, I3S25, I3S23
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(26);
cc.src_timestamp := gen_duration(26,0);
Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
start_dds;
wait_on_dds;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh4;
cc.payload := gen_payload(kh4,5);
cc.seq_nr := gen_sn(26);
cc.src_timestamp := gen_duration(26,0);
-- TEST: UNREGISTER UNKNOWN INSTANCE
Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, HANDLE_NIL, Instance 4] (IGNORED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := NACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation NACK_CACHE_CHANGE SN 23", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := NACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh3;
cc.payload := gen_payload(kh3,5);
cc.seq_nr := gen_sn(26);
cc.src_timestamp := gen_duration(26,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITHOUT ACKed SAMPLES]
Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES]
Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OUT_OF_RESOURCES;
start_dds;
wait_on_dds;
Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed INSTANCE SAMPLES]
Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := UNREGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I2S22, I1S24, I3S25, I3S26
Log("RTPS Operation ACK_CACHE_CHANGE SN 25", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_DISPOSED;
cc.instance := kh3;
cc.payload := gen_payload(kh3,5);
cc.seq_nr := gen_sn(27);
cc.src_timestamp := gen_duration(27,0);
-- TEST: DISPOSE ON UNREGISTERED INSTANCE
Log("DDS Operation DISPOSE [TS 27s, Instance 3] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := DISPOSE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I2S22, I1S24, I3S27, I3S26
Log("RTPS Operation ACK_CACHE_CHANGE SN 26", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 27", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.seq_nr := gen_sn(28);
cc.src_timestamp := gen_duration(28,0);
Log("DDS Operation REGISTER_INSTANCE 4 (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := REGISTER_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
-- Stored CC: I2S22, I1S24, 0, 0
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 22)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(22);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 24)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(24);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 24", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := NACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation NACK_CACHE_CHANGE SN 24", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := NACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("DDS Operation WRITE [TS 28s, Instance 4, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc3 := cc;
-- Stored CC: I2S22, I1S24, I4S28, 0
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.seq_nr := gen_sn(29);
cc.src_timestamp := gen_duration(29,0);
Log("DDS Operation WRITE [TS 29s, Instance 2, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc4 := cc;
-- Stored CC: I2S22, I1S24, I4S28, I2S29
Log("RTPS Operation ACK_CACHE_CHANGE SN 24", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 28", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(30);
cc.src_timestamp := gen_duration(30,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)]
Log("DDS Operation WRITE [TS 30s, Instance 1, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc2 := cc;
-- Stored CC: I2S22, I1S30, I4S28, I2S29
Log("RTPS Operation REMOVE_CACHE_CHANGE SN 28", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := REMOVE_CACHE_CHANGE;
rtps.cc := cc3;
start_rtps;
wait_on_rtps;
-- Stored CC: I2S22, I1S30, 0, I2S29
Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
Log("RTPS Operation ACK_CACHE_CHANGE SN 29", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := ACK_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.seq_nr := gen_sn(31);
cc.src_timestamp := gen_duration(31,0);
-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLES(>1)]
Log("DDS Operation WRITE [TS 31s, Instance 2, Aligned Payload] (ACCEPTED)", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := WRITE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc1 := cc;
-- Stored CC: I2S31, I1S30, 0, I2S29
-- VALIDATE STATE
Log("RTPS Operation GET_MIN_SN (Expected SN 29)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MIN_SN;
rtps.cc.seq_nr := gen_sn(29);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_MAX_SN (Expected SN 31)", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_MAX_SN;
rtps.cc.seq_nr := gen_sn(31);
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 29", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc4;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 30", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc2;
start_rtps;
wait_on_rtps;
Log("RTPS Operation GET_CACHE_CHANGE SN 31", INFO);
rtps := DEFAULT_RTPS_WRITER_TEST;
rtps.opcode := GET_CACHE_CHANGE;
rtps.cc := cc1;
start_rtps;
wait_on_rtps;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.seq_nr := gen_sn(1);
cc.src_timestamp := gen_duration(1,0);
-- TEST: INSTANCE LOOKUP [KNOWN INSTANCE]
Log("DDS Operation LOOKUP_INSTANCE [Instance 1]", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := LOOKUP_INSTANCE;
dds.cc := cc;
dds.ret_code := RETCODE_OK;
start_dds;
wait_on_dds;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.seq_nr := gen_sn(1);
cc.src_timestamp := gen_duration(1,0);
-- TEST: INSTANCE LOOKUP [UNKNOWN INSTANCE]
Log("DDS Operation LOOKUP_INSTANCE [Unknown Instance]", INFO);
dds := DEFAULT_DDS_TEST;
dds.opcode := LOOKUP_INSTANCE;
dds.cc := cc;
dds.cc.instance:= HANDLE_NIL;
start_dds;
wait_on_dds;
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
dds_stage <= PUSH;
dds_cnt <= 0;
end if;
when PUSH =>
if (ready_in_dds = '1') then
dds_cnt <= dds_cnt + 1;
if (dds_cnt = dds.cc.payload.length-1) then
-- DEFAULT
dds_stage <= DONE;
end if;
end if;
when DONE =>
if (done_dds = '1') then
if (dds.opcode = REGISTER_INSTANCE or dds.opcode = LOOKUP_INSTANCE) then
AffirmIfEqual(ih_id, to_unsigned(instance_handle_out_dds), to_unsigned(dds.cc.instance));
else
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
end if;
dds_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
valid_in_dds <= '0';
last_word_in_dds <= '0';
data_in_dds <= (others => '0');
instance_handle_in_dds <= HANDLE_NIL;
source_ts_dds <= TIME_INVALID;
ready_out_dds <= '0';
case (dds_stage) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_handle_in_dds <= dds.cc.instance;
source_ts_dds <= dds.cc.src_timestamp;
when PUSH =>
valid_in_dds <= '1';
data_in_dds <= dds.cc.payload.data(dds_cnt);
last_word_in_dds <= dds.cc.payload.last(dds_cnt);
when others =>
null;
end case;
end process;
rtps_prc : process(all)
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
rtps_stage <= DONE;
end if;
when DONE =>
if (done_rtps = '1') then
-- DEFAULT
rtps_stage <= IDLE;
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
case (rtps.opcode) is
when GET_CACHE_CHANGE =>
if (rtps.ret_code = OK) then
AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance));
AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind));
AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr));
AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp));
rtps_stage <= CHECK;
rtps_cnt <= 0;
end if;
when GET_MIN_SN =>
AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr));
when GET_MAX_SN =>
AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr));
when others =>
null;
end case;
end if;
when CHECK =>
if (valid_out_rtps = '1') then
AffirmIfEqual(ih_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt));
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = rtps.cc.payload.length-1) then
rtps_stage <= IDLE;
end if;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN;
get_data_rtps <= '0';
ready_out_rtps <= '0';
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
seq_nr_rtps <= rtps.cc.seq_nr;
when DONE =>
if (done_rtps = '1') then
case (rtps.opcode) is
when GET_CACHE_CHANGE =>
get_data_rtps <= '1';
when others =>
null;
end case;
end if;
when CHECK =>
ready_out_rtps <= '1';
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;