diff --git a/compiler2/subtype.hh b/compiler2/subtype.hh index a18ed840aa7b2541eb5a0c1ad7b6521e2cd083fe..e298475a4ed63ddf7b648507dae8d5ac9b3c7469 100644 --- a/compiler2/subtype.hh +++ b/compiler2/subtype.hh @@ -221,9 +221,15 @@ public: bool is_subtype_notempty() const { size_limit_t sl; return (subtype==ST_INTEGER && integer_st && !integer_st->is_empty()) || - (subtype==ST_BITSTRING && bitstring_st && !bitstring_st->is_empty()) || - (subtype==ST_HEXSTRING && hexstring_st && !hexstring_st->is_empty()) || - (subtype==ST_OCTETSTRING && octetstring_st && !octetstring_st->is_empty()) || + (subtype==ST_BITSTRING && bitstring_st && !bitstring_st->is_empty() && + bitstring_st->get_size_limit(false, sl) == TTRUE && + bitstring_st->get_size_limit(true, sl) == TTRUE) || + (subtype==ST_HEXSTRING && hexstring_st && !hexstring_st->is_empty() && + hexstring_st->get_size_limit(false, sl) == TTRUE && + hexstring_st->get_size_limit(true, sl) == TTRUE) || + (subtype==ST_OCTETSTRING && octetstring_st && !octetstring_st->is_empty() && + octetstring_st->get_size_limit(false, sl) == TTRUE && + octetstring_st->get_size_limit(true, sl) == TTRUE) || (subtype==ST_CHARSTRING && charstring_st && charstring_st->get_size_limit(false, sl) == TTRUE && charstring_st->get_size_limit(true, sl) == TTRUE) || diff --git a/compiler2/union.c b/compiler2/union.c index 95350af71a3e1ddf5179c6b8e9dfea1c9b65b9d8..4b07424f8d4ecdfcc728109bb6a297865feb7f61 100644 --- a/compiler2/union.c +++ b/compiler2/union.c @@ -2371,8 +2371,11 @@ void defUnionClass(struct_def const *sdef, output_struct *output) if (oer_needed) { // OER encode src = mputprintf(src, - "int %s::OER_encode(const TTCN_Typedescriptor_t&, TTCN_Buffer& p_buf) const\n" + "int %s::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) const\n" "{\n", name); + if (use_runtime_2) { + src = mputstr(src, " if (err_descr) return OER_encode_negtest(err_descr, p_td, p_buf);\n"); + } src = mputstr(src, " switch(union_selection) {\n"); for (i = 0; i < sdef->nElements; ++i) { src = mputprintf(src, " case %s_%s:\n", selection_prefix, sdef->elements[i].name); @@ -2410,12 +2413,61 @@ void defUnionClass(struct_def const *sdef, output_struct *output) "int OER_encode_negtest(const Erroneous_descriptor_t*, " "const TTCN_Typedescriptor_t&, TTCN_Buffer&) const;\n"); src = mputprintf(src, - "int %s::OER_encode_negtest(const Erroneous_descriptor_t*, " - "const TTCN_Typedescriptor_t&, TTCN_Buffer&) const {\n" - " return 0;\n" - "}\n" + "int %s::OER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, " + "const TTCN_Typedescriptor_t&, TTCN_Buffer& p_buf) const {\n" , name); - //todo + if (sdef->nElements > 0) { + src = mputstr(src, + " const Erroneous_values_t* err_vals = NULL;\n" + " const Erroneous_descriptor_t* emb_descr = NULL;\n" + " switch(union_selection) {\n"); + + for (i = 0; i < sdef->nElements; ++i) { + src = mputprintf(src, + " case %s_%s:\n" + " err_vals = p_err_descr->get_field_err_values(%d);\n" + " emb_descr = p_err_descr->get_field_emb_descr(%d);\n" + " if (NULL != err_vals && NULL != err_vals->value) {\n" + " if (NULL != err_vals->value->errval) {\n" + " if(err_vals->value->raw){\n" + " err_vals->value->errval->OER_encode_negtest_raw(p_buf);\n" + " } else {\n" + " if (NULL == err_vals->value->type_descr) {\n" + " TTCN_error(\"internal error: erroneous value typedescriptor missing\");\n" + " }\n" + " encode_oer_tag(*err_vals->value->type_descr->ber, p_buf);\n" + " err_vals->value->errval->OER_encode(*err_vals->value->type_descr, p_buf);\n" + " }\n" + " }\n" + " } else {\n" + " if (NULL != emb_descr) {\n" + " field_%s->OER_encode_negtest(emb_descr, %s_descr_, p_buf);\n" + " } else {\n" + " field_%s->OER_encode(%s_descr_, p_buf);\n" + " }\n" + " }\n" + " break;\n" + , selection_prefix, sdef->elements[i].name, (int)i, (int)i + , sdef->elements[i].name, sdef->elements[i].typedescrname + , sdef->elements[i].name, sdef->elements[i].typedescrname); + } + src = mputprintf(src, + " default:\n" + " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, \n" + " \"Encoding an unbound value of type %s.\");\n" + " return -1;\n" + " }\n\n" + " return 0;\n" + "}\n\n" + , dispname); + } + else { + src = mputprintf(src, + " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, \n" + " \"Cannot encode union of type %s, because it has zero alternatives.\");\n" + " return -1;\n" + "}\n\n", dispname); + } } // OER decode src = mputprintf(src, diff --git a/core/Octetstring.cc b/core/Octetstring.cc index 6973c7290d32c7bcda690283566c65a45db1bfd0..fdf43f4c3356c8870344c0003f10730003872a54 100644 --- a/core/Octetstring.cc +++ b/core/Octetstring.cc @@ -808,6 +808,15 @@ int OCTETSTRING::JSON_encode_negtest_raw(JSON_Tokenizer& p_tok) const } return 0; } + +int OCTETSTRING::OER_encode_negtest_raw(TTCN_Buffer& p_buf) const +{ + if (val_ptr != NULL) { + p_buf.put_os(*this); + return val_ptr->n_octets; + } + return 0; +} #endif boolean OCTETSTRING::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, diff --git a/core/Octetstring.hh b/core/Octetstring.hh index 3323c9c3b6df40f4180342faed8cb5d0b36e622a..6ecc3089b33feabb529b404c69d4c1850a60b91f 100644 --- a/core/Octetstring.hh +++ b/core/Octetstring.hh @@ -161,6 +161,7 @@ public: * Used during the negative testing of the JSON encoder. * @return The number of bytes added. */ int JSON_encode_negtest_raw(JSON_Tokenizer&) const; + int OER_encode_negtest_raw(TTCN_Buffer&) const; #endif boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); diff --git a/core2/Basetype2.cc b/core2/Basetype2.cc index ad9641990f24887bd4ca8f24d1aa9b11960d4f7a..71eac887b270f1b3f39e9089bf5f481a609fc92e 100644 --- a/core2/Basetype2.cc +++ b/core2/Basetype2.cc @@ -1666,6 +1666,11 @@ int Record_Of_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenize } int Record_Of_Type::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) const { + + if (err_descr) { + return OER_encode_negtest(err_descr, p_td, p_buf); + } + if (!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, "Encoding an unbound %s of value.", is_set() ? "set" : "record"); @@ -1678,8 +1683,102 @@ int Record_Of_Type::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p return 0; } -int Record_Of_Type::OER_encode_negtest(const Erroneous_descriptor_t*, const TTCN_Typedescriptor_t&, TTCN_Buffer&) const { - //TODO +int Record_Of_Type::OER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) const { + if (!is_bound()) { + TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, + "Encoding an unbound %s of value.", is_set() ? "set" : "record"); + return -1; + } + int values_idx = 0; + int nof_elems = get_nof_elements(); + for (int i = 0; i < get_nof_elements(); ++i) { + const Erroneous_values_t* err_vals = p_err_descr->next_field_err_values(i, values_idx); + if (-1 != p_err_descr->omit_before && p_err_descr->omit_before > i) { + nof_elems--; + continue; + } + + if (NULL != err_vals && NULL != err_vals->before) { + if (err_vals->before->raw == FALSE) { + nof_elems++; + } + } + + if (NULL != err_vals && NULL != err_vals->after) { + if (err_vals->after->raw == FALSE) { + nof_elems++; + } + } + + if (-1 != p_err_descr->omit_after && p_err_descr->omit_after < i) { + nof_elems--; + continue; + } + } + encode_oer_length(nof_elems, p_buf, TRUE); + values_idx = 0; + int edescr_idx = 0; + for (int i = 0; i < get_nof_elements(); ++i) { + if (-1 != p_err_descr->omit_before && p_err_descr->omit_before > i) { + continue; + } + + const Erroneous_values_t* err_vals = p_err_descr->next_field_err_values(i, values_idx); + const Erroneous_descriptor_t* emb_descr = p_err_descr->next_field_emb_descr(i, edescr_idx); + + if (NULL != err_vals && NULL != err_vals->before) { + if (NULL == err_vals->before->errval) { + TTCN_error("internal error: erroneous before value missing"); + } + if (err_vals->before->raw) { + err_vals->before->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->before->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + err_vals->before->errval->OER_encode(*(err_vals->before->type_descr), p_buf); + } + } + + if (NULL != err_vals && NULL != err_vals->value) { + if (NULL != err_vals->value->errval) { + if (err_vals->value->raw) { + err_vals->value->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->value->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + err_vals->value->errval->OER_encode(*(err_vals->value->type_descr), p_buf); + } + } + } + else { + if (NULL != emb_descr) { + get_at(i)->OER_encode_negtest(emb_descr, *p_td.oftype_descr, p_buf); + } else { + get_at(i)->OER_encode(*p_td.oftype_descr, p_buf); + } + } + + if (NULL != err_vals && NULL != err_vals->after) { + if (NULL == err_vals->after->errval) { + TTCN_error("internal error: erroneous after value missing"); + } + if (err_vals->after->raw) { + err_vals->after->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->after->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + err_vals->after->errval->OER_encode(*(err_vals->after->type_descr), p_buf); + } + } + + if (-1 != p_err_descr->omit_after && p_err_descr->omit_after <= i) { + break; + } + } + return 0; } @@ -6147,7 +6246,12 @@ int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& return (int)dec_len; } -int Record_Type::OER_encode(const TTCN_Typedescriptor_t&, TTCN_Buffer& p_buf) const { +int Record_Type::OER_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf) const { + + if (err_descr) { + return OER_encode_negtest(err_descr, p_td, p_buf); + } + if (!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, "Encoding an unbound %s value.", is_set() ? "set" : "record"); @@ -6182,8 +6286,101 @@ int Record_Type::OER_encode(const TTCN_Typedescriptor_t&, TTCN_Buffer& p_buf) co return 0; } -int Record_Type::OER_encode_negtest(const Erroneous_descriptor_t*, const TTCN_Typedescriptor_t&, TTCN_Buffer&) const { - //TODO +int Record_Type::OER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, const TTCN_Typedescriptor_t&, TTCN_Buffer& p_buf) const { + int values_idx = 0; + int edescr_idx = 0; + int field_count = get_count(); + int next_default_idx = 0; + const default_struct* default_indexes = get_default_indexes(); + int pos = 8; + char c = 0; + for (int i = 0; i < field_count; i++) { + boolean is_default_field = default_indexes && (default_indexes[next_default_idx].index==i); + if (is_default_field) { + next_default_idx++; + } + if (get_at(i)->is_optional() || is_default_field) { + pos--; + const Erroneous_values_t* err_vals = p_err_descr->next_field_err_values(i, values_idx); + int present = 1; + if ((NULL != err_vals && NULL != err_vals->value && NULL == err_vals->value->errval) || !get_at(i)->is_present()) { + present = 0; + } + c += present << pos; + if (pos == 0) { + p_buf.put_c(c); + pos = 8; + c = 0; + } + } + } + if (pos != 8) { + p_buf.put_c(c); + } + values_idx = 0; + for (int i = 0; i < field_count; ++i) { + if (-1 != p_err_descr->omit_before && p_err_descr->omit_before > i) { + continue; + } + + const Erroneous_values_t* err_vals = p_err_descr->next_field_err_values(i, values_idx); + const Erroneous_descriptor_t* emb_descr = p_err_descr->next_field_emb_descr(i, edescr_idx); + + if (NULL != err_vals && NULL != err_vals->before) { + if (NULL == err_vals->before->errval) { + TTCN_error("internal error: erroneous before value missing"); + } + if (err_vals->before->raw) { + err_vals->before->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->before->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + // it's an extra field + err_vals->before->errval->OER_encode(*(err_vals->before->type_descr), p_buf); + } + } + + if (NULL != err_vals && NULL != err_vals->value) { + if (NULL != err_vals->value->errval) { + if (err_vals->value->raw) { + err_vals->value->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->value->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + err_vals->value->errval->OER_encode(*(err_vals->value->type_descr), p_buf); + } + } + } else { + if (NULL != fld_descr(i)->oer || get_at(i)->is_present()) { + if (NULL != emb_descr) { + get_at(i)->OER_encode_negtest(emb_descr, *fld_descr(i), p_buf); + } else { + get_at(i)->OER_encode(*fld_descr(i), p_buf); + } + } + } + + if (NULL != err_vals && NULL != err_vals->after) { + if (NULL == err_vals->after->errval) { + TTCN_error("internal error: erroneous after value missing"); + } + if (err_vals->after->raw) { + err_vals->after->errval->OER_encode_negtest_raw(p_buf); + } else { + if (NULL == err_vals->after->type_descr) { + TTCN_error("internal error: erroneous before typedescriptor missing"); + } + // it's an extra field + err_vals->after->errval->OER_encode(*(err_vals->after->type_descr), p_buf); + } + } + + if (-1 != p_err_descr->omit_after && p_err_descr->omit_after <= i) { + break; + } + } return 0; } diff --git a/regression_test/OER/Types.asn b/regression_test/OER/Types.asn index e191a110fffc4169b3e0cef06e675c42b3156f73..413f2c438373fd790acbbd7c2b556f3e921eecc8 100644 --- a/regression_test/OER/Types.asn +++ b/regression_test/OER/Types.asn @@ -43,6 +43,10 @@ Unsigned8byteInt ::= INTEGER (0..18446744073709551615) Signed8byteInt ::= INTEGER (-9223372036854775808..9223372036854775807) +-- Some compile only check +OperationReturnID-CIP ::= [1] OCTET STRING ('010001'H) +OperationReturnID-CIP2 ::= [1] BIT STRING ('010001'B) + MyEnum ::= ENUMERATED { e0 (0), diff --git a/regression_test/negativeTest/Makefile b/regression_test/negativeTest/Makefile index 00307792ab5b9bedfa48aeb23ec56a5fa0f30337..45185d0be095e51aa5cad95782fc2f580a5aa6e4 100644 --- a/regression_test/negativeTest/Makefile +++ b/regression_test/negativeTest/Makefile @@ -42,7 +42,7 @@ TTCN3_MODULES = negtest.ttcn NegTestTestcases.ttcn \ NegTest_TEXT_Types.ttcn NegTest_TEXT_Testcases.ttcn \ NegTest_RAW_Types.ttcn NegTest_RAW_Testcases.ttcn \ www_XmlTest_org_negativeTest_XML_Types.ttcn NegTest_XML_Testcases.ttcn XSD.ttcn UsefulTtcn3Types.ttcn \ -NegTest_JSON.ttcn NegTest_Update.ttcn +NegTest_JSON.ttcn NegTest_Update.ttcn NegTest_OER.ttcn ASN1_MODULES = Types.asn NegTestTypes.asn @@ -117,6 +117,9 @@ run5: $(TARGET) run6: $(TARGET) ./$(TARGET) NegTest_JSON.cfg +run7: $(TARGET) + ./$(TARGET) NegTest_OER.cfg + ifeq ($(findstring n,$(MAKEFLAGS)),) ifeq ($(filter clean check compile archive diag,$(MAKECMDGOALS)),) diff --git a/regression_test/negativeTest/NegTestTypes.asn b/regression_test/negativeTest/NegTestTypes.asn index 163362ee20ee24a36b36af843063bcb8501f4f27..fcffefca048f1ee4ef2e966b62fdbb2e803c6d35 100644 --- a/regression_test/negativeTest/NegTestTypes.asn +++ b/regression_test/negativeTest/NegTestTypes.asn @@ -66,6 +66,8 @@ MySeqInt3 ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER } MySeqInt4 ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER, l INTEGER } MySeqInt4opt ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER, l INTEGER OPTIONAL} MySeqInt5opt ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER, l INTEGER, m INTEGER OPTIONAL} +MySeqIntOpt ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER, l INTEGER OPTIONAL} +MySeqIntDef ::= SEQUENCE { i INTEGER, j INTEGER, k INTEGER, l INTEGER DEFAULT 4} MySeqReal ::= SEQUENCE { x REAL } MySeqReal2 ::= SEQUENCE { x REAL, y REAL OPTIONAL} diff --git a/regression_test/negativeTest/NegTest_OER.cfg b/regression_test/negativeTest/NegTest_OER.cfg new file mode 100644 index 0000000000000000000000000000000000000000..a73cd5b1e8e3fbb66755946b354757a612b9573e --- /dev/null +++ b/regression_test/negativeTest/NegTest_OER.cfg @@ -0,0 +1,20 @@ +############################################################################### +# Copyright (c) 2000-2017 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 +# +# Contributors: +# Szabo, Bence Janos +# +############################################################################### +[LOGGING] +LogFile := "NegTest_OER.log" +ConsoleMask := TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | TTCN_WARNING +FileMask := TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | TTCN_WARNING | TTCN_USER | DEBUG_ENCDEC | VERDICTOP +SourceInfoFormat := Stack +LogEventTypes := Detailed + +[EXECUTE] +NegTest_OER.control diff --git a/regression_test/negativeTest/NegTest_OER.ttcn b/regression_test/negativeTest/NegTest_OER.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..605ea3b1ddd4ae72606e29fe31d490abc926a79e --- /dev/null +++ b/regression_test/negativeTest/NegTest_OER.ttcn @@ -0,0 +1,264 @@ +/****************************************************************************** + * Copyright (c) 2000-2017 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 + * + * Contributors: + * Szabo, Bence Janos + * + ******************************************************************************/ + +// This module tests the 'negative testing' feature of the OER encoder. +module NegTest_OER { + +import from NegTestTypes all; + +type component CT {} + +/************ Encoding functions ************/ +external function f_enc_msb(in MySeqBool x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_msi4(in MySeqInt4 x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_opt(in MySeqIntOpt x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_def(in MySeqIntDef x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_MySetIntSeqIntSeqInt2SeqReal2(in MySetIntSeqIntSeqInt2SeqReal2 x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_MySeqOfInt(in MySeqOfInt x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +external function f_enc_MyUnionBasicTypes(in MyUnionBasicTypes x) return octetstring + with { extension "prototype(convert) encode(OER)" } + +/************* Erroneous values *************/ +const MySeqBool msb1 := { b := false } with { erroneous(b) "value := true" }; +const MySeqBool msb2 := { b := false } with { erroneous(b) "value := integer:1" }; +const MySeqBool msb3 := { b := false } with { erroneous(b) "value := omit" }; + +const MySeqInt4 msi1 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(k) "before := omit all" }; +const MySeqInt4 msi2 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "after := omit all" }; +const MySeqInt4 msi3 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "value(raw) := 'ABCDEF'O" }; +const MySeqInt4 msi4 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "after(raw) := 'ABCDEF'O" }; +const MySeqInt4 msi5 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "before(raw) := 'ABCDEF'O" }; +const MySeqInt4 msi6 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "after := integer:8" }; +const MySeqInt4 msi7 := { i := 1, j := 2, k := 3, l := 4 } with { erroneous(j) "before := integer:8" }; + +const MySeqIntOpt msiaod1 := {i := 1, j := 2, k := 3, l := 4} with { erroneous(j) "value := omit" }; +const MySeqIntDef msiaod2 := {i := 1, j := 2, k := 3, l := 4} with { erroneous(j) "value := omit" }; +const MySeqIntDef msiaod3 := {i := 1, j := 2, k := 3, l := 4} with { erroneous(l) "value := omit" }; + +const MySetIntSeqIntSeqInt2SeqReal2 msisiqisr := { i := 2, jkl := {i := 3, jk := {i := 4, j := 5}}, xy := {x := 1.0, y := 2.0}} +with { erroneous(i) "value := 1"; + erroneous(jkl.i) "value := 2"; + erroneous(jkl.jk.j) "value := 4";} + +const MySeqOfInt msoi1 := {1,2,3,4} with {erroneous([0]) "value := 2"}; +const MySeqOfInt msoi2 := {1,2,3,4} with {erroneous([1]) "value := omit"}; +const MySeqOfInt msoi3 := {1,2,3,4} with {erroneous([1]) "value := MyCharstring:\"asd\""}; + +const MySeqOfInt msoi4 := {1,2,3,4} with {erroneous([2]) "before := omit all"}; +const MySeqOfInt msoi5 := {1,2,3,4} with {erroneous([1]) "after := omit all"}; +const MySeqOfInt msoi6 := {1,2,3,4} with {erroneous([2]) "value(raw) := 'ABCDEF'O"}; +const MySeqOfInt msoi7 := {1,2,3,4} with {erroneous([2]) "before(raw) := 'ABCDEF'O"}; +const MySeqOfInt msoi8 := {1,2,3,4} with {erroneous([2]) "after(raw) := 'ABCDEF'O"}; +const MySeqOfInt msoi9 := {1,2,3,4} with {erroneous([2]) "after := MyCharstring:\"asd\""}; +const MySeqOfInt msoi10 := {1,2,3,4} with {erroneous([2]) "before := MyCharstring:\"asd\""}; + +const MyUnionBasicTypes mubt1 := { i := 1 } with {erroneous(i) "value := 2"}; +const MyUnionBasicTypes mubt2 := { i := 1 } with {erroneous(i) "value := MyCharstring:\"asd\""}; +const MyUnionBasicTypes mubt3 := { i := 1 } with {erroneous(i) "value := omit"}; +const MyUnionBasicTypes mubt4 := { i := 1 } with {erroneous(i) "value(raw) := 'ABCD'O"}; + +/******** Test cases for records ********/ +testcase tc_record_change_value() runs on CT { + var octetstring res := f_enc_msb(msb1); + log(res); + if ('FF'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msb(msb2); + log(res); + if ('0101'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msb(msb3); + log(res); + if (''O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_omit_before_after() runs on CT { + var octetstring res := f_enc_msi4(msi1); + log(res); + if ('01030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msi4(msi2); + log(res); + if ('01010102'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_raw() runs on CT { + var octetstring res := f_enc_msi4(msi3); + log(res); + if ('0101ABCDEF01030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msi4(msi4); + log(res); + if ('01010102ABCDEF01030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msi4(msi5); + log(res); + if ('0101ABCDEF010201030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_insert() runs on CT { + var octetstring res := f_enc_msi4(msi6); + log(res); + if ('01010102010801030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_msi4(msi7); + log(res); + if ('01010108010201030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_optional() runs on CT { + var octetstring res := f_enc_opt(msiaod1); + log(res); + if ('80010101030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_def(msiaod2); + log(res); + if ('80010101030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_def(msiaod3); + log(res); + if ('00010101020103'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_deep() runs on CT { + var octetstring res := f_enc_MySetIntSeqIntSeqInt2SeqReal2(msisiqisr); + log(res); + if ('800101010201040104800603312E452B300603322E452B30'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +/******** Test cases for record-ofs ********/ +testcase tc_record_of_change_value() runs on CT { + var octetstring res := f_enc_MySeqOfInt(msoi1); + log(res); + if ('01040102010201030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi2); + log(res); + if ('0104010101030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi3); + log(res); + if ('010401010361736401030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_of_omit_before_after() runs on CT { + var octetstring res := f_enc_MySeqOfInt(msoi4); + log(res); + if ('010201030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi5); + log(res); + if ('010201010102'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_of_raw() runs on CT { + var octetstring res := f_enc_MySeqOfInt(msoi6); + log(res); + if ('010401010102ABCDEF0104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi7); + log(res); + if ('010401010102ABCDEF01030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi8); + log(res); + if ('0104010101020103ABCDEF0104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +testcase tc_record_of_insert() runs on CT { + var octetstring res := f_enc_MySeqOfInt(msoi9); + log(res); + if ('0105010101020103036173640104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MySeqOfInt(msoi10); + log(res); + if ('0105010101020361736401030104'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + +/******** Test cases for unions ********/ +testcase tc_union_change_value() runs on CT { + var octetstring res := f_enc_MyUnionBasicTypes(mubt1); + log(res); + if ('020102'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MyUnionBasicTypes(mubt2); + log(res); + if ('1A03617364'O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MyUnionBasicTypes(mubt3); + log(res); + if (''O == res) { setverdict(pass); } + else { setverdict(fail, res); } + + res := f_enc_MyUnionBasicTypes(mubt4); + log(res); + if ('ABCD'O == res) { setverdict(pass); } + else { setverdict(fail, res); } +} + + +/*************** Control part ***************/ +control { + execute(tc_record_change_value()); + execute(tc_record_omit_before_after()); + execute(tc_record_raw()); + execute(tc_record_insert()); + execute(tc_record_optional()); + execute(tc_record_deep()); + + execute(tc_record_of_change_value()); + execute(tc_record_of_omit_before_after()); + execute(tc_record_of_raw()); + execute(tc_record_of_insert()); + + execute(tc_union_change_value()); +} + +} diff --git a/regression_test/negativeTest/NegTest_all.cfg b/regression_test/negativeTest/NegTest_all.cfg index 7fa14c846e6fdac85b55349392796ffc82c783e6..14e1544fd3bfdaaaf0ab027c73f5dfaa5f060120 100644 --- a/regression_test/negativeTest/NegTest_all.cfg +++ b/regression_test/negativeTest/NegTest_all.cfg @@ -26,5 +26,6 @@ NegTest_XML_Testcases.control NegTest_RAW_Testcases.control NegTest_JSON.control NegTest_Update.control +NegTest_OER.control //saved by GUI diff --git a/usrguide/referenceguide.doc b/usrguide/referenceguide.doc index 382f254c2f9c0936ade156f53314d138366b75f6..7b2dd2e5409004847081863e214b20fd909d28fb 100644 Binary files a/usrguide/referenceguide.doc and b/usrguide/referenceguide.doc differ