blob: 782efac3487f5ff10f42fb662d2fa5d7f2f5c226 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import makecab
from StringIO import StringIO
import sys
import time
import unittest
# Test flag parsing.
class ParseFlagsTest(unittest.TestCase):
def testInputOnly(self):
flags = makecab.ParseFlags(['/V1', '/D', 'CompressionType=LZX', 'foo.txt'])
self.assertEquals(flags.input, 'foo.txt')
self.assertEquals(flags.output, 'foo.tx_')
self.assertEquals(flags.output_dir, '.')
def testInputOutput(self):
flags = makecab.ParseFlags(['bar.txt', 'd/foo.cab'])
self.assertEquals(flags.input, 'bar.txt')
self.assertEquals(flags.output, 'd/foo.cab')
self.assertEquals(flags.output_dir, '.')
def testInputOutdir(self):
flags = makecab.ParseFlags(['/L', 'outdir', 'baz.txt'])
self.assertEquals(flags.input, 'baz.txt')
self.assertEquals(flags.output, 'baz.tx_')
self.assertEquals(flags.output_dir, 'outdir')
def testInputOutputOutdir(self):
flags = makecab.ParseFlags(['/L', 'outdir', 'foo.txt', 'd/foo.cab'])
self.assertEquals(flags.input, 'foo.txt')
self.assertEquals(flags.output, 'd/foo.cab')
self.assertEquals(flags.output_dir, 'outdir')
def testHelp(self):
self.assertEquals(makecab.ParseFlags(['foo.txt', '--help']), None)
def assertFlagParseError(self, flags, expected_message_part):
with self.assertRaises(makecab.FlagParseError) as context:
makecab.ParseFlags(flags)
self.assertIn(expected_message_part, context.exception.message)
def testErrors(self):
for f in ['/D', '/L']:
self.assertFlagParseError([f], 'argument needed after')
self.assertFlagParseError(['/asdf'], 'unknown flag')
self.assertFlagParseError(['in', 'out', 'what'], 'too many paths')
self.assertFlagParseError([], 'no input file')
# Test that compression doesn't throw, and on Windows also check that
# expand.exe is able to recover input data.
class WriteCabTest(unittest.TestCase):
def testWellCompressingInput(self):
input_data = 'a' * (4 << 15)
output = StringIO()
mtime = time.mktime((2018, 1, 8, 16, 00, 00, 0, 8, -1))
makecab.WriteCab(output, StringIO(input_data), 'a.txt',
len(input_data), mtime)
if sys.platform == 'win32':
import os, shutil, subprocess, tempfile
temp_dir = tempfile.mkdtemp(suffix='.makecab_test')
try:
cab_path = os.path.join(temp_dir, 'file.cab')
out_path = os.path.join(temp_dir, 'file.out')
open(cab_path, 'wb').write(output.getvalue())
FNULL = open(os.devnull, 'w')
subprocess.check_call(['expand.exe', cab_path, out_path], stdout=FNULL)
self.assertEquals(input_data, open(out_path, 'rb').read())
finally:
shutil.rmtree(temp_dir)
if __name__ == '__main__':
unittest.main()