diff options
-rw-r--r-- | CHANGES.rst | 3 | ||||
-rw-r--r-- | pyasn1/codec/ber/encoder.py | 2 | ||||
-rw-r--r-- | tests/codec/der/test_encoder.py | 67 |
3 files changed, 71 insertions, 1 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index 65e3f16..a52d87a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -14,6 +14,9 @@ Revision 0.4.1, released XX-10-2017 - Changed `Null` object initialization behaviour: previous default value (`''`) is not set anymore. Thus `Null()` call produces a ASN.1 schema object, while `Null('')` - value object. +- Fixed ASN.1 encoder not to omit empty substrate produced for inner + component if the inner component belongs to the simple class (as + opposed to constructed class). Revision 0.3.7, released 04-10-2017 ----------------------------------- diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index 838d446..97a1390 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -80,7 +80,7 @@ class AbstractItemEncoder(object): value, asn1Spec, encodeFun, **options ) - if options.get('ifNotEmpty', False) and not substrate: + if not substrate and isConstructed and options.get('ifNotEmpty', False): return substrate # primitive form implies definite mode diff --git a/tests/codec/der/test_encoder.py b/tests/codec/der/test_encoder.py index 3059c0c..66a8a91 100644 --- a/tests/codec/der/test_encoder.py +++ b/tests/codec/der/test_encoder.py @@ -289,6 +289,73 @@ class NestedOptionalSequenceOfEncoderTestCase(BaseTestCase): assert encoder.encode(s) == ints2octs((48, 0)) +class EmptyInnerFieldOfSequenceEncoderTestCase(BaseTestCase): + + def testInitializedOptionalNullIsEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.OptionalNamedType('null', univ.Null()) + ) + ) + + self.s.clear() + self.s[0] = '' + assert encoder.encode(self.s) == ints2octs((48, 2, 5, 0)) + + def testUninitializedOptionalNullIsNotEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.OptionalNamedType('null', univ.Null()) + ) + ) + + self.s.clear() + assert encoder.encode(self.s) == ints2octs((48, 0)) + + def testInitializedDefaultNullIsNotEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.DefaultedNamedType('null', univ.Null('')) + ) + ) + + self.s.clear() + self.s[0] = '' + assert encoder.encode(self.s) == ints2octs((48, 0)) + + def testInitializedOptionalOctetStringIsEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.OptionalNamedType('str', univ.OctetString()) + ) + ) + + self.s.clear() + self.s[0] = '' + assert encoder.encode(self.s) == ints2octs((48, 2, 4, 0)) + + def testUninitializedOptionalOctetStringIsNotEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.OptionalNamedType('str', univ.OctetString()) + ) + ) + + self.s.clear() + assert encoder.encode(self.s) == ints2octs((48, 0)) + + def testInitializedDefaultOctetStringIsNotEncoded(self): + self.s = univ.Sequence( + componentType=namedtype.NamedTypes( + namedtype.DefaultedNamedType('str', univ.OctetString('')) + ) + ) + + self.s.clear() + self.s[0] = '' + assert encoder.encode(self.s) == ints2octs((48, 0)) + + suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) if __name__ == '__main__': |