summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2017-10-17 00:31:04 +0200
committerGitHub <noreply@github.com>2017-10-17 00:31:04 +0200
commit475a2fb1f3493a1d7ee8b91161132dc51f3d066e (patch)
tree4e820cd1beb9f018b36e02f8184f9806b85effbf
parentd1f9acd3859b7e40494bd619ab2e1c52dd72379c (diff)
downloadpyasn1-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.rst3
-rw-r--r--pyasn1/codec/ber/encoder.py2
-rw-r--r--tests/codec/der/test_encoder.py67
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__':