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