Blame tests/rpmpython.at

2ff057
#    rpmpython.at: test rpm python bindings
2ff057
#    TODO: conditionalize on python availability
2ff057
2ff057
AT_BANNER([Python bindings])
2ff057
2ff057
RPMPY_TEST([module import],[
2ff057
myprint(rpm.__version__)
2ff057
],
2ff057
[AT_PACKAGE_VERSION]
2ff057
)
2ff057
2ff057
RPMPY_TEST([macro manipulation],[
2ff057
def prexp(m):
2ff057
    myprint(rpm.expandMacro('%%{?%s}' % m))
2ff057
2ff057
mname = '__no_such_macro_yet'
2ff057
prexp(mname)
2ff057
rpm.addMacro(mname, '/bin/sh')
2ff057
prexp(mname)
2ff057
rpm.addMacro(mname, '/bin/false')
2ff057
prexp(mname)
2ff057
rpm.delMacro(mname)
2ff057
prexp(mname)
2ff057
rpm.delMacro(mname)
2ff057
prexp(mname)
2ff057
],
2ff057
[
2ff057
/bin/sh
2ff057
/bin/false
2ff057
/bin/sh
2ff057
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([basic rpmio],[
2ff057
msg = 'Killroy was here\n'
2ff057
data = msg * 10
2ff057
# TODO: test other compression types too if built in
2ff057
for iot in [ 'fpio', 'fdio', 'ufdio', 'gzdio' ]:
2ff057
    fn = 'pyio.%s' % iot
2ff057
    fd = rpm.fd(fn, 'w', iot)
2ff057
    pos = fd.tell()
2ff057
    if pos != -2 and pos != 0:
2ff057
        myprint('bad start pos %d' % fd.tell())
2ff057
    if fd.write(data) != len(data):
2ff057
        myprint('%s write fail' % iot)
2ff057
    if fn != fd.name:
2ff057
        myprint('bad file name %s' % fd.name)
2ff057
    fd.flush()
2ff057
    pos = fd.tell()
2ff057
    if pos != -2 and pos != len(data):
2ff057
        myprint('bad end pos %d' % fd.tell())
2ff057
    fd = rpm.fd(fn, 'r', iot)
2ff057
    rdata = fd.read()
2ff057
    if rdata != data:
2ff057
        myprint('%s read fail (got %d bytes)\n%s' % (iot, len(rdata), rdata))
2ff057
    # compressed io types can't seek
2ff057
    if iot == 'ufdio':
2ff057
        fd.seek(0)
2ff057
    else:
2ff057
        fd = rpm.fd(fn, 'r', iot)
2ff057
    if fn != fd.name:
2ff057
        myprint('bad file name %s' % fd.name)
2ff057
    rdata = fd.read(len(msg))
2ff057
    if rdata != msg:
2ff057
        myprint('%s sized read fail (got %d bytes)\n%s' % (iot, len(rdata), rdata))
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([spec parse],[
2ff057
# TODO: add a better test spec with sub-packages etc
2ff057
spec = rpm.spec('${RPMDATA}/SPECS/hello.spec')
2ff057
for (name, num, flags) in spec.sources:
2ff057
    myprint('src %s %d %d' % (name, num, flags))
2ff057
for pkg in spec.packages:
2ff057
    myprint(pkg.header.format('%{nvr}'))
2ff057
myprint(spec.sourceHeader.format('%{nvr}'))
2ff057
],
2ff057
[src hello-1.0-modernize.patch 0 2
2ff057
src hello-1.0.tar.gz 0 1
2ff057
hello-1.0-1
2ff057
hello-1.0-1
2ff057
])
2ff057
2ff057
RPMPY_TEST([basic header manipulation],[
2ff057
h = rpm.hdr()
2ff057
h['name'] = 'testpkg'
2ff057
h['version'] = '1.0'
2ff057
h['release'] = '1'
2ff057
h['epoch'] = 5
2ff057
h['arch'] = 'noarch'
2ff057
myprint(h['nevra'])
2ff057
del h['epoch']
2ff057
myprint(h['nevra'])
2ff057
for a in ['name', 'bugurl', '__class__', '__foo__', ]:
2ff057
    try:
2ff057
        x = getattr(h, a)
2ff057
        myprint(x)
2ff057
    except AttributeError, exc:
2ff057
        myprint(exc)
2ff057
],
2ff057
[testpkg-5:1.0-1.noarch
2ff057
testpkg-1.0-1.noarch
2ff057
testpkg
2ff057
None
2ff057
<type 'rpm.hdr'>
2ff057
'rpm.hdr' object has no attribute '__foo__']
2ff057
)
2ff057
2ff057
RPMPY_TEST([invalid header data],[
2ff057
h1 = rpm.hdr()
2ff057
h1['basenames'] = ['bing', 'bang', 'bong']
2ff057
h1['dirnames'] = ['/opt/', '/flopt/']
2ff057
h1['dirindexes'] = [ 1, 0, 3 ]
2ff057
h2 = rpm.hdr()
2ff057
h2['basenames'] = ['bing', 'bang', 'bong']
2ff057
h2['dirnames'] = ['/opt/', '/flopt/']
2ff057
h2['dirindexes'] = [ 0, 0, 1 ]
2ff057
for h in [h1, h2]:
2ff057
    try:
2ff057
        myprint(','.join(h['filenames']))
2ff057
    except rpm.error, exc:
2ff057
        myprint(exc)
2ff057
],
2ff057
[invalid header data
2ff057
/opt/bing,/opt/bang,/flopt/bong]
2ff057
)
2ff057
2ff057
RPMPY_TEST([vfyflags API],[
2ff057
ts = rpm.ts()
2ff057
dlv = ts.getVfyFlags()
2ff057
tlv = dlv | rpm.RPMVSF_NOSHA1HEADER
2ff057
olv = ts.setVfyFlags(tlv)
2ff057
nlv = ts.getVfyFlags()
2ff057
myprint('%s %s %s' % (hex(dlv), hex(olv), hex(nlv)))
2ff057
],
2ff057
[0x0 0x0 0x100]
2ff057
)
2ff057
2ff057
RPMPY_TEST([vfylevel API],[
2ff057
ts = rpm.ts()
2ff057
dlv = ts.getVfyLevel()
2ff057
olv = ts.setVfyLevel(rpm.RPMSIG_SIGNATURE_TYPE|rpm.RPMSIG_DIGEST_TYPE)
2ff057
nlv = ts.getVfyLevel()
2ff057
myprint('%s %s %s' % (hex(dlv), hex(olv), hex(nlv)))
2ff057
],
2ff057
[0x1 0x1 0x3]
2ff057
)
2ff057
2ff057
2ff057
RPMPY_TEST([reading a package file],[
2ff057
ts = rpm.ts()
2ff057
h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
2ff057
myprint(h['arch'])
2ff057
],
2ff057
[ppc64]
2ff057
)
2ff057
2ff057
RPMPY_TEST([reading a signed package file 1],[
2ff057
ts = rpm.ts()
2ff057
# avoid rpmlog spew with absolute path to package
2ff057
sink = open('/dev/null', 'w')
2ff057
rpm.setLogFile(sink)
2ff057
try:
2ff057
    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
2ff057
    myprint(h['arch'])
2ff057
except rpm.error, e:
2ff057
    myprint(e)
2ff057
],
2ff057
[public key not available
2ff057
],
2ff057
)
2ff057
2ff057
RPMPY_TEST([reading a signed package file 2],[
2ff057
2ff057
keydata = open('${RPMDATA}/keys/rpm.org-rsa-2048-test.pub').read()
2ff057
pubkey = rpm.pubkey(keydata)
2ff057
keyring = rpm.keyring()
2ff057
keyring.addKey(pubkey)
2ff057
2ff057
ts = rpm.ts()
2ff057
ts.setKeyring(keyring)
2ff057
try:
2ff057
    h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.x86_64-signed.rpm')
2ff057
    myprint(h['arch'])
2ff057
except rpm.error, e:
2ff057
    myprint(e)
2ff057
],
2ff057
[x86_64]
2ff057
)
2ff057
2ff057
RPMPY_TEST([add package to transaction],[
2ff057
ts = rpm.ts()
2ff057
ts.addInstall('${RPMDATA}/RPMS/foo-1.0-1.noarch.rpm', 'u')
2ff057
for e in ts:
2ff057
    myprint(e.NEVRA())
2ff057
ts.clear()
2ff057
for e in ts:
2ff057
    myprint(e.NEVRA())
2ff057
],
2ff057
[foo-1.0-1.noarch]
2ff057
)
2ff057
2ff057
RPMPY_TEST([add bogus package to transaction 1],[
2ff057
ts = rpm.ts()
2ff057
h = rpm.hdr()
2ff057
h['name'] = "foo"
2ff057
try:
2ff057
    ts.addInstall(h, 'foo', 'u')
2ff057
except rpm.error, err:
2ff057
    myprint(err)
2ff057
for e in ts:
2ff057
    myprint(e.NEVRA())
2ff057
],
2ff057
[adding package to transaction failed]
2ff057
)
2ff057
2ff057
RPMPY_TEST([add bogus package to transaction 2],[
2ff057
ts = rpm.ts()
2ff057
h = rpm.hdr()
2ff057
h['name'] = 'foo'
2ff057
h['version'] = '1.0'
2ff057
h['release'] = '1'
2ff057
h['os'] = 'linux'
2ff057
h['arch'] = 'noarch'
2ff057
h['basenames'] = ['bing', 'bang', 'bong']
2ff057
h['dirnames'] = ['/opt' '/flopt']
2ff057
h['dirindexes'] = [ 1, 2, 3 ]
2ff057
try:
2ff057
    ts.addInstall(h, 'foo', 'u')
2ff057
except rpm.error, err:
2ff057
    myprint(err)
2ff057
for e in ts:
2ff057
    myprint(e.NEVRA())
2ff057
],
2ff057
[adding package to transaction failed]
2ff057
)
2ff057
2ff057
AT_SETUP([database iterators])
2ff057
AT_KEYWORDS([python rpmdb])
2ff057
AT_CHECK([
2ff057
RPMDB_CLEAR
2ff057
RPMDB_INIT
2ff057
runroot rpm -i \
2ff057
  --justdb --nodeps --ignorearch --ignoreos \
2ff057
  /data/RPMS/foo-1.0-1.noarch.rpm \
2ff057
  /data/RPMS/hello-2.0-1.i686.rpm
2ff057
],
2ff057
[0],
2ff057
[],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
ix = 0
2ff057
mi = ts.dbMatch()
2ff057
mi.pattern('name', rpm.RPMMIRE_STRCMP, 'hello')
2ff057
for h in mi:
2ff057
    ix = h['dbinstance']
2ff057
    break
2ff057
del mi
2ff057
for h in ts.dbMatch('packages', ix):
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[hello-2.0-1.i686
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
mi = ts.dbMatch()
2ff057
mi.pattern('name', rpm.RPMMIRE_DEFAULT, 'f*')
2ff057
for h in mi:
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[foo-1.0-1.noarch
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for h in ts.dbMatch('name'):
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[foo-1.0-1.noarch
2ff057
hello-2.0-1.i686
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for h in ts.dbMatch('obsoletes'):
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[foo-1.0-1.noarch
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for h in ts.dbMatch('provides', 'hi'):
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[foo-1.0-1.noarch
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for h in ts.dbMatch('basenames', '/usr/share/doc/hello-2.0/FAQ'):
2ff057
    myprint(h['nevra'])
2ff057
],
2ff057
[hello-2.0-1.i686
2ff057
],
2ff057
[])
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for di in sorted(ts.dbIndex('obsoletes')):
2ff057
    myprint(di)
2ff057
],
2ff057
[howdy
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_CHECK([
2ff057
ts = rpm.ts()
2ff057
for di in sorted(ts.dbIndex('provides')):
2ff057
    myprint(di)
2ff057
],
2ff057
[foo
2ff057
hello
2ff057
hello(x86-32)
2ff057
hi
2ff057
],
2ff057
[])
2ff057
AT_CLEANUP
2ff057
2ff057
RPMPY_TEST([dependency sets 1],[
2ff057
ts = rpm.ts()
2ff057
h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-1.0-1.ppc64.rpm')
2ff057
for dep in rpm.ds(h, 'requires'):
2ff057
    myprint(dep.DNEVR())
2ff057
],
2ff057
[R /bin/sh
2ff057
R /bin/sh
2ff057
R /bin/sh
2ff057
R /bin/sh
2ff057
R libc.so.6
2ff057
R libc.so.6(GLIBC_2.0)
2ff057
R rpmlib(CompressedFileNames) <= 3.0.4-1
2ff057
R rpmlib(PayloadFilesHavePrefix) <= 4.0-1
2ff057
R rtld(GNU_HASH)]
2ff057
)
2ff057
2ff057
RPMPY_TEST([dependency sets 2],[
2ff057
ts = rpm.ts()
2ff057
h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
2ff057
ds = rpm.ds(h, 'provides')
2ff057
myprint('%d %d' % (ds.Instance(), ds.Count()))
2ff057
],
2ff057
[0 2
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([file info sets 1],[
2ff057
ts = rpm.ts()
2ff057
h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
2ff057
fi = rpm.fi(h)
2ff057
myprint(fi.FC())
2ff057
for f in fi:
2ff057
   myprint('%x: %s' % (fi.FFlags(), fi.FN()))
2ff057
],
2ff057
[5
2ff057
0: /usr/bin/hello
2ff057
0: /usr/share/doc/hello-2.0
2ff057
2: /usr/share/doc/hello-2.0/COPYING
2ff057
2: /usr/share/doc/hello-2.0/FAQ
2ff057
2: /usr/share/doc/hello-2.0/README
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([string pool 1],[
2ff057
p = rpm.strpool()
2ff057
for s in ['foo', 'bar', 'foo', 'zoo']:
2ff057
    p.str2id(s)
2ff057
myprint('%s' % len(p))
2ff057
for i in range(1, len(p)+1):
2ff057
    myprint('%s: %s' % (i, p[i]))
2ff057
],
2ff057
[3
2ff057
1: foo
2ff057
2: bar
2ff057
3: zoo
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([string pool 2],[
2ff057
p = rpm.strpool()
2ff057
d1 = rpm.ds(('foo', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
2ff057
d2 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
2ff057
d3 = rpm.ds(('bar', rpm.RPMSENSE_EQUAL, '2.0'), rpm.RPMTAG_PROVIDES, pool=p)
2ff057
myprint('%s' % len(p))
2ff057
del p
2ff057
myprint(d1.DNEVR())
2ff057
myprint(d2.DNEVR())
2ff057
myprint(d3.DNEVR())
2ff057
],
2ff057
[3
2ff057
P foo = 2.0
2ff057
P bar = 2.0
2ff057
P bar = 2.0
2ff057
],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([archive 1],[
2ff057
import hashlib
2ff057
ts = rpm.ts()
2ff057
fd = rpm.fd.open('${RPMDATA}/SRPMS/hello-1.0-1.src.rpm')
2ff057
h = ts.hdrFromFdno(fd)
2ff057
payload = rpm.fd.open(fd, flags=h['payloadcompressor'])
2ff057
files = rpm.files(h)
2ff057
archive = files.archive(payload)
2ff057
for f in archive:
2ff057
    if not f.fflags & rpm.RPMFILE_SPECFILE:
2ff057
        continue
2ff057
    spec = archive.read()
2ff057
    hash = hashlib.md5(spec)
2ff057
    if f.digest != hash.hexdigest():
2ff057
        myprint('%s should be %s' % (hash.hexdigest(), f.digest))
2ff057
    break
2ff057
],
2ff057
[],
2ff057
[])
2ff057
2ff057
RPMPY_TEST([header unload],[
2ff057
ts = rpm.ts()
2ff057
h = ts.hdrFromFdno('${RPMDATA}/RPMS/hello-2.0-1.i686.rpm')
2ff057
# Add some garbage to header to make it non-sorted
2ff057
h['installtime'] = 0
2ff057
# RhBug:1061730 causes export of non-sorted header to be larger than it should
2ff057
len1 = len(h.unload())
2ff057
# Accessing the header before export forces sorting to take place even on
2ff057
# buggy versions
2ff057
t = h['installtime']
2ff057
len2 = len(h.unload())
2ff057
myprint(len1 == len2)
2ff057
],
2ff057
[True
2ff057
],
2ff057
[])
2ff057