#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

import mozfile
import unittest
import zipfile
from mozversion import get_version


class ApkTest(unittest.TestCase):
    """test getting version information from an android .apk"""

    application_changeset = 'a'*40
    platform_changeset = 'b'*40

    def create_apk_zipfiles(self, zfile):
        zfile.writestr('application.ini',
                       """[App]\nSourceStamp=%s\n""" % self.application_changeset)
        zfile.writestr('platform.ini',
                       """[Build]\nSourceStamp=%s\n""" % self.platform_changeset)
        zfile.writestr('AndroidManifest.xml', '')

    def test_basic(self):
        with mozfile.NamedTemporaryFile() as f:
            with zipfile.ZipFile(f.name, 'w') as z:
                self.create_apk_zipfiles(z)
            v = get_version(f.name)
            self.assertEqual(v.get('application_changeset'), self.application_changeset)
            self.assertEqual(v.get('platform_changeset'), self.platform_changeset)

    def test_with_package_name(self):
        with mozfile.NamedTemporaryFile() as f:
            with zipfile.ZipFile(f.name, 'w') as z:
                self.create_apk_zipfiles(z)
                z.writestr('package-name.txt', "org.mozilla.fennec")
            v = get_version(f.name)
            self.assertEqual(v.get('package_name'), "org.mozilla.fennec")

if __name__ == '__main__':
    unittest.main()
