/****************************************************************************** * Copyright (c) 2000-2014 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ module slider { type component Nothing {}; group rawr { type union E { record { integer i } a, record of universal charstring strs } with { variant "" // to force RAW encoding } external function enc_r(in E e, out octetstring o) with { extension "prototype(fast) encode(RAW)" } external function dec_r(inout octetstring o, out E e) return integer with { extension "prototype(sliding) decode(RAW)" } } with { encode "RAW"; } /* * * * * * * * * * */ group text { type union Et { record { integer i } a, record of universal charstring strs } with { variant "BEGIN('Header: ')" variant "SEPARATOR(';')" //variant "BEGIN(1)" // to force TEXT encoding } external function enc_t(in Et e, out charstring o) with { extension "prototype(fast) encode(TEXT)" } external function dec_t(inout charstring o, out Et e) return integer with { extension "prototype(sliding) decode(TEXT)" } } with { encode "TEXT"; } /* * * * * * * * * * */ type record Data { integer int, universal charstring str } with { encode "JSON" } external function f_enc_data(in Data d) return octetstring with { extension "prototype(convert) encode(JSON)" } external function f_dec_data(inout octetstring x, out Data d) return integer with { extension "prototype(sliding) decode(JSON)" } testcase tc_slider() runs on Nothing { // Encode 2 values and put them in the same buffer (one after the other) var Data val1 := { 71, "hello" }; var Data val2 := { 19, "goodbye" }; var octetstring buffer := f_enc_data(val1) & f_enc_data(val2); // Cut the buffer into 3 parts var integer buf_len := lengthof(buffer); var integer frag_len := buf_len / 3; var octetstring part1 := substr(buffer, 0, frag_len); var octetstring part2 := substr(buffer, frag_len, frag_len); var octetstring part3 := substr(buffer, 2 * frag_len, buf_len - 2 * frag_len); // Attempt to decode part 1 -> incomplete value buffer := part1; var Data ret_val; var integer ret_code := f_dec_data(buffer, ret_val); if (ret_code != 2) { setverdict(fail, "Unexpected return code ", ret_code, " while decoding part 1 (expected 2)."); mtc.stop; } // Attempt to decode the first 2 parts -> val1 will be extracted and removed from the buffer buffer := part1 & part2; ret_code := f_dec_data(buffer, ret_val); if (ret_code != 0) { setverdict(fail, "Unexpected return code ", ret_code, " while decoding parts 1 & 2 (expected 0)."); mtc.stop; } if (ret_val != val1) { setverdict(fail, "Unexpected value ", ret_val, " while decoding parts 1 & 2 (expected ", val1, ")."); mtc.stop; } // Attempt to decode what remains of parts 1 and 2 -> incomplete value ret_code := f_dec_data(buffer, ret_val); if (ret_code != 2) { setverdict(fail, "Unexpected return code ", ret_code, " while decoding the remains (expected 2)."); } // Append part 3 to our buffer and decode it -> val2 will be extracted and removed from the buffer (the buffer will be empty in the end) buffer := buffer & part3; ret_code := f_dec_data(buffer, ret_val); if (ret_code != 0) { setverdict(fail, "Unexpected return code ", ret_code, " while decoding the remains plus part 3 (expected 0)."); mtc.stop; } if (ret_val != val2) { setverdict(fail, "Unexpected value ", ret_val, " while decoding the remains plus part 3 (expected ", val2, ")."); mtc.stop; } if (lengthof(buffer) != 0) { setverdict(fail, "The buffer is not empty after both values were extracted. Contains: ", buffer); } setverdict(pass); } control { execute(tc_slider()); } }