t_api_search.py revision 3158
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen#!/usr/bin/python
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# CDDL HEADER START
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen# The contents of this file are subject to the terms of the
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen# Common Development and Distribution License (the "License").
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen# You may not use this file except in compliance with the License.
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# or http://www.opensolaris.org/os/licensing.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# See the License for the specific language governing permissions
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# and limitations under the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# CDDL HEADER END
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport testutils
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif __name__ == "__main__":
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen testutils.setup_environment("../../../proto")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport pkg5unittest
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport copy
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport os
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport shutil
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport tempfile
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainenimport time
ad850190d946d34966a56838cfdb216e021b5b5fTimo Sirainenimport unittest
ad850190d946d34966a56838cfdb216e021b5b5fTimo Sirainenimport urllib2
ad850190d946d34966a56838cfdb216e021b5b5fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport pkg.client.api as api
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport pkg.client.api_errors as api_errors
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenimport pkg.client.query_parser as query_parser
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenimport pkg.fmri as fmri
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenimport pkg.indexer as indexer
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenimport pkg.portable as portable
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenimport pkg.search_storage as ss
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass TestApiSearchBasics(pkg5unittest.SingleDepotTestCase):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen example_pkg10 = """
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen open example_pkg@1.0,5.11-0
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add dir mode=0755 owner=root group=bin path=/bin
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add dir mode=0755 owner=root group=bin path=/bin/example_dir
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add dir mode=0755 owner=root group=bin path=/usr/lib/python2.6/vendor-packages/OpenSSL
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add file tmp/example_file mode=0555 owner=root group=bin path=/bin/example_path
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add link path=/bin/exlink target=/bin/example_path mediator=example mediator-version=7.0 mediator-implementation=unladen-swallow
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen add set name=com.sun.service.incorporated_changes value="6556919 6627937"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen add set name=com.sun.service.random_test value=42 value=79
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen add set name=com.sun.service.bug_ids value=4641790 value=4725245 value=4817791 value=4851433 value=4897491 value=4913776 value=6178339 value=6556919 value=6627937
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add set name=com.sun.service.keywords value="sort null -n -m -t sort 0x86 separator"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen add set name=com.sun.service.info_url value=http://service.opensolaris.com/xml/pkg/SUNWcsu@0.5.11,5.11-1:20080514I120000Z
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add set name=description value='FOOO bAr O OO OOO' value="whee fun"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add set name='weirdness' value='] [ * ?'
6e235046e1d8e9d89fc948f5c623676c20421a28Timo Sirainen add set name=org.opensolaris.smf.fmri value=svc:/milestone/multi-user-server:default
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen close """
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen example_pkg11 = """
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen open example_pkg@1.1,5.11-0
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen add dir mode=0755 owner=root group=bin path=/bin
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add file tmp/example_file mode=0555 owner=root group=bin path=/bin/example_path11
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen close """
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen incorp_pkg10 = """
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen open incorp_pkg@1.0,5.11-0
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen add depend fmri=example_pkg@1.0,5.11-0 type=incorporate
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen close """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen incorp_pkg11 = """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen open incorp_pkg@1.1,5.11-0
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen add depend fmri=example_pkg@1.1,5.11-0 type=incorporate
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen close """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen another_pkg10 = """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen open another_pkg@1.0,5.11-0
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen add dir mode=0755 owner=root group=bin path=/bazbin
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen close """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen bad_pkg10 = """
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen open bad_pkg@1.0,5.11-0
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen add dir path=badfoo/ mode=0755 owner=root group=bin
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen close """
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen space_pkg10 = """
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen open space_pkg@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add file tmp/example_file mode=0444 owner=nobody group=sys path='unique/with a space'
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add dir mode=0755 owner=root group=bin path=unique_dir
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen close """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen cat_pkg10 = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen open cat@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add set name=info.classification value=org.opensolaris.category.2008:System/Security value=org.random:Other/Category
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen close """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen cat2_pkg10 = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen open cat2@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add set name=info.classification value="org.opensolaris.category.2008:Applications/Sound and Video" value=Developer/C
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen close """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen cat3_pkg10 = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen open cat3@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add set name=info.classification value="org.opensolaris.category.2008:foo/bar/baz/bill/beam/asda"
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen close """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen bad_cat_pkg10 = """
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen open badcat@1.0,5.11-0
04b8a90af181cc4c7959266855e8ed50a22ed413Timo Sirainen add set name=info.classification value="TestBad1/TestBad2"
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen close """
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen bad_cat2_pkg10 = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen open badcat2@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainen add set name=info.classification value="org.opensolaris.category.2008:TestBad1:TestBad2"
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen close """
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen fat_pkg10 = """
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenopen fat@1.0,5.11-0
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenadd set name=variant.arch value=sparc value=i386
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenadd set name=description value="i386 variant" variant.arch=i386
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenadd set name=description value="sparc variant" variant.arch=sparc
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainenclose """
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen bogus_pkg10 = """
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenset name=pkg.fmri value=pkg:/bogus_pkg@1.0,5.11-0:20090326T233451Z
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenset name=description value=""validation with simple chains of constraints ""
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenset name=pkg.description value="pseudo-hashes as arrays tied to a "type" (list of fields)"
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainendepend fmri=XML-Atom-Entry
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainenset name=com.sun.service.incorporated_changes value="6556919 6627937"
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen"""
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen bogus_fmri = fmri.PkgFmri("bogus_pkg@1.0,5.11-0:20090326T233451Z")
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen hierarchical_named_pkg = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainenopen pa/pb/pc/pfoo@1.0,5.11-0
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainenclose """
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bug_8492_manf_1 = """
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenopen b1@1.0,5.11-0
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenadd set description="Image Packaging System"
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenclose """
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen bug_8492_manf_2 = """
69e03a846f6980144aa75bff0590c04852bffbbcTimo Sirainenopen b2@1.0,5.11-0
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainenadd set description="Image Packaging System"
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainenclose """
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen require_any_manf = """
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainenopen ra@1.0,5.11-0
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainenadd depend type=require-any fmri=another_pkg@1.0,5.11-0 fmri=pkg:/space_pkg@1.0,5.11-0
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainenclose
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen"""
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_8492_1 = set([('pkg:/b1@1.0-0', 'Image Packaging System', 'set name=description value="Image Packaging System"')])
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen res_8492_2 = set([('pkg:/b2@1.0-0', 'Image Packaging System', 'set name=description value="Image Packaging System"')])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen remote_fmri_string = ('pkg:/example_pkg@1.0-0', 'test/example_pkg',
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen 'set name=pkg.fmri value=pkg://test/example_pkg@1.0,5.11-0:')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_pkg = set([
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen remote_fmri_string
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_remote_path = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "basename","file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin mode=0555 owner=root path=bin/example_path pkg.csize=30 pkg.size=12"),
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ])
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen res_remote_path_of_example_path = set([
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen ("pkg:/example_pkg@1.0-0", "path","file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin mode=0555 owner=root path=bin/example_path pkg.csize=30 pkg.size=12")
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen ])
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_remote_bin = set([
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ("pkg:/example_pkg@1.0-0", "path", "dir group=bin mode=0755 owner=root path=bin")
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen res_remote_openssl = set([
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen ("pkg:/example_pkg@1.0-0", "basename", "dir group=bin mode=0755 owner=root path=usr/lib/python2.6/vendor-packages/OpenSSL")
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_remote_bug_id = set([
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen ("pkg:/example_pkg@1.0-0", "4851433", 'set name=com.sun.service.bug_ids value=4641790 value=4725245 value=4817791 value=4851433 value=4897491 value=4913776 value=6178339 value=6556919 value=6627937')
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_bug_id_4725245 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "4725245", 'set name=com.sun.service.bug_ids value=4641790 value=4725245 value=4817791 value=4851433 value=4897491 value=4913776 value=6178339 value=6556919 value=6627937')
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_inc_changes = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "6556919 6627937", 'set name=com.sun.service.incorporated_changes value="6556919 6627937"'),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "6556919", 'set name=com.sun.service.bug_ids value=4641790 value=4725245 value=4817791 value=4851433 value=4897491 value=4913776 value=6178339 value=6556919 value=6627937')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_mediator = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "mediator", "link mediator=example mediator-implementation=unladen-swallow mediator-version=7.0 path=bin/exlink target=/bin/example_path")
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen ])
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen
85ebd164b748fbd808fcfc17c8fd2af4cd9289d5Timo Sirainen res_remote_mediator_version = set([
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen ("pkg:/example_pkg@1.0-0", "mediator-version", "link mediator=example mediator-implementation=unladen-swallow mediator-version=7.0 path=bin/exlink target=/bin/example_path")
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen ])
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen res_remote_mediator_impl = set([
85ebd164b748fbd808fcfc17c8fd2af4cd9289d5Timo Sirainen ("pkg:/example_pkg@1.0-0", "mediator-implementation", "link mediator=example mediator-implementation=unladen-swallow mediator-version=7.0 path=bin/exlink target=/bin/example_path")
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen ])
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen res_remote_mediator_and_ver = res_remote_mediator.union(
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_remote_mediator_version)
c4877db8b6559846f4b58be8e42422dc734c193fTimo Sirainen
85ebd164b748fbd808fcfc17c8fd2af4cd9289d5Timo Sirainen res_remote_mediator_and_ver_impl = res_remote_mediator.union(
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_remote_mediator_version).union(res_remote_mediator_impl)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_remote_random_test = set([
8b9342aa96b2f297e23afb261f9f7dd859800952Timo Sirainen ("pkg:/example_pkg@1.0-0", "42", "set name=com.sun.service.random_test value=42 value=79")
8b9342aa96b2f297e23afb261f9f7dd859800952Timo Sirainen ])
8b9342aa96b2f297e23afb261f9f7dd859800952Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_random_test_79 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.0-0", "79", "set name=com.sun.service.random_test value=42 value=79")
37e6cf44d61a81c6839e3ab76234b54309d8d292Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_keywords = set([
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen ("pkg:/example_pkg@1.0-0", "sort null -n -m -t sort 0x86 separator", 'set name=com.sun.service.keywords value="sort null -n -m -t sort 0x86 separator"')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_remote_wildcard = res_remote_path.union(set([
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen remote_fmri_string,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/example_pkg@1.0-0', 'basename', 'dir group=bin mode=0755 owner=root path=bin/example_dir'),
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ("pkg:/example_pkg@1.0-0", "mediator", "link mediator=example mediator-implementation=unladen-swallow mediator-version=7.0 path=bin/exlink target=/bin/example_path")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ]))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_remote_glob = set([
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen remote_fmri_string,
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen ('pkg:/example_pkg@1.0-0', 'path', 'dir group=bin mode=0755 owner=root path=bin/example_dir'),
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ('pkg:/example_pkg@1.0-0', 'basename', 'dir group=bin mode=0755 owner=root path=bin/example_dir'),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/example_pkg@1.0-0', 'path', 'file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin mode=0555 owner=root path=bin/example_path pkg.csize=30 pkg.size=12'),
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ("pkg:/example_pkg@1.0-0", "mediator", "link mediator=example mediator-implementation=unladen-swallow mediator-version=7.0 path=bin/exlink target=/bin/example_path")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ]) | res_remote_path
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_remote_foo = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/example_pkg@1.0-0', 'FOOO bAr O OO OOO', 'set name=description value="FOOO bAr O OO OOO" value="whee fun"')
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ])
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen res_remote_weird = set([
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen ('pkg:/example_pkg@1.0-0', '] [ * ?', 'set name=weirdness value="] [ * ?"')
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen local_fmri_string = ('pkg:/example_pkg@1.0-0', 'test/example_pkg',
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen 'set name=pkg.fmri value=pkg://test/example_pkg@1.0,5.11-0:')
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_pkg = set([
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen local_fmri_string
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ])
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen res_local_path = copy.copy(res_remote_path)
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen res_local_bin = copy.copy(res_remote_bin)
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen res_local_bug_id = copy.copy(res_remote_bug_id)
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen res_local_inc_changes = copy.copy(res_remote_inc_changes)
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen res_local_random_test = copy.copy(res_remote_random_test)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_keywords = copy.copy(res_remote_keywords)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_mediator = copy.copy(res_remote_mediator)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_mediator_version = copy.copy(res_remote_mediator_version)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_mediator_impl = copy.copy(res_remote_mediator_impl)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_mediator_and_ver = copy.copy(res_remote_mediator_and_ver)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_mediator_and_ver_impl = copy.copy(
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_remote_mediator_and_ver_impl)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_wildcard = copy.copy(res_remote_wildcard)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_wildcard.add(local_fmri_string)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_glob = copy.copy(res_remote_glob)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen res_local_glob.add(local_fmri_string)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_foo = copy.copy(res_remote_foo)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_openssl = copy.copy(res_remote_openssl)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen res_local_path_example11 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.1-0", "basename", "file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin mode=0555 owner=root path=bin/example_path11 pkg.csize=30 pkg.size=12")
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_local_bin_example11 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.1-0", "path", "dir group=bin mode=0755 owner=root path=bin")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_local_pkg_example11 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ("pkg:/example_pkg@1.1-0", "test/example_pkg", "set name=pkg.fmri value=pkg://test/example_pkg@1.1,5.11-0:")
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ])
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen res_local_wildcard_example11 = set([
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen ("pkg:/example_pkg@1.1-0", "basename", "file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin mode=0555 owner=root path=bin/example_path11 pkg.csize=30 pkg.size=12"),
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen ]).union(res_local_pkg_example11)
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_cat_pkg10 = set([
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ('pkg:/cat@1.0-0', 'System/Security', 'set name=info.classification value=org.opensolaris.category.2008:System/Security value=org.random:Other/Category')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_cat_pkg10_2 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/cat@1.0-0', 'Other/Category', 'set name=info.classification value=org.opensolaris.category.2008:System/Security value=org.random:Other/Category')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen res_cat2_pkg10 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/cat2@1.0-0', 'Applications/Sound and Video', 'set name=info.classification value="org.opensolaris.category.2008:Applications/Sound and Video" value=Developer/C')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_cat2_pkg10_2 = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/cat2@1.0-0', 'Developer/C', 'set name=info.classification value="org.opensolaris.category.2008:Applications/Sound and Video" value=Developer/C')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_cat3_pkg10 = set([
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ('pkg:/cat3@1.0-0', 'foo/bar/baz/bill/beam/asda', 'set name=info.classification value=org.opensolaris.category.2008:foo/bar/baz/bill/beam/asda')
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen ])
f519e4c2ad4ef826f1b08f3e0138b9b287a52c80Timo Sirainen
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen res_fat10_i386 = set([
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen ('pkg:/fat@1.0-0', 'i386 variant', 'set name=description value="i386 variant" variant.arch=i386'),
d565eaa943f29a49b97230ced57eec40ee65b4f9Timo Sirainen ('pkg:/fat@1.0-0', 'i386 variant', 'set name=description value="i386 variant" variant.arch=i386'),
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen ('pkg:/fat@1.0-0', 'i386', 'set name=variant.arch value=sparc value=i386'),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen res_fat10_sparc = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/fat@1.0-0', 'sparc variant', 'set name=description value="sparc variant" variant.arch=sparc'),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/fat@1.0-0', 'sparc', 'set name=variant.arch value=sparc value=i386')
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen fat_10_fmri_string = set([('pkg:/fat@1.0-0', 'test/fat', 'set name=pkg.fmri value=pkg://test/fat@1.0,5.11-0:')])
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen res_remote_fat10_star = fat_10_fmri_string | res_fat10_sparc | res_fat10_i386
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen res_local_fat10_i386_star = res_fat10_i386.union(set([
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen ('pkg:/fat@1.0-0', 'sparc', 'set name=variant.arch value=sparc value=i386')
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen ])).union(fat_10_fmri_string)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen res_local_fat10_sparc_star = res_fat10_sparc.union(set([
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen ('pkg:/fat@1.0-0', 'i386', 'set name=variant.arch value=sparc value=i386')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])).union(fat_10_fmri_string)
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_space_with_star = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ('pkg:/space_pkg@1.0-0', 'basename', 'file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=sys mode=0444 owner=nobody path="unique/with a space" pkg.csize=30 pkg.size=12')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_space_space_star = set([
abe7afb8f1766fbcef1b9df513109e43d7d16e49Timo Sirainen ('pkg:/space_pkg@1.0-0', 'basename', 'file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=sys mode=0444 owner=nobody path="unique/with a space" pkg.csize=30 pkg.size=12'), ('pkg:/space_pkg@1.0-0', 'path', 'file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=sys mode=0444 owner=nobody path="unique/with a space" pkg.csize=30 pkg.size=12')
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ])
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen res_space_unique = set([
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ('pkg:/space_pkg@1.0-0', 'basename', 'dir group=bin mode=0755 owner=root path=unique_dir')
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen ])
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen # This is a copy of the 3.81%2C5.11-0.89%3A20080527T163123Z version of
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen # SUNWgmake from ipkg with the file and liscense actions changed so
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen # that they all take /tmp/example file when sending.
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen bug_983_manifest = """
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenopen SUNWgmake@3.81,5.11-0.89
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=sys mode=0755 owner=root path=usr
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/bin
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/gnu
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/gnu/bin
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd link path=usr/gnu/bin/make target=../../bin/gmake
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=sys mode=0755 owner=root path=usr/gnu/share
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/gnu/share/man
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/gnu/share/man/man1
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainenadd link path=usr/gnu/share/man/man1/make.1 target=../../../../share/man/man1/gmake.1
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/sfw
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/sfw/bin
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainenadd link path=usr/sfw/bin/gmake target=../../bin/gmake
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/sfw/share
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/sfw/share/man
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/sfw/share/man/man1
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd link path=usr/sfw/share/man/man1/gmake.1 target=../../../../share/man/man1/gmake.1
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=sys mode=0755 owner=root path=usr/share
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/share/info
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/share/man
a835194f9a9dae88528367a791cbc282589f6c01Timo Sirainenadd dir group=bin mode=0755 owner=root path=usr/share/man/man1
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainenadd file tmp/example_file elfarch=i386 elfbits=32 elfhash=68cca393e816e6adcbac1e8ffe9c618de70413e0 group=bin mode=0555 owner=root path=usr/bin/gmake pkg.size=12
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenadd file tmp/example_file group=bin mode=0444 owner=root path=usr/share/info/make.info pkg.size=12
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenadd file tmp/example_file group=bin mode=0444 owner=root path=usr/share/info/make.info-1 pkg.size=12
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenadd file tmp/example_file group=bin mode=0444 owner=root path=usr/share/info/make.info-2 pkg.size=12
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenadd file tmp/example_file group=bin mode=0444 owner=root path=usr/share/man/man1/gmake.1 pkg.size=12
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainenadd license tmp/example_file license=SUNWgmake.copyright pkg.size=12 transaction_id=1211931083_pkg%3A%2FSUNWgmake%403.81%2C5.11-0.89%3A20080527T163123Z
8da095519878426b012058e6f331a669f327f47fTimo Sirainenadd depend fmri=pkg:/SUNWcsl@0.5.11-0.89 type=require
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainenadd depend fmri=SUNWtestbar@0.5.11-0.111 type=require
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainenadd depend fmri=SUNWtestfoo@0.5.11-0.111 type=incorporate
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainenadd set name=description value="gmake - GNU make"
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainenadd legacy arch=i386 category=system desc="GNU make - A utility used to build software (gmake) 3.81" hotline="Please contact your local service provider" name="gmake - GNU make" pkg=SUNWgmake vendor="Sun Microsystems, Inc." version=11.11.0,REV=2008.04.29.02.08
ce19e80b5a907d51a7cdf081e09699af8367dbfaTimo Sirainenclose
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen"""
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_bug_983 = set([
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen ("pkg:/SUNWgmake@3.81-0.89", "basename", "link path=usr/sfw/bin/gmake target=../../bin/gmake"),
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen ('pkg:/SUNWgmake@3.81-0.89', 'basename', 'file a686473102ba73bd7920fc0ab1d97e00a24ed704 chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 elfarch=i386 elfbits=32 elfhash=68cca393e816e6adcbac1e8ffe9c618de70413e0 group=bin mode=0555 owner=root path=usr/bin/gmake pkg.csize=30 pkg.size=12'),
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen ('pkg:/SUNWgmake@3.81-0.89', 'gmake - GNU make', 'set name=description value="gmake - GNU make"')
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen ])
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen res_983_csl_dependency = set([
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen ('pkg:/SUNWgmake@3.81-0.89', 'require', 'depend fmri=pkg:/SUNWcsl@0.5.11-0.89 type=require')
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen ])
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen
69bd816e46fdee6182d0cb2e4c6be32399a555c8Timo Sirainen res_983_bar_dependency = set([
69bd816e46fdee6182d0cb2e4c6be32399a555c8Timo Sirainen ('pkg:/SUNWgmake@3.81-0.89', 'require', 'depend fmri=SUNWtestbar@0.5.11-0.111 type=require')
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen ])
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen res_983_foo_dependency = set([
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen ('pkg:/SUNWgmake@3.81-0.89', 'incorporate', 'depend fmri=SUNWtestfoo@0.5.11-0.111 type=incorporate')
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen ])
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res_local_pkg_ret_pkg = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "pkg:/example_pkg@1.0-0"
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen ])
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen res_remote_pkg_ret_pkg = set([
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "pkg:/example_pkg@1.0-0"
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen ])
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen res_remote_file = set([
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen ("pkg:/example_pkg@1.0-0",
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "path",
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "pkg.size=12"),
5196f9ea42d02000f9c3d22f20aa816140af4422Timo Sirainen ("pkg:/example_pkg@1.0-0",
5196f9ea42d02000f9c3d22f20aa816140af4422Timo Sirainen "a686473102ba73bd7920fc0ab1d97e00a24ed704",
5196f9ea42d02000f9c3d22f20aa816140af4422Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
5196f9ea42d02000f9c3d22f20aa816140af4422Timo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen "pkg.size=12"),
f239eb76f77afcbc0bfc97c9b52b4407d1bc3fe6Timo Sirainen ("pkg:/example_pkg@1.0-0",
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen "hash",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen "pkg.size=12")
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ]) | res_remote_path
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen res_remote_url = set([
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen ('pkg:/example_pkg@1.0-0',
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen 'http://service.opensolaris.com/xml/pkg/SUNWcsu@0.5.11,5.11-1:20080514I120000Z',
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen 'set name=com.sun.service.info_url value=http://service.opensolaris.com/xml/pkg/SUNWcsu@0.5.11,5.11-1:20080514I120000Z'),
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ])
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen res_remote_path_extra = set([
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen ("pkg:/example_pkg@1.0-0",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "basename",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
ba00293b85c7fb4e7a2d100991c716e17b9daaaeTimo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
0cea9b1f4fa0495a48f5f097e40492517d67e1baTimo Sirainen "pkg.size=12"),
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ("pkg:/example_pkg@1.0-0",
0cea9b1f4fa0495a48f5f097e40492517d67e1baTimo Sirainen "path",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "pkg.size=12"),
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen ("pkg:/example_pkg@1.0-0",
2af769daebd83719ac696a440e06f6020471cec0Timo Sirainen "a686473102ba73bd7920fc0ab1d97e00a24ed704",
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "pkg.size=12"),
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen ("pkg:/example_pkg@1.0-0",
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen "hash",
cc833a7a4e2258afdc834ace4bfe6579820a1df3Timo Sirainen "file a686473102ba73bd7920fc0ab1d97e00a24ed704 "
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen "chash=f88920ce1f61db185d127ccb32dc8cf401ae7a83 group=bin "
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "mode=0555 owner=root path=bin/example_path pkg.csize=30 "
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "pkg.size=12")
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen ])
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen
5bdad39213d28ab35e615a7f4ea1712ab25b6a80Timo Sirainen res_bad_pkg = set([
5bdad39213d28ab35e615a7f4ea1712ab25b6a80Timo Sirainen ('pkg:/bad_pkg@1.0-0', 'basename',
5bdad39213d28ab35e615a7f4ea1712ab25b6a80Timo Sirainen 'dir group=bin mode=0755 owner=root path=badfoo/')
5bdad39213d28ab35e615a7f4ea1712ab25b6a80Timo Sirainen ])
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen hierarchical_named_pkg_res = set([
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen ("pkg:/pa/pb/pc/pfoo@1.0-0", "test/pa/pb/pc/pfoo", "set name=pkg.fmri value=pkg://test/pa/pb/pc/pfoo@1.0,5.11-0:")
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen ])
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen fast_add_after_install = set([
bc564f1d3d953cf724828322b11ae89e0f59ffc9Timo Sirainen "VERSION: 2\n",
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen "pkg22@1.0,5.11",
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "pkg21@1.0,5.11"
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen ])
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen fast_remove_after_install = set([
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen "VERSION: 2\n",
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen ])
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen fast_add_after_first_update = set([
2af769daebd83719ac696a440e06f6020471cec0Timo Sirainen "VERSION: 2\n",
2af769daebd83719ac696a440e06f6020471cec0Timo Sirainen "pkg0@2.0,5.11",
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen "pkg22@1.0,5.11",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "pkg21@1.0,5.11",
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen "pkg1@2.0,5.11"
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen ])
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen fast_remove_after_first_update = set([
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "VERSION: 2\n",
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen "pkg0@1.0,5.11",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "pkg1@1.0,5.11"
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen ])
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen
6a8a4c9f530668cd8961b73d702856ed94f05f80Timo Sirainen res_smf_svc = set([
0d0451206a91e9f96e522075dce28a89adc2325dTimo Sirainen ('pkg:/example_pkg@1.0-0',
0d0451206a91e9f96e522075dce28a89adc2325dTimo Sirainen 'svc:/milestone/multi-user-server:default',
ba482d3624ca4f1b3d638e6e8470ba5134f21493Timo Sirainen 'set name=org.opensolaris.smf.fmri value=svc:/milestone/multi-user-server:default')
ba482d3624ca4f1b3d638e6e8470ba5134f21493Timo Sirainen ])
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen res_dir = set([
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen ('pkg:/example_pkg@1.0-0', 'path',
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen 'dir group=bin mode=0755 owner=root path=bin/example_dir')])
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen fast_add_after_second_update = set(["VERSION: 2\n"])
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen fast_remove_after_second_update = set(["VERSION: 2\n"])
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen debug_features = []
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen # We wire the contents of the example file to a well known string
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen # so that the hash is also well known.
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen misc_files = { "tmp/example_file" : "magic banana" }
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen def setUp(self):
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen pkg5unittest.SingleDepotTestCase.setUp(self,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen debug_features=self.debug_features, start_depot=True)
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen self.testdata_dir = os.path.join(self.test_root,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen "search_results")
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen os.mkdir(self.testdata_dir)
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen self._dir_restore_functions = [self._restore_dir,
e6e43b396799aa5704c679a3017d6c7195f9347dTimo Sirainen self._restore_dir_preserve_hash]
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen self.make_misc_files(self.misc_files)
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen
cf3bea6d9b57f8608bec22d98ad547a507b05f66Timo Sirainen def _check(self, proposed_answer, correct_answer):
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen if correct_answer == proposed_answer:
2af769daebd83719ac696a440e06f6020471cec0Timo Sirainen return True
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen else:
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen self.debug("Proposed Answer: " + str(proposed_answer))
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen self.debug("Correct Answer : " + str(correct_answer))
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen if isinstance(correct_answer, set) and \
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen isinstance(proposed_answer, set):
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen self.debug("Missing: " +
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen str(correct_answer - proposed_answer))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.debug("Extra : " +
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen str(proposed_answer - correct_answer))
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen self.assertEqualDiff(correct_answer, proposed_answer)
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen def _get_repo_index_dir(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen depotpath = self.dc.get_repodir()
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen repo = self.dc.get_repo()
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen rstore = repo.get_pub_rstore("test")
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen return rstore.index_root
114a0f74e0f825c6bd8aeadfafb248a030762a1fTimo Sirainen
114a0f74e0f825c6bd8aeadfafb248a030762a1fTimo Sirainen def _get_repo_writ_dir(self):
114a0f74e0f825c6bd8aeadfafb248a030762a1fTimo Sirainen depotpath = self.dc.get_repodir()
114a0f74e0f825c6bd8aeadfafb248a030762a1fTimo Sirainen repo = self.dc.get_repo()
7981779f9aebd25728d3c26555d598ff842cf2e2Timo Sirainen rstore = repo.get_pub_rstore("test")
7981779f9aebd25728d3c26555d598ff842cf2e2Timo Sirainen return rstore.writable_root
7981779f9aebd25728d3c26555d598ff842cf2e2Timo Sirainen
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen def _get_repo_catalog(self):
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen repo = self.dc.get_repo()
6fdf8b5e4e71a69f5974f59eec2b8c19bc421fe2Timo Sirainen rstore = repo.get_pub_rstore("test")
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen return rstore.catalog
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
6fdf8b5e4e71a69f5974f59eec2b8c19bc421fe2Timo Sirainen @staticmethod
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def _replace_act(act):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if act.startswith('set name=pkg.fmri'):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return act.strip().rsplit(":", 1)[0] + ":"
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen else:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return act.strip()
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen @staticmethod
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen def _extract_action_from_res(it):
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen return (
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen (fmri.PkgFmri(str(pkg_name)).get_short_fmri(), piece,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen TestApiSearchBasics._replace_act(act))
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen for query_num, auth, (version, return_type,
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen (pkg_name, piece, act))
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen in it
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen )
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen @staticmethod
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def _extract_package_from_res(it):
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen return (
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen (fmri.PkgFmri(str(pkg_name)).get_short_fmri())
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen for query_num, auth, (version, return_type, pkg_name)
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen in it
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen )
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @staticmethod
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def _get_lines(fp):
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen fh = open(fp, "rb")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lines = fh.readlines()
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen fh.close()
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen return lines
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen def _search_op(self, api_obj, remote, token, test_value,
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen case_sensitive=False, return_actions=True, num_to_return=None,
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen start_point=None, servers=None, prune_versions=True):
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen query = [api.Query(token, case_sensitive, return_actions,
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen num_to_return, start_point)]
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen self._search_op_common(api_obj, remote, query, test_value,
62cfc346eb7b0a4fd9e1ab6edd63b98711161229Timo Sirainen return_actions, servers, prune_versions)
62cfc346eb7b0a4fd9e1ab6edd63b98711161229Timo Sirainen
62cfc346eb7b0a4fd9e1ab6edd63b98711161229Timo Sirainen def _search_op_multi(self, api_obj, remote, tokens, test_value,
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen case_sensitive=False, return_actions=True, num_to_return=None,
62cfc346eb7b0a4fd9e1ab6edd63b98711161229Timo Sirainen start_point=None, servers=None, prune_versions=True):
62cfc346eb7b0a4fd9e1ab6edd63b98711161229Timo Sirainen query = [api.Query(token, case_sensitive, return_actions,
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen num_to_return, start_point) for token in tokens]
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen self._search_op_common(api_obj, remote, query, test_value,
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen return_actions, servers, prune_versions)
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen def _search_op_common(self, api_obj, remote, query, test_value,
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen return_actions, servers, prune_versions):
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen self.debug("Search for: {0}".format(" ".join([str(q) for q in query])))
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen search_func = api_obj.local_search
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen if remote:
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen search_func = lambda x: api_obj.remote_search(x,
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen servers=servers, prune_versions=prune_versions)
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen init_time = time.time()
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen # servers may not be ready immediately - retry search
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen # operation for 5 seconds
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while (time.time() - init_time) < 5:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen res = search_func(query)
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen if return_actions:
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen res = self._extract_action_from_res(res)
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen else:
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen res = self._extract_package_from_res(res)
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen res = set(res)
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen break
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen except api_errors.ProblematicSearchServers, e:
9566c1b4506d49778659e3dc65997f3c0399cb7eTimo Sirainen pass
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen
9566c1b4506d49778659e3dc65997f3c0399cb7eTimo Sirainen self._check(set(res), test_value)
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
9566c1b4506d49778659e3dc65997f3c0399cb7eTimo Sirainen def _search_op_slow(self, api_obj, remote, token, test_value,
9566c1b4506d49778659e3dc65997f3c0399cb7eTimo Sirainen case_sensitive=False, return_actions=True, num_to_return=None,
9566c1b4506d49778659e3dc65997f3c0399cb7eTimo Sirainen start_point=None):
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen query = [api.Query(token, case_sensitive, return_actions,
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen num_to_return, start_point)]
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen self._search_op_slow_common(api_obj, query, test_value,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return_actions)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def _search_op_slow_multi(self, api_obj, remote, tokens, test_value,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen case_sensitive=False, return_actions=True, num_to_return=None,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen start_point=None):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen query = [api.Query(token, case_sensitive, return_actions,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen num_to_return, start_point) for token in tokens]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self._search_op_slow_common(api_obj, query, test_value,
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen return_actions)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen def _search_op_slow_common(self, api_obj, query, test_value,
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen return_actions):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen search_func = api_obj.local_search
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen tmp = search_func(query)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res = []
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ssu = False
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen for i in tmp:
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen res.append(i)
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen except api_errors.SlowSearchUsed:
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen ssu = True
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen self.assert_(ssu)
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen if return_actions:
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen res = self._extract_action_from_res(res)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen res = self._extract_package_from_res(res)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen res = set(res)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._check(set(res), test_value)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen def _run_full_remote_tests(self, api_obj):
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "example_pkg",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_pkg)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "example_path",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_path)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "(example_path)",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_path)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "<exam*:::>",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_pkg_ret_pkg, return_actions=False)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "::com.sun.service.info_url:",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_url)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, ":::e* AND *path",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_path)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self._search_op(api_obj, True, "e* AND *path",
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen self.res_remote_path)
self._search_op(api_obj, True, "<e*>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "<e*> AND <e*>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "<e*> OR <e*>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "<exam:::>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "exam:::e*path",
self.res_remote_path)
self._search_op(api_obj, True, "exam:::e*path AND e*:::",
self.res_remote_path)
self._search_op(api_obj, True, "e*::: AND exam:::*path",
self.res_remote_path_extra)
self._search_op(api_obj, True, "example*",
self.res_remote_wildcard)
self._search_op(api_obj, True, "example",
self.res_remote_mediator)
self._search_op(api_obj, True, "7.0",
self.res_remote_mediator_version)
self._search_op(api_obj, True, "unladen-swallow",
self.res_remote_mediator_impl)
self._search_op(api_obj, True, "::mediator-implementation:unladen*",
self.res_remote_mediator_impl)
self._search_op(api_obj, True, ":link:mediator:example",
self.res_remote_mediator)
self._search_op(api_obj, True, ":link:mediator:example OR :link:mediator-version:7.0",
self.res_remote_mediator_and_ver)
self._search_op(api_obj, True, ":link:mediator:example OR :link:mediator-version:7.0 OR :link:mediator-implementation:unladen-swallow",
self.res_remote_mediator_and_ver_impl)
self._search_op(api_obj, True, "/bin", self.res_remote_bin)
self._search_op(api_obj, True, "4851433",
self.res_remote_bug_id)
self._search_op(api_obj, True, "<4851433> AND <4725245>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "4851433 AND 4725245",
self.res_remote_bug_id)
self._search_op(api_obj, True,
"4851433 AND 4725245 OR example_path",
self.res_remote_bug_id)
self._search_op(api_obj, True,
"4851433 AND (4725245 OR example_path)",
self.res_remote_bug_id)
self._search_op(api_obj, True,
"(4851433 AND 4725245) OR example_path",
self.res_remote_bug_id | self.res_remote_path)
self._search_op(api_obj, True, "4851433 OR 4725245",
self.res_remote_bug_id | self.res_remote_bug_id_4725245)
self._search_op(api_obj, True, "6556919",
self.res_remote_inc_changes)
self._search_op(api_obj, True, "6556?19",
self.res_remote_inc_changes)
self._search_op(api_obj, True, "42",
self.res_remote_random_test)
self._search_op(api_obj, True, "79",
self.res_remote_random_test_79)
self._search_op(api_obj, True, "separator",
self.res_remote_keywords)
self._search_op(api_obj, True, "\"sort 0x86\"",
self.res_remote_keywords)
self._search_op(api_obj, True, "*example*",
self.res_remote_glob)
self._search_op(api_obj, True, "fooo", self.res_remote_foo)
self._search_op(api_obj, True, "fo*", self.res_remote_foo)
self._search_op(api_obj, True, "bar", self.res_remote_foo)
self._search_op(api_obj, True, "openssl",
self.res_remote_openssl)
self._search_op(api_obj, True, "OPENSSL",
self.res_remote_openssl)
self._search_op(api_obj, True, "OpEnSsL",
self.res_remote_openssl)
# Test for bug 11235, case insensitive phrase search, and bug
# 11354, mangled fields during phrase search.
self._search_op(api_obj, True, "'OpEnSsL'",
self.res_remote_openssl)
self._search_op(api_obj, True, "OpEnS*",
self.res_remote_openssl)
# These tests are included because a specific bug
# was found during development. This prevents regression back
# to that bug. Exit status of 1 is expected because the
# token isn't in the packages.
self._search_op(api_obj, True, "a_non_existent_token", set())
self._search_op(api_obj, True, "42 AND 4641790", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, True, "<e*> AND e*", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, True, "e* AND <e*>", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, True, "<e*> OR e*", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, True, "e* OR <e*>", set())
# Test for bug 15284, \ not being treated as an escape character
# for : as well as testing that \: when used with field queries
# works as expected.
svc_name = "svc\:/milestone/multi-user-server\:default"
self._search_op(api_obj, True,
svc_name,
self.res_smf_svc)
self._search_op(api_obj, True,
"example_pkg:set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
":set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"{0} *milestone*".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"example_pkg:set:org.opensolaris.smf.fmri:{0} {1}".format(svc_name, svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"example_pkg:set:org.opensolaris.smf.fmri:{0} example_pkg:set:org.opensolaris.smf.fmri:{1}".format(
svc_name, svc_name),
self.res_smf_svc)
self._search_op(api_obj, True,
"{0} example_pkg:set:org.opensolaris.smf.fmri:{1}".format(
svc_name, svc_name),
self.res_smf_svc)
# Test that a single escaped colon doesn't cause a traceback.
self._search_op(api_obj, True, "\:", set())
# Test that doing a search restricted to dir actions works
# correctly. This is a test for bug 17645.
self._search_op(api_obj, True, "dir::/bin/example_dir",
self.res_dir)
def _run_remote_tests(self, api_obj):
self._search_op(api_obj, True, "example_pkg",
self.res_remote_pkg)
self._search_op(api_obj, True, "example_path",
self.res_remote_path)
self._search_op(api_obj, True, "::com.sun.service.info_url:",
self.res_remote_url)
self._search_op(api_obj, True, "<e*>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "<exam:::>",
self.res_remote_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, True, "exam:::e*path",
self.res_remote_path)
self._search_op(api_obj, True, "example*",
self.res_remote_wildcard)
self._search_op(api_obj, True, "/bin", self.res_remote_bin)
self._search_op(api_obj, True, "4851433",
self.res_remote_bug_id)
self._search_op(api_obj, True, "4725245",
self.res_remote_bug_id_4725245)
self._search_op(api_obj, True, "6556919",
self.res_remote_inc_changes)
self._search_op(api_obj, True, "42",
self.res_remote_random_test)
self._search_op(api_obj, True, "79",
self.res_remote_random_test_79)
self._search_op(api_obj, True, "separator",
self.res_remote_keywords)
self._search_op(api_obj, True, "\"sort 0x86\"",
self.res_remote_keywords)
self._search_op(api_obj, True, "*example*",
self.res_remote_glob)
self._search_op(api_obj, True, "fooo", self.res_remote_foo)
self._search_op(api_obj, True, "bar", self.res_remote_foo)
self._search_op(api_obj, True, "OpEnSsL",
self.res_remote_openssl)
# These tests are included because a specific bug
# was found during development. This prevents regression back
# to that bug.
self._search_op(api_obj, True, "a_non_existent_token", set())
def _run_full_local_tests(self, api_obj):
outfile = os.path.join(self.testdata_dir, "res")
# This finds something because the client side
# manifest has had the name of the package inserted
# into it.
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg)
self._search_op(api_obj, False, "example_path",
self.res_local_path)
self._search_op(api_obj, False, "(example_path)",
self.res_local_path)
self._search_op(api_obj, False, "<exam*:::>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "::com.sun.service.info_url:",
self.res_remote_url)
self._search_op(api_obj, False, ":::e* AND *path",
self.res_local_path)
self._search_op(api_obj, False, "e* AND *path",
self.res_local_path)
self._search_op(api_obj, False, "<e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "<e*> AND <e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "<e*> OR <e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "<exam:::>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "exam:::e*path",
self.res_local_path)
self._search_op(api_obj, False, "exam:::e*path AND e*:::",
self.res_local_path)
self._search_op(api_obj, False, "e*::: AND exam:::*path",
self.res_remote_path_extra)
self._search_op(api_obj, False, "example*",
self.res_local_wildcard)
self._search_op(api_obj, True, "example",
self.res_local_mediator)
self._search_op(api_obj, True, "7.0",
self.res_local_mediator_version)
self._search_op(api_obj, True, "unladen-swallow",
self.res_local_mediator_impl)
self._search_op(api_obj, True, "::mediator-implementation:unladen*",
self.res_local_mediator_impl)
self._search_op(api_obj, True, ":link:mediator:example",
self.res_local_mediator)
self._search_op(api_obj, True, ":link:mediator:example OR :link:mediator-version:7.0",
self.res_local_mediator_and_ver)
self._search_op(api_obj, True, ":link:mediator:example OR :link:mediator-version:7.0 OR :link:mediator-implementation:unladen-swallow",
self.res_local_mediator_and_ver_impl)
self._search_op(api_obj, False, "/bin", self.res_local_bin)
self._search_op(api_obj, False, "4851433",
self.res_local_bug_id)
self._search_op(api_obj, False, "<4851433> AND <4725245>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "4851433 AND 4725245",
self.res_local_bug_id)
self._search_op(api_obj, False,
"4851433 AND 4725245 OR example_path",
self.res_local_bug_id)
self._search_op(api_obj, False,
"4851433 AND (4725245 OR example_path)",
self.res_local_bug_id)
self._search_op(api_obj, False,
"(4851433 AND 4725245) OR example_path",
self.res_local_bug_id | self.res_local_path)
self._search_op(api_obj, False, "4851433 OR 4725245",
self.res_local_bug_id | self.res_remote_bug_id_4725245)
self._search_op(api_obj, False, "6556919",
self.res_local_inc_changes)
self._search_op(api_obj, False, "65569??",
self.res_local_inc_changes)
self._search_op(api_obj, False, "42",
self.res_local_random_test)
self._search_op(api_obj, False, "79",
self.res_remote_random_test_79)
self._search_op(api_obj, False, "separator",
self.res_local_keywords)
self._search_op(api_obj, False, "\"sort 0x86\"",
self.res_remote_keywords)
self._search_op(api_obj, False, "*example*",
self.res_local_glob)
self._search_op(api_obj, False, "fooo", self.res_local_foo)
self._search_op(api_obj, False, "fo*", self.res_local_foo)
self._search_op(api_obj, False, "bar", self.res_local_foo)
self._search_op(api_obj, False, "openssl",
self.res_local_openssl)
self._search_op(api_obj, False, "OPENSSL",
self.res_local_openssl)
self._search_op(api_obj, False, "OpEnSsL",
self.res_local_openssl)
# Test for bug 11235, case insensitive phrase search, and bug
# 11354, mangled fields during phrase search.
self._search_op(api_obj, False, "'OpEnSsL'",
self.res_remote_openssl)
self._search_op(api_obj, False, "OpEnS*",
self.res_local_openssl)
# These tests are included because a specific bug
# was found during development. These tests prevent regression
# back to that bug. Exit status of 1 is expected because the
# token isn't in the packages.
self._search_op(api_obj, False, "a_non_existent_token", set())
self._search_op(api_obj, False, "42 AND 4641790", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, False, "<e*> AND e*", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, False, "e* AND <e*>", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, False, "<e*> OR e*", set())
self.assertRaises(api_errors.BooleanQueryException,
self._search_op, api_obj, False, "e* OR <e*>", set())
# Test for bug 15284, \ not being treated as an escape character
# for : as well as testing that \: when used with field queries
# works as expected.
svc_name = "svc\:/milestone/multi-user-server\:default"
self._search_op(api_obj, False,
svc_name,
self.res_smf_svc)
self._search_op(api_obj, False,
"example_pkg:set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
":set:org.opensolaris.smf.fmri:{0}".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"{0} *milestone*".format(svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"example_pkg:set:org.opensolaris.smf.fmri:{0} {1}".format(svc_name, svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"example_pkg:set:org.opensolaris.smf.fmri:{0} example_pkg:set:org.opensolaris.smf.fmri:{1}".format(
svc_name, svc_name),
self.res_smf_svc)
self._search_op(api_obj, False,
"{0} example_pkg:set:org.opensolaris.smf.fmri:{1}".format(
svc_name, svc_name),
self.res_smf_svc)
# Test that a single escaped colon doesn't cause a traceback.
self._search_op(api_obj, True, "\:", set())
def _run_local_tests(self, api_obj):
outfile = os.path.join(self.testdata_dir, "res")
# This finds something because the client side
# manifest has had the name of the package inserted
# into it.
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg)
self._search_op(api_obj, False, "example_path",
self.res_local_path)
self._search_op(api_obj, False, "::com.sun.service.info_url:",
self.res_remote_url)
self._search_op(api_obj, False, "<e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "<exam:::>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op(api_obj, False, "exam:::e*path",
self.res_local_path)
self._search_op(api_obj, False, "example*",
self.res_local_wildcard)
self._search_op(api_obj, False, "/bin", self.res_local_bin)
self._search_op(api_obj, False, "4851433",
self.res_local_bug_id)
self._search_op(api_obj, False, "4725245",
self.res_remote_bug_id_4725245)
self._search_op(api_obj, False, "6556919",
self.res_local_inc_changes)
self._search_op(api_obj, False, "42",
self.res_local_random_test)
self._search_op(api_obj, False, "79",
self.res_remote_random_test_79)
self._search_op(api_obj, False, "separator",
self.res_local_keywords)
self._search_op(api_obj, False, "\"sort 0x86\"",
self.res_remote_keywords)
self._search_op(api_obj, False, "*example*",
self.res_local_glob)
self._search_op(api_obj, False, "fooo", self.res_local_foo)
self._search_op(api_obj, False, "bar", self.res_local_foo)
self._search_op(api_obj, False, "OpEnSsL",
self.res_local_openssl)
# These tests are included because a specific bug
# was found during development. These tests prevent regression
# back to that bug.
self._search_op(api_obj, False, "a_non_existent_token", set())
# Test that doing a search restricted to dir actions works
# correctly. This is a test for bug 17645.
self._search_op(api_obj, False, "dir::/bin/example_dir",
self.res_dir)
def _run_degraded_local_tests(self, api_obj):
outfile = os.path.join(self.testdata_dir, "res")
# This finds something because the client side
# manifest has had the name of the package inserted
# into it.
self._search_op_slow(api_obj, False, "example_pkg",
self.res_local_pkg)
self._search_op_slow(api_obj, False, "example_path",
self.res_local_path)
self._search_op_slow(api_obj, False, "(example_path)",
self.res_local_path)
self._search_op_slow(api_obj, False, "<exam*:::>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False,
"::com.sun.service.info_url:",
self.res_remote_url)
self._search_op_slow(api_obj, False, ":::e* AND *path",
self.res_local_path)
self._search_op_slow(api_obj, False, "e* AND *path",
self.res_local_path)
self._search_op_slow(api_obj, False, "<e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False, "<e*> AND <e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False, "<e*> OR <e*>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False, "<exam:::>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False, "exam:::e*path",
self.res_local_path)
self._search_op_slow(api_obj, False, "exam:::e*path AND e*:::",
self.res_local_path)
self._search_op_slow(api_obj, False, "e*::: AND exam:::*path",
self.res_remote_path_extra)
self._search_op_slow(api_obj, False, "example*",
self.res_local_wildcard)
self._search_op_slow(api_obj, True, "example",
self.res_local_mediator)
self._search_op_slow(api_obj, True, "7.0",
self.res_local_mediator_version)
self._search_op_slow(api_obj, True, "unladen-swallow",
self.res_local_mediator_impl)
self._search_op_slow(api_obj, True,
"::mediator-implementation:unladen*",
self.res_local_mediator_impl)
self._search_op_slow(api_obj, True, ":link:mediator:example",
self.res_local_mediator)
self._search_op_slow(api_obj, True,
":link:mediator:example OR :link:mediator-version:7.0",
self.res_local_mediator_and_ver)
self._search_op_slow(api_obj, True,
":link:mediator:example OR :link:mediator-version:7.0 OR :link:mediator-implementation:unladen-swallow",
self.res_local_mediator_and_ver_impl)
self._search_op_slow(api_obj, False, "/bin", self.res_local_bin)
self._search_op_slow(api_obj, False, "4851433",
self.res_local_bug_id)
self._search_op_slow(api_obj, False, "<4851433> AND <4725245>",
self.res_local_pkg_ret_pkg, return_actions=False)
self._search_op_slow(api_obj, False, "4851433 AND 4725245",
self.res_local_bug_id)
self._search_op_slow(api_obj, False,
"4851433 AND 4725245 OR example_path",
self.res_local_bug_id)
self._search_op_slow(api_obj, False,
"4851433 AND (4725245 OR example_path)",
self.res_local_bug_id)
self._search_op_slow(api_obj, False,
"(4851433 AND 4725245) OR example_path",
self.res_local_bug_id | self.res_local_path)
self._search_op_slow(api_obj, False, "4851433 OR 4725245",
self.res_local_bug_id | self.res_remote_bug_id_4725245)
self._search_op_slow(api_obj, False, "6556919",
self.res_local_inc_changes)
self._search_op_slow(api_obj, False, "65569??",
self.res_local_inc_changes)
self._search_op_slow(api_obj, False, "42",
self.res_local_random_test)
self._search_op_slow(api_obj, False, "79",
self.res_remote_random_test_79)
self._search_op_slow(api_obj, False, "separator",
self.res_local_keywords)
self._search_op_slow(api_obj, False, "\"sort 0x86\"",
self.res_remote_keywords)
self._search_op_slow(api_obj, False, "*example*",
self.res_local_glob)
self._search_op_slow(api_obj, False, "fooo", self.res_local_foo)
self._search_op_slow(api_obj, False, "fo*", self.res_local_foo)
self._search_op_slow(api_obj, False, "bar", self.res_local_foo)
self._search_op_slow(api_obj, False, "openssl",
self.res_local_openssl)
self._search_op_slow(api_obj, False, "OPENSSL",
self.res_local_openssl)
self._search_op_slow(api_obj, False, "OpEnSsL",
self.res_local_openssl)
self._search_op_slow(api_obj, False, "OpEnS*",
self.res_local_openssl)
# These tests are included because a specific bug
# was found during development. These tests prevent regression
# back to that bug. Exit status of 1 is expected because the
# token isn't in the packages.
self._search_op_slow(api_obj, False, "a_non_existent_token",
set())
def _run_remove_root_search(self, search_func, remote, api_obj, ip):
search_func(api_obj, remote, [ip + "example_pkg"], set())
search_func(api_obj, remote, [ip + "bin/example_path"],
self.res_remote_path_of_example_path)
search_func(api_obj, remote, ["({0}bin/example_path)".format(ip)],
self.res_remote_path_of_example_path)
search_func(api_obj, remote, ["<{0}exam*:::>".format(ip)],
set(), return_actions=False)
search_func(api_obj, remote,
["::{0}com.sun.service.info_url:".format(ip)], set())
search_func(api_obj, remote,
["{0}bin/e* AND {1}*path".format(ip, ip)],
self.res_remote_path_of_example_path)
search_func(api_obj, remote,
["(4851433 AND 4725245) OR :file::{0}bin/example_path".format(ip)],
self.res_remote_bug_id |
self.res_remote_path_of_example_path)
search_func(api_obj, remote,
[":::{0}bin/example_path OR (4851433 AND 4725245)".format(ip)],
self.res_remote_bug_id |
self.res_remote_path_of_example_path)
search_func(api_obj, remote,
["{0}bin/example_path OR {1}bin/example_path".format(ip, ip)],
self.res_remote_path_of_example_path)
search_func(api_obj, remote,
["<::path:{0}bin/example_path> OR <(a AND b)>".format(ip)],
self.res_remote_pkg_ret_pkg, return_actions=False)
search_func(api_obj, remote,
["<(a AND b)> OR <{0}bin/example_path>".format(ip)],
self.res_remote_pkg_ret_pkg, return_actions=False)
# The tests below here are for testing that multiple queries
# to search return the results from both queries (bug 10365)
search_func(api_obj, remote,
["<(a AND b)>", "example_path"],
self.res_remote_path)
search_func(api_obj, remote,
["example_path", "<(a AND b)>"],
self.res_remote_path)
search_func(api_obj, remote,
[":::{0}bin/example_path".format(ip), "(4851433 AND 4725245)"],
self.res_remote_bug_id |
self.res_remote_path_of_example_path)
search_func(api_obj, remote,
["(4851433 AND 4725245)", ":::{0}bin/example_path".format(ip)],
self.res_remote_bug_id |
self.res_remote_path_of_example_path)
def _run_local_tests_example11_installed(self, api_obj):
outfile = os.path.join(self.testdata_dir, "res")
# This finds something because the client side
# manifest has had the name of the package inserted
# into it.
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg_example11)
self._search_op(api_obj, False, "example_path", set())
self._search_op(api_obj, False, "example_path11",
self.res_local_path_example11)
self._search_op(api_obj, False, "example*",
self.res_local_wildcard_example11)
self._search_op(api_obj, False, "/bin",
self.res_local_bin_example11)
def _run_local_empty_tests(self, api_obj):
self._search_op(api_obj, False, "example_pkg", set())
self._search_op(api_obj, False, "example_path", set())
self._search_op(api_obj, False, "example*", set())
self._search_op(api_obj, False, "/bin", set())
def _run_remote_empty_tests(self, api_obj):
self._search_op(api_obj, True, "example_pkg", set())
self._search_op(api_obj, True, "example_path", set())
self._search_op(api_obj, True, "example*", set())
self._search_op(api_obj, True, "/bin", set())
self._search_op(api_obj, True, "*unique*", set())
@staticmethod
def _restore_dir(index_dir, index_dir_tmp):
shutil.rmtree(index_dir)
shutil.move(index_dir_tmp, index_dir)
@staticmethod
def _restore_dir_preserve_hash(index_dir, index_dir_tmp):
tmp_file = "full_fmri_list.hash"
portable.remove(os.path.join(index_dir_tmp, tmp_file))
shutil.move(os.path.join(index_dir, tmp_file),
index_dir_tmp)
fh = open(os.path.join(index_dir_tmp, ss.MAIN_FILE), "r")
fh.seek(0)
fh.seek(9)
ver = fh.read(1)
fh.close()
fh = open(os.path.join(index_dir_tmp, tmp_file), "r+")
fh.seek(0)
fh.seek(9)
# Overwrite the existing version number.
# By definition, the version 0 is never used.
fh.write("{0}".format(ver))
shutil.rmtree(index_dir)
shutil.move(index_dir_tmp, index_dir)
def _get_index_dirs(self):
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
index_dir_tmp = index_dir + "TMP"
return index_dir, index_dir_tmp
@staticmethod
def _overwrite_version_number(file_path):
fh = open(file_path, "r+")
fh.seek(0)
fh.seek(9)
# Overwrite the existing version number.
# By definition, the version 0 is never used.
fh.write("0")
fh.close()
@staticmethod
def _overwrite_on_disk_format_version_number(file_path):
fh = open(file_path, "r+")
fh.seek(0)
fh.seek(16)
# Overwrite the existing version number.
# By definition, the version 0 is never used.
fh.write("9")
fh.close()
@staticmethod
def _overwrite_on_disk_format_version_number_with_letter(file_path):
fh = open(file_path, "r+")
fh.seek(0)
fh.seek(16)
# Overwrite the existing version number.
# By definition, the version 0 is never used.
fh.write("a")
fh.close()
@staticmethod
def _replace_on_disk_format_version(dir):
file_path = os.path.join(dir, ss.BYTE_OFFSET_FILE)
fh = open(file_path, "r")
lst = fh.readlines()
fh.close()
fh = open(file_path, "w")
fh.write(lst[0])
for l in lst[2:]:
fh.write(l)
fh.close()
@staticmethod
def _overwrite_hash(ffh_path):
fd, tmp = tempfile.mkstemp()
portable.copyfile(ffh_path, tmp)
fh = open(tmp, "r+")
fh.seek(0)
fh.seek(20)
fh.write("*")
fh.close()
portable.rename(tmp, ffh_path)
def _check_no_index(self):
ind_dir, ind_dir_tmp = self._get_index_dirs()
if os.listdir(ind_dir):
self.assert_(0)
if os.path.exists(ind_dir_tmp):
self.assert_(0)
@staticmethod
def validateAssertRaises(ex_type, validate_func, func, *args, **kwargs):
try:
func(*args, **kwargs)
except ex_type, e:
validate_func(e)
else:
raise RuntimeError("Didn't raise expected exception.")
@staticmethod
def _check_err(e, expected_str, expected_code):
err = e.read()
if expected_code != e.code:
raise RuntimeError("Got wrong code, expected {0} got "
"{1}".format(expected_code, e.code))
if expected_str not in err:
raise RuntimeError("Got unexpected error message of:\n"
"{0}".format(err))
class TestApiSearchBasicsP(TestApiSearchBasics):
# Only start/stop the depot once (instead of for every test)
persistent_setup = True
def __init__(self, *args, **kwargs):
TestApiSearchBasics.__init__(self, *args, **kwargs)
self.sent_pkgs = set()
def pkgsend_bulk(self, durl, pkg, optional=True):
if pkg not in self.sent_pkgs or optional == False:
self.sent_pkgs.add(pkg)
# Ensures indexing is done for every pkgsend.
TestApiSearchBasics.pkgsend_bulk(self, durl, pkg,
refresh_index=True)
self.wait_repo(self.dc.get_repodir())
def setUp(self):
TestApiSearchBasics.setUp(self)
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.example_pkg10, self.fat_pkg10,
self.another_pkg10))
def test_010_remote(self):
"""Test remote search."""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
# This should be a full test to test all functionality.
self._run_full_remote_tests(api_obj)
self._search_op(api_obj, True, ":file::", self.res_remote_file)
def test_020_local_0(self):
"""Install one package, and run the search suite."""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg"])
self._run_full_local_tests(api_obj)
def test_030_degraded_local(self):
"""Install one package, and run the search suite."""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0"])
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
shutil.rmtree(index_dir)
self._run_degraded_local_tests(api_obj)
def test_040_repeated_install_uninstall(self):
"""Install and uninstall a package. Checking search both
after each change to the image."""
# During development, the index could become corrupted by
# repeated installing and uninstalling a package. This
# tests if that has been fixed.
repeat = 3
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0"])
self._api_uninstall(api_obj, ["example_pkg"])
for i in range(1, repeat):
self._api_install(api_obj, ["example_pkg"])
self._run_local_tests(api_obj)
self._api_uninstall(api_obj, ["example_pkg"])
api_obj.reset()
self._run_local_empty_tests(api_obj)
def test_050_local_case_sensitive(self):
"""Test local case sensitive search"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0"])
self._search_op(api_obj, False, "fooo", set(), True)
self._search_op(api_obj, False, "fo*", set(), True)
self._search_op(api_obj, False, "bar", set(), True)
self._search_op(api_obj, False, "FOOO", self.res_local_foo,
True)
self._search_op(api_obj, False, "bAr", self.res_local_foo, True)
def test_060_missing_files(self):
"""Test to check for stack trace when files missing.
Bug 2753"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0"])
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
self._search_op(api_obj, False, "fooo", set(), True)
first = True
for d in query_parser.TermQuery._get_gdd(index_dir).values():
orig_fn = d.get_file_name()
orig_path = os.path.join(index_dir, orig_fn)
dest_fn = orig_fn + "TMP"
dest_path = os.path.join(index_dir, dest_fn)
portable.rename(orig_path, dest_path)
self.assertRaises(api_errors.InconsistentIndexException,
self._search_op, api_obj, False,
"exam:::example_pkg", [])
if first:
# Run the shell version once to check that no
# stack trace happens.
self.pkg("search -l 'exam:::example_pkg'",
exit=1)
first = False
portable.rename(dest_path, orig_path)
self._search_op(api_obj, False, "exam:::example_pkg",
self.res_local_pkg)
def test_070_mismatched_versions(self):
"""Test to check for stack trace when files missing.
Bug 2753"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0"])
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
self._search_op(api_obj, False, "fooo", set(), True)
first = True
for d in query_parser.TermQuery._get_gdd(index_dir).values():
orig_fn = d.get_file_name()
orig_path = os.path.join(index_dir, orig_fn)
dest_fn = orig_fn + "TMP"
dest_path = os.path.join(index_dir, dest_fn)
shutil.copy(orig_path, dest_path)
self._overwrite_version_number(orig_path)
api_obj.reset()
self.assertRaises(api_errors.InconsistentIndexException,
self._search_op, api_obj, False,
"exam:::example_pkg", [])
if first:
# Run the shell version once to check that no
# stack trace happens.
self.pkg("search -l 'exam:::example_pkg'",
exit=1)
first = False
portable.rename(dest_path, orig_path)
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg)
self._overwrite_version_number(orig_path)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["example_pkg"],
catch_wsie=False)
api_obj.reset()
self._search_op(api_obj, False, "example_pkg", set())
self._overwrite_version_number(orig_path)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_install, api_obj, ["example_pkg"],
catch_wsie=False)
api_obj.reset()
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg)
ffh = ss.IndexStoreSetHash(ss.FULL_FMRI_HASH_FILE)
ffh_path = os.path.join(index_dir, ffh.get_file_name())
dest_fh, dest_path = tempfile.mkstemp()
shutil.copy(ffh_path, dest_path)
self._overwrite_hash(ffh_path)
self.assertRaises(api_errors.IncorrectIndexFileHash,
self._search_op, api_obj, False, "example_pkg", set())
# Run the shell version of the test to check for a stack trace.
self.pkg("search -l 'exam:::example_pkg'", exit=1)
portable.rename(dest_path, ffh_path)
self._search_op(api_obj, False, "example_pkg",
self.res_local_pkg)
self._overwrite_hash(ffh_path)
self.assertRaises(api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["example_pkg"],
catch_wsie=False)
self._search_op(api_obj, False, "example_pkg", set())
def test_080_weird_patterns(self):
"""Test strange patterns to ensure they're handled correctly"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._search_op(api_obj, True, "[*]", self.res_remote_weird)
self._search_op(api_obj, True, "[?]", self.res_remote_weird)
self._search_op(api_obj, True, "[[]", self.res_remote_weird)
self._search_op(api_obj, True, "[]]", self.res_remote_weird)
self._search_op(api_obj, True, "FO[O]O", self.res_remote_foo)
self._search_op(api_obj, True, "FO[?O]O", self.res_remote_foo)
self._search_op(api_obj, True, "FO[*O]O", self.res_remote_foo)
self._search_op(api_obj, True, "FO[]O]O", self.res_remote_foo)
def test_090_bug_7660(self):
"""Test that installing a package doesn't prevent searching on
package names from working on previously installed packages."""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
tmp_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index", "TMP")
self._api_install(api_obj, ["example_pkg"])
api_obj.rebuild_search_index()
self._api_install(api_obj, ["fat"])
self.assert_(not os.path.exists(tmp_dir))
self._run_local_tests(api_obj)
def test_100_bug_6712_i386(self):
"""Install one package, and run the search suite."""
durl = self.dc.get_depot_url()
variants = { "variant.arch": "i386" }
api_obj = self.image_create(durl, variants=variants)
remote = True
self._search_op(api_obj, remote, "fat:::*",
self.res_remote_fat10_star)
self._api_install(api_obj, ["fat"])
remote = False
self._search_op(api_obj, remote, "fat:::*",
self.res_local_fat10_i386_star)
def test_110_bug_6712_sparc(self):
"""Install one package, and run the search suite."""
durl = self.dc.get_depot_url()
variants = { "variant.arch": "sparc" }
api_obj = self.image_create(durl, variants=variants)
remote = True
self._search_op(api_obj, remote, "fat:::*",
self.res_remote_fat10_star)
self._api_install(api_obj, ["fat"])
remote = False
self._search_op(api_obj, remote, "fat:::*",
self.res_local_fat10_sparc_star)
def test_120_bug_3046(self):
"""Checks if directories ending in / break the indexer."""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.bad_pkg10)
api_obj = self.image_create(durl)
self._search_op(api_obj, True, "foo", set())
self._search_op(api_obj, True, "/", set())
def test_130_bug_1059(self):
"""Checks whether the fallback of removing the image root works.
Also tests whether multiple queries submitted via the api work.
"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
ip = self.get_img_path()
if not ip.endswith("/"):
ip += "/"
# Do remote searches
self._run_remove_root_search(self._search_op_multi, True,
api_obj, ip)
self._api_install(api_obj, ["example_pkg"])
# Do local searches
self._run_remove_root_search(self._search_op_multi, False,
api_obj, ip)
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
shutil.rmtree(index_dir)
# Do slow local searches
self._run_remove_root_search(self._search_op_slow_multi, False,
api_obj, ip)
def test_bug_2849(self):
"""Checks if things with spaces break the indexer."""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.space_pkg10)
api_obj = self.image_create(durl)
self._api_install(api_obj, ["space_pkg"])
self.pkgsend_bulk(durl, self.space_pkg10, optional=False)
api_obj.refresh(immediate=True)
self._api_install(api_obj, ["space_pkg"])
remote = False
self._search_op(api_obj, remote, 'with', set())
self._search_op(api_obj, remote, 'with*',
self.res_space_with_star)
self._search_op(api_obj, remote, '*space',
self.res_space_space_star)
self._search_op(api_obj, remote, 'space', set())
self._search_op(api_obj, remote, 'unique_dir',
self.res_space_unique)
remote = True
self._search_op(api_obj, remote, 'with', set())
self._search_op(api_obj, remote, 'with*',
self.res_space_with_star)
self._search_op(api_obj, remote, '*space',
self.res_space_space_star)
self._search_op(api_obj, remote, 'space', set())
self.pkgsend_bulk(durl, self.space_pkg10, optional=False)
# Need to add install of subsequent package and
# local side search as well as remote
self._search_op(api_obj, remote, 'with', set())
self._search_op(api_obj, remote, 'with*',
self.res_space_with_star)
self._search_op(api_obj, remote, '*space',
self.res_space_space_star)
self._search_op(api_obj, remote, 'space', set())
self._search_op(api_obj, remote, 'unique_dir',
self.res_space_unique)
def test_bug_2863(self):
"""Check that disabling indexing works as expected"""
durl = self.dc.get_depot_url()
api_obj = self.image_create(durl)
self._check_no_index()
self._api_install(api_obj, ["example_pkg"], update_index=False)
self._check_no_index()
api_obj.rebuild_search_index()
self._run_local_tests(api_obj)
self._api_uninstall(api_obj, ["example_pkg"], update_index=False)
# Running empty test because search will notice the index
# does not match the installed packages and complain.
self.assertRaises(api_errors.IncorrectIndexFileHash,
self._search_op, api_obj, False, "example_pkg", set())
api_obj.rebuild_search_index()
self._run_local_empty_tests(api_obj)
self._api_install(api_obj, ["example_pkg"])
self._run_local_tests(api_obj)
self.pkgsend_bulk(durl, self.example_pkg11)
api_obj.refresh(immediate=True)
self._api_update(api_obj, update_index=False)
# Running empty test because search will notice the index
# does not match the installed packages and complain.
self.assertRaises(api_errors.IncorrectIndexFileHash,
self._search_op, api_obj, False, "example_pkg", set())
api_obj.rebuild_search_index()
self._run_local_tests_example11_installed(api_obj)
self._api_uninstall(api_obj, ["example_pkg"],
update_index=False)
# Running empty test because search will notice the index
# does not match the installed packages and complain.
self.assertRaises(api_errors.IncorrectIndexFileHash,
self._search_op, api_obj, False, "example_pkg", set())
api_obj.rebuild_search_index()
self._run_local_empty_tests(api_obj)
def test_bug_2989_1(self):
durl = self.dc.get_depot_url()
for f in self._dir_restore_functions:
api_obj = self.image_create(durl)
api_obj.rebuild_search_index()
index_dir, index_dir_tmp = self._get_index_dirs()
shutil.copytree(index_dir, index_dir_tmp)
self._api_install(api_obj, ["example_pkg"])
f(index_dir, index_dir_tmp)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["example_pkg"],
catch_wsie=False)
self.image_destroy()
def test_bug_2989_2(self):
durl = self.dc.get_depot_url()
for f in self._dir_restore_functions:
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg"])
index_dir, index_dir_tmp = self._get_index_dirs()
shutil.copytree(index_dir, index_dir_tmp)
self._api_install(api_obj, ["another_pkg"])
f(index_dir, index_dir_tmp)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["another_pkg"],
catch_wsie=False)
self.image_destroy()
def test_bug_2989_3(self):
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.example_pkg11)
for f in self._dir_restore_functions:
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg@1.0,5.11-0"])
index_dir, index_dir_tmp = self._get_index_dirs()
shutil.copytree(index_dir, index_dir_tmp)
self._api_install(api_obj, ["example_pkg"])
f(index_dir, index_dir_tmp)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["example_pkg"],
catch_wsie=False)
self.image_destroy()
def test_bug_2989_4(self):
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.example_pkg11)
for f in self._dir_restore_functions:
api_obj = self.image_create(durl)
self._api_install(api_obj, ["another_pkg"])
index_dir, index_dir_tmp = self._get_index_dirs()
shutil.copytree(index_dir, index_dir_tmp)
self._api_install(api_obj, ["example_pkg@1.0,5.11-0"])
f(index_dir, index_dir_tmp)
self.assertRaises(
api_errors.WrapSuccessfulIndexingException,
self._api_update, api_obj, catch_wsie=False)
self.image_destroy()
def test_bug_4239(self):
"""Tests whether categories are indexed and searched for
correctly."""
def _run_cat_tests(self, remote):
self._search_op(api_obj, remote, "System",
self.res_cat_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "Security",
self.res_cat_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "System/Security",
self.res_cat_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "Other/Category",
self.res_cat_pkg10_2, case_sensitive=False)
self._search_op(api_obj, remote, "Other",
self.res_cat_pkg10_2, case_sensitive=False)
self._search_op(api_obj, remote, "Category",
self.res_cat_pkg10_2, case_sensitive=False)
def _run_cat2_tests(self, remote):
self._search_op(api_obj, remote, "Applications",
self.res_cat2_pkg10, case_sensitive=False)
self._search_op(api_obj, True, "Sound",
self.res_cat2_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "Sound and Video",
self.res_cat2_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "Sound*",
self.res_cat2_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "*Video",
self.res_cat2_pkg10, case_sensitive=False)
self._search_op(api_obj, remote,
"'Applications/Sound and Video'",
self.res_cat2_pkg10, case_sensitive=False)
# This is a test for bug 11002 which ensures that the
# unquoting is being performed correctly.
self._search_op(api_obj, remote,
"'Applications/Sound%20and%20Video'",
set(), case_sensitive=False)
self._search_op(api_obj, remote, "Developer/C",
self.res_cat2_pkg10_2, case_sensitive=False)
self._search_op(api_obj, remote, "Developer",
self.res_cat2_pkg10_2, case_sensitive=False)
self._search_op(api_obj, remote, "C",
self.res_cat2_pkg10_2, case_sensitive=False)
def _run_cat3_tests(self, remote):
self._search_op(api_obj, remote, "foo",
self.res_cat3_pkg10,case_sensitive=False)
self._search_op(api_obj, remote, "baz",
self.res_cat3_pkg10, case_sensitive=False)
self._search_op(api_obj, remote, "asda",
self.res_cat3_pkg10, case_sensitive=False)
self._search_op(api_obj, remote,
"foo/bar/baz/bill/beam/asda", self.res_cat3_pkg10,
case_sensitive=False)
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.cat_pkg10, self.cat2_pkg10,
self.cat3_pkg10, self.bad_cat_pkg10, self.bad_cat2_pkg10))
api_obj = self.image_create(durl)
remote = True
_run_cat_tests(self, remote)
_run_cat2_tests(self, remote)
_run_cat3_tests(self, remote)
remote = False
self._api_install(api_obj, ["cat"])
_run_cat_tests(self, remote)
self._api_install(api_obj, ["cat2"])
_run_cat2_tests(self, remote)
self._api_install(api_obj, ["cat3"])
_run_cat3_tests(self, remote)
self._api_install(api_obj, ["badcat"])
self._api_install(api_obj, ["badcat2"])
_run_cat_tests(self, remote)
_run_cat2_tests(self, remote)
_run_cat3_tests(self, remote)
def test_bug_7628(self):
"""Checks whether incremental update generates wrong
additional lines."""
durl = self.dc.get_depot_url()
ind_dir = self._get_repo_index_dir()
tok_file = os.path.join(ind_dir, ss.BYTE_OFFSET_FILE)
main_file = os.path.join(ind_dir, ss.MAIN_FILE)
self.pkgsend_bulk(durl, self.example_pkg10)
fh = open(tok_file)
tok_1 = fh.readlines()
tok_len = len(tok_1)
fh.close()
fh = open(main_file)
main_1 = fh.readlines()
main_len = len(main_1)
self.pkgsend_bulk(durl, self.example_pkg10, optional=False)
fh = open(tok_file)
tok_2 = fh.readlines()
new_tok_len = len(tok_2)
fh.close()
fh = open(main_file)
main_2 = fh.readlines()
new_main_len = len(main_2)
fh.close()
# Since the server now adds a set action for the FMRI to
# manifests during publication, there should be one
# additional line for the token file.
self.assertEqual(new_tok_len, tok_len + 1)
self.assertEqual(new_main_len, main_len + 1)
def test_bug_983(self):
"""Test for known bug 983."""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.bug_983_manifest)
api_obj = self.image_create(durl)
self._search_op(api_obj, True, "gmake", self.res_bug_983)
self._search_op(api_obj, True, "SUNWcsl@0.5.11-0.89",
self.res_983_csl_dependency)
self._search_op(api_obj, True, "SUNWcsl",
self.res_983_csl_dependency)
self._search_op(api_obj, True, "SUNWtestbar@0.5.11-0.111",
self.res_983_bar_dependency)
self._search_op(api_obj, True, "SUNWtestbar",
self.res_983_bar_dependency)
self._search_op(api_obj, True, "SUNWtestfoo@0.5.11-0.111",
self.res_983_foo_dependency)
self._search_op(api_obj, True, "SUNWtestfoo",
self.res_983_foo_dependency)
self._search_op(api_obj, True, "depend:require:",
self.res_983_csl_dependency | self.res_983_bar_dependency)
self._search_op(api_obj, True, "depend:incorporate:",
self.res_983_foo_dependency)
self._search_op(api_obj, True, "depend::",
self.res_983_csl_dependency | self.res_983_bar_dependency |
self.res_983_foo_dependency)
def test_bug_7534(self):
"""Tests that an automatic reindexing is detected by the test
suite."""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.example_pkg10)
api_obj = self.image_create(durl)
index_dir = os.path.join(self.img_path(), "var", "pkg",
"cache", "index")
api_obj.rebuild_search_index()
self._search_op(api_obj, False, 'example', set())
orig_fn = os.path.join(index_dir,
query_parser.TermQuery._get_gdd(index_dir).values()[0].\
get_file_name())
dest_fn = orig_fn + "TMP"
self._api_install(api_obj, ["example_pkg"])
api_obj.rebuild_search_index()
portable.rename(orig_fn, dest_fn)
self.assertRaises(api_errors.WrapSuccessfulIndexingException,
self._api_uninstall, api_obj, ["example_pkg"],
catch_wsie=False)
def test_bug_8492(self):
"""Tests that field queries and phrase queries work together.
"""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.bug_8492_manf_1,
self.bug_8492_manf_2))
api_obj = self.image_create(durl)
self._search_op(api_obj, True, "set::'image packaging'",
self.res_8492_1 | self.res_8492_2)
self._search_op(api_obj, True, "b1:set::'image packaging'",
self.res_8492_1)
self._api_install(api_obj, ["b1", "b2"])
self._search_op(api_obj, False, "set::'image packaging'",
self.res_8492_1 | self.res_8492_2)
self._search_op(api_obj, False, "b2:set::'image packaging'",
self.res_8492_2)
api_obj.rebuild_search_index()
self._search_op(api_obj, True, "set::'image packaging'",
self.res_8492_1 | self.res_8492_2)
self._search_op(api_obj, True, "b1:set::'image packaging'",
self.res_8492_1)
def test_bug_9845_01(self):
"""Test that a corrupt query doesn't break the server."""
durl = self.dc.get_depot_url()
expected_string = _("A query is expected to have five fields: "
"case sensitivity, return type, number of results to "
"return, the number at which to start returning results, "
"and the text of the query. The query provided lacked at "
"least one of those fields:")
expected_code = 404
q_str = "foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_02(self):
"""Test that a corrupt case_sensitive value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="case_sensitive",
bv="FAlse"
)
expected_code = 404
q_str = "FAlse_2_None_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_03(self):
"""Test that a corrupt return_type value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="return_type",
bv="3"
)
expected_code = 404
q_str = "False_3_None_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_04(self):
"""Test that a corrupt return_type value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="return_type",
bv="A"
)
expected_code = 404
q_str = "False_A_None_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_05(self):
"""Test that a corrupt num_to_return value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="num_to_return",
bv="NOne"
)
expected_code = 404
q_str = "False_2_NOne_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_06(self):
"""Test that a corrupt start_point value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="start_point",
bv="NOne"
)
expected_code = 404
q_str = "False_2_None_NOne_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_07(self):
"""Test that a corrupt case_sensitive value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="case_sensitive",
bv=""
)
expected_code = 404
q_str = "_2_None_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_08(self):
"""Test that a missing return_type value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="return_type",
bv=""
)
expected_code = 404
q_str = "False__None_None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_09(self):
"""Test that a missing num_to_return value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="num_to_return",
bv=""
)
expected_code = 404
q_str = "False_2__None_foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_10(self):
"""Test that a missing start_point value doesn't break the "
server."""
durl = self.dc.get_depot_url()
expected_string = _("{name} had a bad value of '{bv}'").format(
name="start_point",
bv=""
)
expected_code = 404
q_str = "False_2_None__foo"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_9845_11(self):
"""Test that missing query text doesn't break the server."""
durl = self.dc.get_depot_url()
expected_string = _("Could not parse query.")
expected_code = 400
q_str = "False_2_None_None_"
self.validateAssertRaises(urllib2.HTTPError,
lambda x: self._check_err(x, expected_string,
expected_code),
urllib2.urlopen, durl + "/search/1/" + q_str)
def test_bug_14177(self):
def run_tests(api_obj, remote):
self._search_op(api_obj, remote, "pfoo",
self.hierarchical_named_pkg_res,
case_sensitive=False)
self._search_op(api_obj, remote, "pc/pfoo",
self.hierarchical_named_pkg_res,
case_sensitive=False)
self._search_op(api_obj, remote, "pb/pc/pfoo",
self.hierarchical_named_pkg_res,
case_sensitive=False)
self._search_op(api_obj, remote, "pa/pb/pc/pfoo",
self.hierarchical_named_pkg_res,
case_sensitive=False)
self._search_op(api_obj, remote, "test/pa/pb/pc/pfoo",
self.hierarchical_named_pkg_res,
case_sensitive=False)
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.hierarchical_named_pkg)
api_obj = self.image_create(durl)
remote = True
run_tests(api_obj, remote)
self._api_install(api_obj, ["pfoo"])
remote = False
run_tests(api_obj, remote)
api_obj.rebuild_search_index()
api_obj.reset()
run_tests(api_obj, remote)
class TestApiSearchBasics_nonP(TestApiSearchBasics):
def setUp(self):
self.debug_features = ["headers"]
TestApiSearchBasics.setUp(self)
def pkgsend_bulk(self, durl, pkg):
# Ensures indexing is done for every pkgsend.
TestApiSearchBasics.pkgsend_bulk(self, durl, pkg,
refresh_index=True)
self.wait_repo(self.dc.get_repodir())
def test_local_image_update(self):
"""Test that the index gets updated by update and
that rebuilding the index works after updating the
image. Specifically, this tests that rebuilding indexes with
gaps in them works correctly."""
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.example_pkg10)
api_obj = self.image_create(durl)
self._api_install(api_obj, ["example_pkg"])
self.pkgsend_bulk(durl, self.example_pkg11)
api_obj.refresh(immediate=True)
self._api_update(api_obj)
self._run_local_tests_example11_installed(api_obj)
api_obj.rebuild_search_index()
self._run_local_tests_example11_installed(api_obj)
def test_bug_6177(self):
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.example_pkg10, self.example_pkg11,
self.incorp_pkg10, self.incorp_pkg11))
api_obj = self.image_create(durl)
res_both_actions = set([
('pkg:/example_pkg@1.1-0', 'path',
'dir group=bin mode=0755 owner=root path=bin'),
('pkg:/example_pkg@1.0-0', 'path',
'dir group=bin mode=0755 owner=root path=bin')
])
res_10_action = set([
('pkg:/example_pkg@1.0-0', 'path',
'dir group=bin mode=0755 owner=root path=bin')
])
res_11_action = set([
('pkg:/example_pkg@1.1-0', 'path',
'dir group=bin mode=0755 owner=root path=bin')
])
res_both_packages = set([
"pkg:/example_pkg@1.1-0",
"pkg:/example_pkg@1.0-0"
])
res_10_package = set([
"pkg:/example_pkg@1.0-0"
])
res_11_package = set([
"pkg:/example_pkg@1.1-0"
])
self._search_op(api_obj, True, "/bin", res_both_actions)
# Test that if a package is installed, its version and newer
# versions are shown.
self._api_install(api_obj, ["example_pkg@1.0"])
self._search_op(api_obj, True, "/bin", res_both_actions)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
# Check that after uninstall, back to returning all versions.
self._api_uninstall(api_obj, ["example_pkg"])
self._search_op(api_obj, True, "/bin", res_both_actions)
self._search_op(api_obj, True, "/bin", res_both_packages,
return_actions=False)
# Test that if a package is installed, its version and newer
# versions are shown. Older versions should not be shown.
self._api_install(api_obj, ["example_pkg@1.1"])
self._search_op(api_obj, True, "/bin", res_11_action)
self._search_op(api_obj, True, "</bin>", res_11_package,
return_actions=False)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
self._search_op(api_obj, True, "</bin>", res_both_packages,
return_actions=False, prune_versions=False)
# Check that after uninstall, back to returning all versions.
self._api_uninstall(api_obj, ["example_pkg"])
self._search_op(api_obj, True, "/bin", res_both_actions)
# Check that only the incorporated package is returned.
self._api_install(api_obj, ["incorp_pkg@1.0"])
self._search_op(api_obj, True, "/bin", res_10_action)
self._search_op(api_obj, True, "/bin", res_10_package,
return_actions=False)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
self._search_op(api_obj, True, "/bin", res_both_packages,
return_actions=False, prune_versions=False)
# Should now show the 1.1 version of example_pkg since the
# version has been upgraded.
self._api_install(api_obj, ["incorp_pkg"])
self._search_op(api_obj, True, "/bin", res_11_action)
self._search_op(api_obj, True, "</bin>", res_11_package,
return_actions=False)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
self._search_op(api_obj, True, "</bin>", res_both_packages,
return_actions=False, prune_versions=False)
# Should now show both again since the incorporation has been
# removed.
self._api_uninstall(api_obj, ["incorp_pkg"])
self._search_op(api_obj, True, "/bin", res_both_actions)
# Check that installed and incorporated work correctly together.
self._api_install(api_obj,
["incorp_pkg@1.0", "example_pkg@1.0"])
self._search_op(api_obj, True, "/bin", res_10_action)
self._search_op(api_obj, True, "</bin>", res_10_package,
return_actions=False)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
self._search_op(api_obj, True, "</bin>", res_both_packages,
return_actions=False, prune_versions=False)
# And that it works after the incorporation has been changed.
self._api_install(api_obj, ["incorp_pkg"])
self._search_op(api_obj, True, "/bin", res_11_action)
self._search_op(api_obj, True, "</bin>", res_11_package,
return_actions=False)
self._search_op(api_obj, True, "/bin", res_both_actions,
prune_versions=False)
self._search_op(api_obj, True, "</bin>", res_both_packages,
return_actions=False, prune_versions=False)
def __corrupt_depot(self, root):
self.dc.stop()
for entry in os.walk(root):
dirpath, dirnames, fnames = entry
if ss.MAIN_FILE in fnames:
src = os.path.join(dirpath, ss.MAIN_FILE)
dest = os.path.join(dirpath,
"main_dict.ascii.v1")
self.debug("moving {0} to {1}".format(src, dest))
shutil.move(src, dest)
self.dc.start()
def test_bug_7358_1(self):
"""Move files so that an inconsistent index is created and
check that the server rebuilds the index when possible, and
doesn't stack trace when it can't write to the directory."""
durl = self.dc.get_depot_url()
repo_path = self.dc.get_repodir()
api_obj = self.image_create(durl)
# Check when depot is empty.
self.__corrupt_depot(repo_path)
repo = self.dc.get_repo() # Every time to ensure current state.
repo.refresh_index()
# Since the depot is empty, should return no results but
# not error.
self._search_op(api_obj, True, 'e*', set())
self.pkgsend_bulk(durl, self.example_pkg10)
repo = self.dc.get_repo() # Every time to ensure current state.
repo.refresh_index()
self.dc.refresh()
# Check when depot contains a package.
self.__corrupt_depot(repo_path)
repo = self.dc.get_repo() # Every time to ensure current state.
repo.refresh_index()
self._run_remote_tests(api_obj)
def test_bug_7358_2(self):
"""Does same check as 7358_1 except it checks for interactions
with writable root."""
durl = self.dc.get_depot_url()
repo_path = self.dc.get_repodir()
ind_dir = self._get_repo_index_dir()
if os.path.exists(ind_dir):
shutil.rmtree(ind_dir)
writable_root = os.path.join(self.test_root,
"writ_root")
self.dc.set_writable_root(writable_root)
api_obj = self.image_create(durl)
# Check when depot is empty.
writ_dir = self._get_repo_writ_dir()
self.__corrupt_depot(writ_dir)
# Since the depot is empty, should return no results but
# not error.
self.assert_(not os.path.isdir(ind_dir))
self._search_op(api_obj, True, 'e*', set())
self.pkgsend_bulk(durl, self.example_pkg10)
# Check when depot contains a package.
self.__corrupt_depot(writ_dir)
self.assert_(not os.path.isdir(ind_dir))
self._run_remote_tests(api_obj)
def test_bug_8318(self):
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, self.example_pkg10)
api_obj = self.image_create(durl)
uuids = []
for p in api_obj.img.gen_publishers():
uuids.append(p.client_uuid)
self._search_op(api_obj, True, "example_path",
self.res_remote_path)
self._search_op(api_obj, True, "example_path",
self.res_remote_path, servers=[{"origin": durl}])
lfh = file(self.dc.get_logpath(), "rb")
found = 0
num_expected = 7
for line in lfh:
if "X-IPKG-UUID:" in line:
tmp = line.split()
s_uuid = tmp[1]
if s_uuid not in uuids:
raise RuntimeError("Uuid found:{0} not "
"found in list of possible "
"uuids:{1}".format(s_uuid, uuids))
found += 1
if found != num_expected:
raise RuntimeError(("Found {0} instances of a "
"client uuid, expected to find {1}.").format(
found, num_expected))
def test_bug_9729_1(self):
"""Test that installing more than
indexer.MAX_FAST_INDEXED_PKGS packages at a time doesn't
cause any type of indexing error."""
durl = self.dc.get_depot_url()
pkg_list = []
for i in range(0, indexer.MAX_FAST_INDEXED_PKGS + 1):
self.pkgsend_bulk(durl,
"open pkg{0}@1.0,5.11-0\nclose\n".format(i))
pkg_list.append("pkg{0}".format(i))
api_obj = self.image_create(durl)
self._api_install(api_obj, pkg_list)
def test_bug_9729_2(self):
"""Test that installing more than
indexer.MAX_FAST_INDEXED_PKGS packages one after another
doesn't cause any type of indexing error."""
def _remove_extra_info(v):
return v.split("-")[0]
durl = self.dc.get_depot_url()
pkg_list = []
for i in range(0, indexer.MAX_FAST_INDEXED_PKGS + 3):
self.pkgsend_bulk(durl,
"open pkg{0}@1.0,5.11-0\nclose\n".format(i))
pkg_list.append("pkg{0}".format(i))
api_obj = self.image_create(durl)
fast_add_loc = os.path.join(self._get_index_dirs()[0],
"fast_add.v1")
fast_remove_loc = os.path.join(self._get_index_dirs()[0],
"fast_remove.v1")
api_obj.rebuild_search_index()
for p in pkg_list:
self._api_install(api_obj, [p])
# Test for bug 11104. The fast_add.v1 file was not being updated
# correctly by install or image update, it was growing with
# each modification.
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_add_loc)
)), self.fast_add_after_install)
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_remove_loc)
)), self.fast_remove_after_install)
# Now check that image update also handles fast_add
# appropriately when a small number of packages have changed.
for i in range(0, 2):
self.pkgsend_bulk(durl,
"open pkg{0}@2.0,5.11-0\nclose\n".format(i))
pkg_list.append("pkg{0}".format(i))
api_obj.refresh(immediate=True)
self._api_update(api_obj)
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_add_loc)
)), self.fast_add_after_first_update)
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_remove_loc)
)), self.fast_remove_after_first_update)
# Check that a local search actually works.
test_value = 'pkg:/pkg{0}@2.0-0', 'test/pkg{0}', \
'set name=pkg.fmri value=pkg://test/pkg{0}@2.0,5.11-0:'
for n in range(0, 2):
tv = set([tuple(v.format(n) for v in test_value)])
self._search_op(api_obj, remote=False,
token="pkg{0}".format(n), test_value=tv)
# Now check that image update also handles fast_add
# appropriately when a large number of packages have changed.
for i in range(3, indexer.MAX_FAST_INDEXED_PKGS + 3):
self.pkgsend_bulk(durl,
"open pkg{0}@2.0,5.11-0\nclose\n".format(i))
pkg_list.append("pkg{0}".format(i))
api_obj.refresh(immediate=True)
self._api_update(api_obj)
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_add_loc)
)), self.fast_add_after_second_update)
self._check(set((
_remove_extra_info(v)
for v in self._get_lines(fast_remove_loc)
)), self.fast_remove_after_second_update)
# Check that a local search actually works.
for n in range(3, indexer.MAX_FAST_INDEXED_PKGS + 3):
tv = set([tuple(v.format(n) for v in test_value)])
self._search_op(api_obj, remote=False,
token="pkg{0}".format(n), test_value=tv)
def test_bug_13485(self):
"""Test that indexer.Indexer's check_for_updates function works
as excepted. This needs to be a separate test because other
tests are likely to conintue working while reindexing more
frequently than they should."""
durl = self.dc.get_depot_url()
ind_dir = self._get_repo_index_dir()
# Check that an empty index works correctly.
fmris = indexer.Indexer.check_for_updates(ind_dir,
self._get_repo_catalog())
self.assertEqual(set(), fmris)
self.pkgsend_bulk(durl, self.example_pkg10)
cat = self._get_repo_catalog()
self.assertEqual(len(set(cat.fmris())), 1)
# Check that after publishing one package, no packages need
# indexing.
fmris = indexer.Indexer.check_for_updates(ind_dir,
self._get_repo_catalog())
self.assertEqual(set(), fmris)
back_dir = ind_dir + ".BACKUP"
shutil.copytree(ind_dir, back_dir)
self.pkgsend_bulk(durl, self.example_pkg10)
cat = self._get_repo_catalog()
self.assertEqual(len(set(cat.fmris())), 2)
# Check that publishing a second package also works.
fmris = indexer.Indexer.check_for_updates(ind_dir,
self._get_repo_catalog())
self.assertEqual(set(), fmris)
# Check that a package that was publisher but not index is
# reported.
fmris = indexer.Indexer.check_for_updates(back_dir,
self._get_repo_catalog())
self.assertEqual(len(fmris), 1)
def test_bug_17672(self):
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.another_pkg10, self.space_pkg10,
self.require_any_manf))
repo = self.dc.get_repo()
repo.rebuild(build_catalog=False, build_index=True)
api_obj = self.image_create(durl)
expected_result = set([
('pkg:/ra@1.0-0', 'require-any',
'depend fmri=another_pkg@1.0,5.11-0 ' +
'fmri=pkg:/space_pkg@1.0,5.11-0 type=require-any')
])
self._search_op(api_obj, True, "depend::", expected_result)
self._api_install(api_obj, ["ra"])
self._search_op(api_obj, False, "depend::", expected_result)
api_obj.rebuild_search_index()
self._search_op(api_obj, False, "depend::", expected_result)
self._search_op(api_obj, False, "depend::another_pkg",
expected_result)
self._search_op(api_obj, False, "depend::space_pkg",
expected_result)
class TestApiSearchMulti(pkg5unittest.ManyDepotTestCase):
example_pkg10 = """
open example_pkg@1.0,5.11-0
add dir mode=0755 owner=root group=bin path=/bin/example_dir
close """
res_alternate_server_local = set([
('pkg:/example_pkg@1.0-0', 'test2/example_pkg',
'set name=pkg.fmri value=pkg://test2/example_pkg@1.0,5.11-0:')
])
def setUp(self):
pkg5unittest.ManyDepotTestCase.setUp(self, ["test1", "test2",
"test3"], debug_features=["headers"], start_depots=True)
self.durl1 = self.dcs[1].get_depot_url()
self.durl2 = self.dcs[2].get_depot_url()
self.durl3 = self.dcs[3].get_depot_url()
self.pkgsend_bulk(self.durl2, self.example_pkg10,
refresh_index=True)
self.wait_repo(self.dcs[2].get_repodir())
self.image_create(self.durl1, prefix="test1")
self.pkg("set-publisher -O " + self.durl2 + " test2")
def _check(self, proposed_answer, correct_answer):
if correct_answer == proposed_answer:
return True
else:
self.debug("Proposed Answer: " + str(proposed_answer))
self.debug("Correct Answer : " + str(correct_answer))
if isinstance(correct_answer, set) and \
isinstance(proposed_answer, set):
self.debug("Missing: " +
str(correct_answer - proposed_answer))
self.debug("Extra : " +
str(proposed_answer - correct_answer))
self.assertEqual(correct_answer, proposed_answer)
@staticmethod
def _extract_action_from_res(it, err):
res = []
if err:
try:
for query_num, auth, (version, return_type,
(pkg_name, piece, act)) in it:
res.append((fmri.PkgFmri(str(
pkg_name)).get_short_fmri(), piece,
TestApiSearchBasics._replace_act(
act)),)
except err, e:
return res
else:
raise RuntimeError(
"Didn't get expected error:{0}".format(err))
else:
return TestApiSearchBasics._extract_action_from_res(it)
def _search_op(self, api_obj, remote, token, test_value,
case_sensitive=False, return_actions=True, num_to_return=None,
start_point=None, servers=None, expected_err=None):
search_func = api_obj.local_search
query = api.Query(token, case_sensitive, return_actions,
num_to_return, start_point)
if remote:
search_func = api_obj.remote_search
res = set(self._extract_action_from_res(
search_func([query], servers=servers),
expected_err))
else:
res = set(TestApiSearchBasics._extract_action_from_res(
search_func([query])))
self._check(set(res), test_value)
def test_bug_2955(self):
"""See http://defect.opensolaris.org/bz/show_bug.cgi?id=2955"""
api_obj = self.get_img_api_obj()
self._api_install(api_obj, ["example_pkg"])
# Test for bug 10690 by checking whether the fmri names
# for packages installed from the non-preferred publisher
# are parsed correctly. Specifically, test whether the name
# alone is searchable, as well as the publisher/name
# combination.
self._search_op(api_obj, False, "set::test2/example_pkg",
self.res_alternate_server_local)
self._search_op(api_obj, False, "set::example_pkg",
self.res_alternate_server_local)
self._search_op(api_obj, False, "set::test2/*",
self.res_alternate_server_local)
api_obj.rebuild_search_index()
self._search_op(api_obj, False, "set::test2/example_pkg",
self.res_alternate_server_local)
self._search_op(api_obj, False, "set::example_pkg",
self.res_alternate_server_local)
self._search_op(api_obj, False, "set::test2/*",
self.res_alternate_server_local)
self._api_uninstall(api_obj, ["example_pkg"])
def test_bug_8318(self):
api_obj = self.get_img_api_obj()
self._search_op(api_obj, True,
"this_should_not_match_any_token", set())
self._search_op(api_obj, True, "example_path",
set(), servers=[{"origin": self.durl1}])
self._search_op(api_obj, True, "example_path",
set(), servers=[{"origin": self.durl3}])
num_expected = { 1: 6, 2: 5, 3: 0 }
for d in range(1,(len(self.dcs) + 1)):
try:
pub = api_obj.img.get_publisher(
origin=self.dcs[d].get_depot_url())
c_uuid = pub.client_uuid
except api_errors.UnknownPublisher:
c_uuid = None
lfh = file(self.dcs[d].get_logpath(), "rb")
found = 0
for line in lfh:
if "X-IPKG-UUID:" in line:
tmp = line.split()
s_uuid = tmp[1]
if s_uuid != c_uuid:
raise RuntimeError(
"Found uuid:{0} doesn't "
"match expected uuid:{1}, "
"d:{2}, durl:{3}".format(
s_uuid, c_uuid, d,
self.dcs[d].get_depot_url()))
found += 1
if found != num_expected[d]:
raise RuntimeError("d:{0}, found {1} instances of"
" a client uuid, expected to find {2}.".format(
d, found, num_expected[d]))
def test_bug_12739(self):
api_obj = self.get_img_api_obj()
self._search_op(api_obj, True, "example_dir",
set([("pkg:/example_pkg@1.0-0", "basename",
"dir group=bin mode=0755 owner=root "
"path=bin/example_dir")]))
self.dcs[1].stop()
self._search_op(api_obj, True, "example_dir",
set([("pkg:/example_pkg@1.0-0", "basename",
"dir group=bin mode=0755 owner=root "
"path=bin/example_dir")]),
expected_err=api_errors.ProblematicSearchServers)
self.pkg("search example_dir", exit=3)
if __name__ == "__main__":
unittest.main()