1 /******************************************************************************
2 * Copyright (c) 2000-2014 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)); }
179 if (sizeof(oi) != sizeof(c_bits)) {
180 setverdict(fail, "Number of objid components: ",
181 match(sizeof(oi), sizeof(c_bits)))
184 // All components should look equal
185 for (var integer i := 0; i < sizeof(oi); i := i + 1) {
186 if (indexer(oi, i) == indexer(c_bits, i)) { /*setverdict(pass);*/ }
188 setverdict(fail, "Mismatch at ", i, ": ",
189 match(indexer(oi, i), indexer(c_bits, i)));
199 if (sizeof(oi) != sizeof(c_pow2)) {
200 setverdict(fail, "Number of objid components: ",
201 match(sizeof(oi), sizeof(c_pow2)))
204 // All components should look equal
205 for (var integer i := 0; i < sizeof(oi); i := i + 1) {
206 if (indexer(oi, i) == indexer(c_pow2, i)) { /*setverdict(pass);*/ }
208 setverdict(fail, "Mismatch at ", i, ": ",
209 match(indexer(oi, i), indexer(c_pow2, i)));
216 testcase objidWithVars() runs on objidOper_comptype
219 var integer v2 := 20;
220 var integer v3 := 300;
221 var integer v4 := -87;
222 const integer c1 := 0;
223 var objid o1 := objid { c1 v1 };
226 if (o1 == objid { 0 1 }) { setverdict(pass); }
227 else { setverdict(fail, o1, " != ", objid { 0 1 }); }
229 if (objid { c1 3 v2 } == objid { 0 3 20 }) { setverdict(pass); }
230 else { setverdict(fail, objid { c1 3 v2 }, " != ", objid { 0 3 20 }); }
232 if (objid { c1 2 3 } == objid { 0 2 3 }) { setverdict(pass); }
233 else { setverdict(fail, objid { c1 2 3 }, " != ", objid { 0 2 3 }); }
235 var objid o2 := objid { 0 v1 };
236 if (o1 == o2) { setverdict(pass); }
237 else { setverdict(fail, o1, " != ", o2); }
240 var objid o_bad := objid { v1 v2 v3 v4 };
241 setverdict(fail, "error expected when creating ", objid { v1 v2 v3 v4 });
244 if (match(msg, pattern "*Dynamic test case error: An OBJECT IDENTIFIER component cannot be negative")) { setverdict(pass); }
245 else { setverdict(fail, "unexpected error: ", msg); }
248 var template objid to1 := (objid { 0 1 6 }, objid { v1 6 v3 });
252 if (match(objid { 1 6 v3 }, to1)) { setverdict(pass); }
253 else { setverdict(fail, objid { 1 6 v3 }, " doesn't match ", to1); }
255 if (match(objid { 1 2 3 }, to1)) { setverdict(fail, objid { 1 2 3 }, " matches ", to1); }
256 else { setverdict(pass); }
260 execute(objidSubtypes());
262 execute(objidWithVars());