releasetools: Add a testcase for common.ParseCertificate().
Also minor clean up to the function, to suppress the following lint
warning.
R:1813, 2: Redefinition of cert type from list to unicode (redefined-variable-type)
Test: python -m unittest -v test_common.CommonApkUtilsTest
Change-Id: Ib4b1dfa8b19e505fc70684b648efc36171c73bbf
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index 370710e..0c87857 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -1800,17 +1800,23 @@
def ParseCertificate(data):
- """Parse a PEM-format certificate."""
- cert = []
+ """Parses and converts a PEM-encoded certificate into DER-encoded.
+
+ This gives the same result as `openssl x509 -in <filename> -outform DER`.
+
+ Returns:
+ The decoded certificate string.
+ """
+ cert_buffer = []
save = False
for line in data.split("\n"):
if "--END CERTIFICATE--" in line:
break
if save:
- cert.append(line)
+ cert_buffer.append(line)
if "--BEGIN CERTIFICATE--" in line:
save = True
- cert = "".join(cert).decode('base64')
+ cert = "".join(cert_buffer).decode('base64')
return cert
diff --git a/tools/releasetools/test_common.py b/tools/releasetools/test_common.py
index 6da286c..36dc619 100644
--- a/tools/releasetools/test_common.py
+++ b/tools/releasetools/test_common.py
@@ -13,7 +13,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+
import os
+import subprocess
import tempfile
import time
import unittest
@@ -400,6 +402,9 @@
'Compressed4.apk' : 'certs/compressed4',
}
+ def setUp(self):
+ self.testdata_dir = test_utils.get_testdata_dir()
+
def tearDown(self):
common.Cleanup()
@@ -477,17 +482,27 @@
self.assertRaises(ValueError, common.ReadApkCerts, input_zip)
def test_ExtractPublicKey(self):
- testdata_dir = test_utils.get_testdata_dir()
- cert = os.path.join(testdata_dir, 'testkey.x509.pem')
- pubkey = os.path.join(testdata_dir, 'testkey.pubkey.pem')
+ cert = os.path.join(self.testdata_dir, 'testkey.x509.pem')
+ pubkey = os.path.join(self.testdata_dir, 'testkey.pubkey.pem')
with open(pubkey, 'rb') as pubkey_fp:
self.assertEqual(pubkey_fp.read(), common.ExtractPublicKey(cert))
def test_ExtractPublicKey_invalidInput(self):
- testdata_dir = test_utils.get_testdata_dir()
- wrong_input = os.path.join(testdata_dir, 'testkey.pk8')
+ wrong_input = os.path.join(self.testdata_dir, 'testkey.pk8')
self.assertRaises(AssertionError, common.ExtractPublicKey, wrong_input)
+ def test_ParseCertificate(self):
+ cert = os.path.join(self.testdata_dir, 'testkey.x509.pem')
+
+ cmd = ['openssl', 'x509', '-in', cert, '-outform', 'DER']
+ proc = common.Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ expected, _ = proc.communicate()
+ self.assertEqual(0, proc.returncode)
+
+ with open(cert) as cert_fp:
+ actual = common.ParseCertificate(cert_fp.read())
+ self.assertEqual(expected, actual)
+
class InstallRecoveryScriptFormatTest(unittest.TestCase):
"""Checks the format of install-recovery.sh.