1 /******************************************************************************
2 * Copyright (c) 2000-2015 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 ******************************************************************************/
10 type component objidOper_comptype { }
12 external function enco(in objid oi) return octetstring
13 with { extension "prototype(convert) encode(BER:BER_ENCODE_DER)" }
15 external function deco(in octetstring oi) return objid
16 with { extension "prototype(convert) decode(BER:BER_ACCEPT_ALL)" }
18 type objid typedefbasic_myobjid;
19 type objid MyObjids0 (objid{itu_t(0) identified_organization(4) etsi(0)})
20 type objid MyObjids1 (objid{itu_t identified_organization etsi(0)})
21 type objid MyObjids2 (objid{0 4 0})
22 const integer c_etsi := 0
23 template integer t_etsi := 0
24 const objid itu_idOrg := objid{itu_t identified_organization}
25 const objid c_etsiMobNet := objid{itu_t identified_organization etsi(0) mobile_domain(0) umts_Network(1)}
26 const objid c_etsiNet := objid{itu_t identified_organization etsi(0) inDomain(1) in_Network(1)}
27 type objid MyObjids3 (objid{itu_idOrg c_etsi})
28 type objid MyObjids4 (objid{0 4 0 0}, objid{0 4 0 1})
29 type MyObjids4 MyObjids5
30 template MyObjids4 t_myobjids1 := objid{0 4 0 0}
31 // These should be allowed as well:
32 // type MyObjids MyNarrowerObjids (objid{0 4 0 0 1 0}, objid{0 4 1 1}, objid{0 4 1 3})
33 // type objid MyObjidRange (objid{0 4 0 0}..objid{0 4 0 5})
34 // But concatenation of object identifier doesn't seem to work at all...
37 const objid c_bits := objid {
75 // 4294967296 is too big
80 const objid c_pow2 := objid {
117 // 4294967296 is too big
121 const objid c_0_1_infinity // for small values of infinity
122 := objid { 0 1 4294967295 }
124 const octetstring expected := '0606018FFFFFFF7F'O
126 // encoding of { 0 1 70368744177663 } a.k.a. { 0 1 0x3FFFFFFFFFFF }
127 const octetstring bigger := '0608018FFFFFFFFFFF7F'O
130 testcase objidSubtypes() runs on objidOper_comptype {
131 if (c_etsiMobNet != c_etsiNet) { setverdict(pass) }
132 else { setverdict(fail) }
135 external function indexer(in objid o, in integer idx) return integer;
137 testcase encdec() runs on objidOper_comptype
139 var octetstring os := enco(c_0_1_infinity);
141 if (os == expected) { setverdict(pass); }
142 else { setverdict(fail, match(os, expected)); }
144 var objid oi := deco(expected);
146 if (oi == c_0_1_infinity) { setverdict(pass); }
147 else { setverdict(fail, match(oi, c_0_1_infinity)); }
149 // Decode the bigger objid. The value will overflow and it will be clamped
150 // to 2**32-1 (4294967295) as long as objid is limited to 32bits.
154 if (sizeof(oi) != sizeof(c_0_1_infinity)) {
155 setverdict(fail, "Number of objid components: ",
156 match(sizeof(oi), sizeof(c_0_1_infinity)))
159 // All components should look equal
160 for (var integer i := 0; i < sizeof(oi); i := i + 1) {
161 if (indexer(oi, i) == indexer(c_0_1_infinity, i)) { /*setverdict(pass);*/ }
163 setverdict(fail, "Mismatch at ", i, ": ",
164 match(indexer(oi, i), indexer(c_0_1_infinity, i)));
169 // However, the (decoded) oi has an overflow whereas c_0_1_infinity does not,
170 // therefore they (should) compare as not equal.
171 if (oi != c_0_1_infinity) { setverdict(pass, match(oi, c_0_1_infinity)); }
172 else { setverdict(fail, match(oi, c_0_1_infinity)); }
177 if (sizeof(oi) != sizeof(c_bits)) {
178 setverdict(fail, "Number of objid components: ",
179 match(sizeof(oi), sizeof(c_bits)))
182 // All components should look equal
183 for (var integer i := 0; i < sizeof(oi); i := i + 1) {
184 if (indexer(oi, i) == indexer(c_bits, i)) { /*setverdict(pass);*/ }
186 setverdict(fail, "Mismatch at ", i, ": ",
187 match(indexer(oi, i), indexer(c_bits, i)));
195 if (sizeof(oi) != sizeof(c_pow2)) {
196 setverdict(fail, "Number of objid components: ",
197 match(sizeof(oi), sizeof(c_pow2)))
200 // All components should look equal
201 for (var integer i := 0; i < sizeof(oi); i := i + 1) {
202 if (indexer(oi, i) == indexer(c_pow2, i)) { /*setverdict(pass);*/ }
204 setverdict(fail, "Mismatch at ", i, ": ",
205 match(indexer(oi, i), indexer(c_pow2, i)));
212 testcase objidWithVars() runs on objidOper_comptype
215 var integer v2 := 20;
216 var integer v3 := 300;
217 var integer v4 := -87;
218 const integer c1 := 0;
219 var objid o1 := objid { c1 v1 };
221 if (o1 == objid { 0 1 }) { setverdict(pass); }
222 else { setverdict(fail, o1, " != ", objid { 0 1 }); }
224 if (objid { c1 3 v2 } == objid { 0 3 20 }) { setverdict(pass); }
225 else { setverdict(fail, objid { c1 3 v2 }, " != ", objid { 0 3 20 }); }
227 if (objid { c1 2 3 } == objid { 0 2 3 }) { setverdict(pass); }
228 else { setverdict(fail, objid { c1 2 3 }, " != ", objid { 0 2 3 }); }
230 var objid o2 := objid { 0 v1 };
231 if (o1 == o2) { setverdict(pass); }
232 else { setverdict(fail, o1, " != ", o2); }
235 var objid o_bad := objid { v1 v2 v3 v4 };
236 setverdict(fail, "error expected when creating ", objid { v1 v2 v3 v4 });
239 if (match(msg, pattern "*Dynamic test case error: An OBJECT IDENTIFIER component cannot be negative")) { setverdict(pass); }
240 else { setverdict(fail, "unexpected error: ", msg); }
243 var template objid to1 := (objid { 0 1 6 }, objid { v1 6 v3 });
245 if (match(objid { 1 6 v3 }, to1)) { setverdict(pass); }
246 else { setverdict(fail, objid { 1 6 v3 }, " doesn't match ", to1); }
248 if (match(objid { 1 2 3 }, to1)) { setverdict(fail, objid { 1 2 3 }, " matches ", to1); }
249 else { setverdict(pass); }
253 execute(objidSubtypes());
255 execute(objidWithVars());