Adjust line breaks, binary extension on Windows

This commit is contained in:
LeoHsiao 2020-09-02 22:58:49 +08:00
parent 7fc960c520
commit c7bf5dd12a
3 changed files with 72 additions and 56 deletions

View File

@ -69,8 +69,8 @@ class TestCases(unittest.TestCase):
out += 'Testcase 4'
out += '=========='
BT.save(BT.cat('j.xmp').replace('<rdf:li xml:lang="de-DE">The Exif image description</rdf:li>',
'<rdf:li xml:lang="de-DE">The Exif image description</rdf:li><rdf:li xml:lang="it-IT">Ciao bella</rdf:li>'),
'k.xmp')
'<rdf:li xml:lang="de-DE">The Exif image description</rdf:li><rdf:li xml:lang="it-IT">Ciao bella</rdf:li>')
,'k.xmp')
BT.copyTestFile(jpg, 'k.jpg')
out += BT.execute('exiv2 -iX k.jpg')
out += BT.execute('exiv2 -px k.jpg')
@ -298,7 +298,8 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
,'exiv2-sony-dsc-w7.jpg'
,'exiv2-canon-eos-20d.jpg'
,'exiv2-canon-eos-d30.jpg'
,'exiv2-canon-powershot-a520.jpg']
,'exiv2-canon-powershot-a520.jpg'
]
images_2 = [
'exiv2-empty.jpg'
@ -315,7 +316,8 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
,'20050527_051833.jpg'
,'20060802_095200.jpg'
,'20001004_015404.jpg'
,'20060127_225027.jpg']
,'20060127_225027.jpg'
]
images_3 = [
'exiv2-empty.exv'
@ -332,7 +334,8 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
,'20050527_051833.exv'
,'20060802_095200.exv'
,'20001004_015404.exv'
,'20060127_225027.exv']
,'20060127_225027.exv'
]
images_1_str = ' '.join(images_1)
images_2_str = ' '.join(images_2)
@ -362,7 +365,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
out += BT.execute('exiv2 -u -v print {images_2_str}', vars(), expected_returncodes=[253])
out += ''
out += BT.execute('exiv2 -u -v -b -pt print {images_2_str}', vars())
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_2_str}', vars(), mix_stdout_and_stderr=False)
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_2_str}', vars(), redirect_stderr_to_stdout=False)
BT.save(stdout, 'iii')
out += stderr
@ -371,7 +374,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
out += '\nExtract Thumbnail --------------------------------------------------------'
out += BT.execute('exiv2 -u -vf -et extract {images_2_str}', vars(), expected_returncodes=[253])
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_3_str}', vars(), mix_stdout_and_stderr=False)
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_3_str}', vars(), redirect_stderr_to_stdout=False)
BT.save(stdout, 'jjj')
out += stderr
@ -388,7 +391,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
out += '\nInsert Exif data ---------------------------------------------------------'
out += BT.execute('exiv2 -u -v insert {images_2_str}', vars())
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_3_str}', vars(), mix_stdout_and_stderr=False)
stdout, stderr = BT.execute('exiv2 -u -v -b -pt print {images_3_str}', vars(), redirect_stderr_to_stdout=False)
BT.save(stdout, 'kkk')
out += stderr
@ -448,11 +451,12 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
# num = 1074 # ICC Profile Support
out = BT.Output()
for img in ['Reagan.jpg',
'exiv2-bug1199.webp',
'ReaganLargePng.png',
'ReaganLargeJpg.jpg',
'Reagan2.jp2']: # 1272 ReaganLargeTiff.tiff
for img in ['Reagan.jpg'
,'exiv2-bug1199.webp'
,'ReaganLargePng.png'
,'ReaganLargeJpg.jpg'
,'Reagan2.jp2' # 1272 ReaganLargeTiff.tiff
]:
stub = img.split('.')[0]
iccname = stub + '.icc'
@ -460,7 +464,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
BT.copyTestFile(i)
out += BT.execute('exiv2 -pS {img}', vars())
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_bytes=True),
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_raw=True, return_bytes=True),
stub + '_1.icc')
out += BT.execute('exiv2 -eC --force {img}', vars())
BT.mv(iccname, stub + '_2.icc')
@ -468,7 +472,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
BT.copyTestFile('large.icc', iccname)
out += BT.execute('exiv2 -iC {img}', vars())
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_bytes=True),
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_raw=True, return_bytes=True),
stub + '_large_1.icc')
out += BT.execute('exiv2 -pS {img}', vars())
out += BT.execute('exiv2 -eC --force {img}', vars())
@ -477,7 +481,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
BT.copyTestFile('small.icc', iccname)
out += BT.execute('exiv2 -iC {img}', vars())
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_bytes=True),
BT.save(BT.execute('exiv2 -pC {img}', vars(), return_raw=True, return_bytes=True),
stub + '_small_1.icc')
out += BT.execute('exiv2 -pS {img}', vars())
out += BT.execute('exiv2 -eC --force {img}', vars())
@ -492,10 +496,7 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
def image_test(self):
test_files = [
'table.jpg'
,'smiley1.jpg'
,'smiley2.jpg']
test_files = ['table.jpg', 'smiley1.jpg', 'smiley2.jpg']
erase_test_files = [
'glider.exv'
,'iptc-noAPP13.jpg'
@ -511,7 +512,8 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
,'iptc-psAPP13-wIPTCend.jpg'
,'iptc-psAPP13-wIPTCmid1-wIPTCempty-wIPTCmid2.jpg'
,'iptc-psAPP13-wIPTCmid.jpg'
,'iptc-psAPP13-wIPTC-psAPP13-noIPTC.jpg']
,'iptc-psAPP13-wIPTC-psAPP13-noIPTC.jpg'
]
pass_count = 0
fail_count = 0
@ -612,7 +614,8 @@ set Exif.Photo.DateTimeDigitized 2020:05:26 07:31:42
,'iptc-psAPP13-wIPTC-psAPP13-noIPTC.jpg'
,'smiley1.jpg'
,'smiley2.jpg'
,'table.jpg']
,'table.jpg'
]
pass_count = 0
fail_count = 0

View File

@ -21,6 +21,7 @@ class Config:
# The configuration parameters for bash test
# When you run the test cases through `python3 runner.py`, the function configure_suite() in system_tests.py will override these parameters.
exiv2_dir = os.path.normpath(os.path.join(os.path.abspath(__file__), '../../../'))
exiv2_ext = '' # or '.exe'
bin_dir = os.path.join(exiv2_dir, 'build/bin')
data_dir = os.path.join(exiv2_dir, 'test/data')
tmp_dir = os.path.join(exiv2_dir, 'test/tmp')
@ -30,7 +31,7 @@ class Config:
@classmethod
def init(cls):
""" Init test environments and variables """
""" Init test environments and variables that may be modified """
os.makedirs(cls.tmp_dir, exist_ok=True)
os.chdir(cls.tmp_dir)
log.buffer = []
@ -253,6 +254,7 @@ class Output:
def __str__(self):
return self.newline.join(self.lines)
# Comment it so that log does not automatically convert to str type
# def __repr__(self):
# return str(self)
@ -350,52 +352,58 @@ def execute(cmd: str,
stdin: (str, bytes) = None,
encoding=None,
expected_returncodes=[0],
return_raw=False,
return_bytes=False,
mix_stdout_and_stderr=True):
redirect_stderr_to_stdout=True):
"""
Execute a command in the shell and return its stdout and stderr.
- If the binary of Exiv2 is executed, the absolute path is automatically added.
- Returns the output bytes when return_bytes is true. Otherwise, the output is decoded to a str and returned.
- When return_raw is true, returns the raw output. Otherwise, the path separator, whitespace character in output will be filtered.
- When return_bytes is true, returns the output bytes. Otherwise, the output is decoded to a str and returned.
Sample:
>>> execute('echo Hello')
>>> execute('exiv2 --help')
"""
args = shlex.split(cmd.format(**vars_dict))
if args[0] in Config.bin_files:
args[0] = os.path.join(Config.bin_dir, args[0])
# Check the input
args = shlex.split(cmd.format(**vars_dict), posix=os.name=='posix')
encoding = encoding or Config.encoding
if args[0] in Config.bin_files:
args[0] = os.path.join(Config.bin_dir, args[0]) + Config.exiv2_ext
if stdin:
if not isinstance(stdin, bytes):
stdin = str(stdin).encode(encoding)
if mix_stdout_and_stderr:
if redirect_stderr_to_stdout:
stderr_to = subprocess.STDOUT
else:
stderr_to = subprocess.PIPE
with subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=stderr_to, cwd=Config.tmp_dir) as proc:
try:
output = proc.communicate(stdin, timeout=10) # Assign (stdout, stderr) to output
except subprocess.TimeoutExpired:
proc.kill()
output = proc.communicate()
# Execute the command
try:
with subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=stderr_to, cwd=Config.tmp_dir) as proc:
try:
output = proc.communicate(stdin, timeout=10) # Assign (stdout, stderr) to output
except subprocess.TimeoutExpired:
proc.kill()
output = proc.communicate()
except:
raise RuntimeError('Failed to execute: {}'.format(args))
output = [i or b'' for i in output]
output = [i.rstrip(b'\n') for i in output]
output = [i.rstrip(b'\r\n').rstrip(b'\n') for i in output] # Remove the last line break of the output
# Check the output
if not return_raw:
output = [i.replace(b'\r\n', b'\n') for i in output] # Fix dos line-endings
output = [i.replace(b'\\', rb'/') for i in output] # Fix dos path separators
if not return_bytes:
output = [i.decode(encoding) for i in output]
output = [i.replace('\r\n', '\n') for i in output] # fix dos line-endings
output = [i.replace('\\', r'/') for i in output] # fix dos path separators
if expected_returncodes and proc.returncode not in expected_returncodes:
log.error('Failed to execute: {}'.format(' '.join(args)))
log.error('Failed to execute: {}'.format(args))
log.error('The expected return code is {}, but get {}'.format(str(expected_returncodes), proc.returncode))
log.info('OUTPUT:\n{}'.format(output[0] + output[1]))
raise RuntimeError('\n' + log.to_str())
if mix_stdout_and_stderr:
if redirect_stderr_to_stdout:
return output[0] + output[1] or None
else:
return [i or None for i in output]
@ -434,20 +442,20 @@ def eraseTest(filename):
return diffCheck(good_file, test_file, in_bytes=True)
def copyTest(num, src, dst):
test_file = '{}.c{}tst'.format(dst, num)
def copyTest(num, src, good):
test_file = '{}.c{}tst'.format(good, num)
src_file = os.path.join(Config.data_dir, src)
good_file = os.path.join(Config.data_dir, '{}.c{}gd'.format(dst, num))
copyTestFile(dst, test_file)
good_file = os.path.join(Config.data_dir, '{}.c{}gd'.format(good, num))
copyTestFile(good, test_file)
execute('metacopy -a {src_file} {test_file}', vars())
return diffCheck(good_file, test_file, in_bytes=True)
def iptcTest(num, src, dst):
test_file = '{}.i{}tst'.format(dst, num)
def iptcTest(num, src, good):
test_file = '{}.i{}tst'.format(good, num)
src_file = os.path.join(Config.data_dir, src)
good_file = os.path.join(Config.data_dir, '{}.i{}gd'.format(dst, num))
copyTestFile(dst, test_file)
good_file = os.path.join(Config.data_dir, '{}.i{}gd'.format(good, num))
copyTestFile(good, test_file)
execute('metacopy -ip {src_file} {test_file}', vars())
return diffCheck(good_file, test_file, in_bytes=True)
@ -457,7 +465,7 @@ def printTest(filename):
src_file = os.path.join(Config.data_dir, filename)
good_file = os.path.join(Config.data_dir, filename + '.ipgd')
copyTestFile(filename, test_file)
output = execute('iptcprint {src_file}', vars(), expected_returncodes=None, return_bytes=True)
output = execute('iptcprint {src_file}', vars(), expected_returncodes=[0, 255], return_bytes=True)
output = output.replace(os.path.normpath(Config.data_dir).encode(), b'../data') # Ignore the difference of data_dir
save(output + b'\n', test_file)
return diffCheck(good_file, test_file, in_bytes=True)
@ -478,7 +486,7 @@ r Iptc.Application2.Keywords
r Iptc.Application2.CountryName
""".lstrip('\n').encode()
execute('iptctest {tmp}', vars(), stdin=stdin)
save(execute('iptcprint {tmp}', vars(), expected_returncodes=None, return_bytes=True) + b'\n',
save(execute('iptcprint {tmp}', vars(), expected_returncodes=[0, 255], return_bytes=True) + b'\n',
test_file)
return diffCheck(good_file, test_file, in_bytes=True)
@ -500,7 +508,7 @@ a Iptc.Envelope.TimeSent 14:41:0-05:00
a Iptc.Application2.RasterizedCaption 230 42 34 2 90 84 23 146
""".lstrip('\n').encode()
execute('iptctest {tmp}', vars(), stdin=stdin)
save(execute('iptcprint {tmp}', vars(), expected_returncodes=None, return_bytes=True) + b'\n',
save(execute('iptcprint {tmp}', vars(), expected_returncodes=[0, 255], return_bytes=True) + b'\n',
test_file)
return diffCheck(good_file, test_file, in_bytes=True)

View File

@ -10,6 +10,7 @@ import sys
import shutil
import string
import unittest
import platform
from bash_tests import utils as BT
@ -161,6 +162,8 @@ def configure_suite(config_file):
else:
fallback = ""
config['ENV'][key] = os.getenv(config['ENV'][key]) or fallback
if platform.system() == 'Windows':
config['ENV']['binary_extension'] = config['ENV']['binary_extension'] or '.exe'
if 'variables' in config:
for key in config['variables']:
@ -203,10 +206,12 @@ def configure_suite(config_file):
# Configure the parameters for bash tests
BT.Config.bin_dir = os.path.abspath(config['ENV']['exiv2_path'])
BT.Config.data_dir = os.path.abspath(config['paths']['data_path'])
BT.Config.tmp_dir = os.path.abspath(config['paths']['tmp_path'])
BT.Config.exiv2_ext = config['ENV']['binary_extension']
BT.Config.exiv2_http = config['ENV']['exiv2_http']
BT.Config.exiv2_port = int(config['ENV']['exiv2_port'])
BT.Config.data_dir = os.path.abspath(config['paths']['data_path'])
BT.Config.tmp_dir = os.path.abspath(config['paths']['tmp_path'])
# print(dict(config['ENV'])); exit(1) # for debug
class FileDecoratorBase(object):