diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-10-17 00:31:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-17 00:31:04 +0200 |
commit | 475a2fb1f3493a1d7ee8b91161132dc51f3d066e (patch) | |
tree | 4e820cd1beb9f018b36e02f8184f9806b85effbf | |
parent | d1f9acd3859b7e40494bd619ab2e1c52dd72379c (diff) | |
download | pyasn1-git-475a2fb1f3493a1d7ee8b91161132dc51f3d066e.tar.gz |
fixed encoder not to omit empty substrate for simple types (#92)
Fix to encoder to omit empty substrate only for constructed types
-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__': |