t_pkg_depotd.py revision 1895
89a126810703c666309310d0f3189e9834d70b5bTimo Sirainen#!/usr/bin/python
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen#
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# CDDL HEADER START
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen#
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen# The contents of this file are subject to the terms of the
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# Common Development and Distribution License (the "License").
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# You may not use this file except in compliance with the License.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen#
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# or http://www.opensolaris.org/os/licensing.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# See the License for the specific language governing permissions
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# and limitations under the License.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen#
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# If applicable, add the following below this CDDL HEADER, with the
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen#
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen# CDDL HEADER END
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen#
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport testutils
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenif __name__ == "__main__":
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen testutils.setup_environment("../../../proto")
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport pkg5unittest
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport httplib
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport os
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport shutil
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport tempfile
5bbce06405dd5fc0d67411e48856953785f109f5Timo Sirainenimport time
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport unittest
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport urllib
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport urllib2
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainenimport urlparse
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport pkg.depotcontroller as dc
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport pkg.fmri as fmri
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport pkg.misc as misc
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport pkg.p5i as p5i
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenimport pkg.server.repositoryconfig as rcfg
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenclass TestPkgDepot(pkg5unittest.SingleDepotTestCase):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Only start/stop the depot once (instead of for every test)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen persistent_setup = True
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen foo10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open foo@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add dir path=tmp/foo mode=0755 owner=root group=bin
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen bar10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open bar@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add dir path=tmp/bar mode=0755 owner=root group=bin
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen quux10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open quux@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add dir mode=0755 owner=root group=bin path=/bin
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add file tmp/cat mode=0555 owner=root group=bin path=/bin/cat
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add file tmp/libc.so.1 mode=0555 owner=root group=bin path=/lib/libc.so.1
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen info10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open info@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen update10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open update@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen update11 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open update@1.1,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen system10 = """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen open system/libc@1.0,5.11-0
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add set name="description" value="Package to test package names with slashes"
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add dir path=tmp/foo mode=0755 owner=root group=bin
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen add depend type=require fmri=pkg:/SUNWcsl
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen close """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc_files = [ "tmp/libc.so.1", "tmp/cat" ]
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def setUp(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # This suite, for obvious reasons, actually needs a depot.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen pkg5unittest.SingleDepotTestCase.setUp(self, start_depot=True)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.make_misc_files(self.misc_files)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_depot_ping(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """ Ping the depot several times """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def testStartStop(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """ Start and stop the depot several times """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen for i in range(0, 5):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bug_1876(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """ Send package quux@1.0 an action at a time, restarting the
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depot server after each one is sent, to ensure that
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen transactions work across depot restart. Then verify that
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen the package was successfully added by performing some
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen basic operations. """
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen durl = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen for line in self.quux10.split("\n"):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen line = line.strip()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen if line == "":
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen continue
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen try:
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend(durl, line, exit = 0)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen except:
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend(durl, "close -A", exit = 0)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen raise
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen if not line == "close":
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.restart_depots()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.image_create(durl)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("list -a")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("list", exit=1)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("install quux")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("list")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("verify")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("uninstall quux")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("verify")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bad_fmris(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen durl = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend(durl, "open foo@", exit=1)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend(durl, "open foo@x.y", exit=1)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend(durl, "open foo@1.0,-2.0", exit=1)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bug_3365(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen durl = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depotpath = self.dc.get_repodir()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen dir_file = os.path.join(depotpath, "search.dir")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen pag_file = os.path.join(depotpath, "search.pag")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not os.path.exists(dir_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not os.path.exists(pag_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen f = open(dir_file, "w")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen f.close()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen f = open(pag_file, "w")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen f.close()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(os.path.exists(dir_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(os.path.exists(pag_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend_bulk(durl, self.quux10)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not os.path.exists(dir_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not os.path.exists(pag_file))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bug_4489(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """Publish a package and then verify that the depot /info
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen operation doesn't fail."""
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depot_url = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen plist = self.pkgsend_bulk(depot_url, self.info10)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc.versioned_urlopen(depot_url, "info", [0], plist[0])
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bug_3739(self):
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen """Verify that a depot will return a 400 (Bad Request) error
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen whenever it is provided malformed FMRIs."""
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen durl = self.dc.get_depot_url()
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen for operation in ("info", "manifest"):
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen for entry in ("BRCMbnx", "BRCMbnx%40a",
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen "BRCMbnx%400.5.11%2C5.11-0.101%3A20081119T231649a"):
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen try:
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen urllib2.urlopen("%s/%s/0/%s" % (durl,
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen operation, entry))
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen except urllib2.HTTPError, e:
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen if e.code != httplib.BAD_REQUEST:
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen raise
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen
2de709376eddc50ec5fa470358bb57cf0a87bb1fTimo Sirainen def test_bug_5366(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """Publish a package with slashes in the name, and then verify
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen that the depot manifest and info operations work regardless of
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen the encoding."""
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depot_url = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen plist = self.pkgsend_bulk(depot_url, self.system10)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # First, try it un-encoded.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc.versioned_urlopen(depot_url, "info", [0], plist[0])
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc.versioned_urlopen(depot_url, "manifest", [0], plist[0])
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Second, try it encoded.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc.versioned_urlopen(depot_url, "info", [0],
e8ef7a8c30741ad30c617d453b1c32d8da0111deTimo Sirainen urllib.quote(plist[0]))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen misc.versioned_urlopen(depot_url, "manifest", [0],
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen urllib.quote(plist[0]))
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_bug_5707(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """Testing depotcontroller.refresh()."""
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depot_url = self.dc.get_depot_url()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend_bulk(depot_url, self.foo10)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.image_create(depot_url)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("install foo")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("verify")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen depot_file_url = "file://%s" % self.dc.get_repodir()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkgsend_bulk(depot_url, self.bar10)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("refresh")
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.pkg("install bar")
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.pkg("verify")
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.dc.refresh()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.pkg("refresh")
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.pkg("install bar", exit=4) # nothing to do
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.pkg("verify")
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen def test_face_root(self):
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen """Verify that files outside of the package content web root
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen cannot be accessed, and that files inside can be."""
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen depot_url = self.dc.get_depot_url()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen # Since /usr/share/lib/pkg/web/ is the content web root,
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen # any attempts to go outside that directory should fail
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen # with a 404 error.
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen try:
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen urllib2.urlopen("%s/../../../../bin/pkg" % depot_url)
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen except urllib2.HTTPError, e:
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen if e.code != httplib.NOT_FOUND:
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen raise
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen f = urllib2.urlopen("%s/robots.txt" % depot_url)
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.assert_(len(f.read()))
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen f.close()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def test_repo_create(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen """Verify that starting a depot server in readonly mode with
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen a non-existent or empty repo_dir fails and that permissions
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen errors are handled correctly during creation. Then verify
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen that starting a depot with the same directory in publishing
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen mode works and then a readonly depot again after that works.
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen """
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen dpath = os.path.join(self.test_root, "repo_create")
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen opath = self.dc.get_repodir()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.dc.set_repodir(dpath)
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # First, test readonly mode with a repo_dir that doesn't exist.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readonly()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start_expected_fail()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.assert_(not self.dc.is_alive())
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Next, test readonly mode with a repo_dir that is empty.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen os.makedirs(dpath, misc.PKG_DIR_MODE)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readonly()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.dc.start_expected_fail()
d290217adc3d17ba82fd81f164da3c2b88489700Timo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Next, test readwrite (publishing) mode with a non-existent
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # repo_dir.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen shutil.rmtree(dpath)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readwrite()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Next, test readwrite (publishing) mode with a non-existent
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # repo_dir for an unprivileged user.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen shutil.rmtree(dpath)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readwrite()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen wr_start, wr_end = self.dc.get_wrapper()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen su_wrap, su_end = self.get_su_wrapper(su_wrap=True)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen try:
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_wrapper([su_wrap], su_end)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start_expected_fail(exit=1)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen finally:
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Even if this test fails, this wrapper must be reset.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_wrapper(wr_start, wr_end)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Next, test readwrite (publishing) mode with an empty repo_dir.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen os.makedirs(dpath, misc.PKG_DIR_MODE)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readwrite()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
da27cf9a026b1c6708bdc0de1c02b83838e64bd8Timo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Finally, re-test readonly mode now that the repository has
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # been created.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_readonly()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.start()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.stop()
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.assert_(not self.dc.is_alive())
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen # Cleanup.
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen shutil.rmtree(dpath)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen self.dc.set_repodir(opath)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainenclass TestDepotController(pkg5unittest.CliTestCase):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen def setUp(self):
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen pkg5unittest.CliTestCase.setUp(self)
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen
da27cf9a026b1c6708bdc0de1c02b83838e64bd8Timo Sirainen self.__dc = dc.DepotController()
da27cf9a026b1c6708bdc0de1c02b83838e64bd8Timo Sirainen self.__pid = os.getpid()
da27cf9a026b1c6708bdc0de1c02b83838e64bd8Timo Sirainen self.__dc.set_property("publisher", "prefix", "test")
da27cf9a026b1c6708bdc0de1c02b83838e64bd8Timo Sirainen self.__dc.set_depotd_path(pkg5unittest.g_proto_area + \
a24665de9d5c773115a5918e60ed587aafe67d5cTimo Sirainen "/usr/lib/pkg.depotd")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_depotd_content_root(pkg5unittest.g_proto_area + \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen "/usr/share/lib/pkg")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen depotpath = os.path.join(self.test_root, "depot")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen logpath = os.path.join(self.test_root, self.id())
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen try:
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen os.makedirs(depotpath, misc.PKG_DIR_MODE)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen except:
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen pass
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_repodir(depotpath)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_logpath(logpath)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def tearDown(self):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen pkg5unittest.CliTestCase.tearDown(self)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.kill()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def testStartStop(self):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_port(12000)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen for i in range(0, 5):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.start()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(self.__dc.is_alive())
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.stop()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(not self.__dc.is_alive())
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def test_cfg_file(self):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen cfg_file = os.path.join(self.test_root, "cfg2")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen fh = open(cfg_file, "w")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen fh.close()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_port(12000)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.set_cfg_file(cfg_file)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.__dc.start()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def test_writable_root(self):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen """Tests whether the index and feed cache file are written to
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen the writable root parameter."""
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.make_misc_files(TestPkgDepot.misc_files)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen writable_root = os.path.join(self.test_root,
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen "writ_root")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen index_dir = os.path.join(writable_root, "index")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen feed = os.path.join(writable_root, "feed.xml")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen base_dir = os.path.join(self.test_root, "depot")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen o_index_dir = os.path.join(base_dir, "index")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen o_feed = os.path.join(base_dir, "feed.xml")
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen timeout = 10
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def check_state(check_feed):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen found = not os.path.exists(o_index_dir) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen not os.path.exists(o_feed) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen os.path.isdir(index_dir) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen (not check_feed or os.path.isfile(feed))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen start_time = time.time()
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen while not found and time.time() - start_time < timeout:
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen time.sleep(1)
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen found = not os.path.exists(o_index_dir) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen not os.path.exists(o_feed) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen os.path.isdir(index_dir) and \
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen (not check_feed or os.path.isfile(feed))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(not os.path.exists(o_index_dir))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(not os.path.exists(o_feed))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(os.path.isdir(index_dir))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen if check_feed:
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen self.assert_(os.path.isfile(feed))
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen def get_feed(durl):
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen start_time = time.time()
got = False
while not got and (time.time() - start_time) < timeout:
try:
urllib2.urlopen("%s/feed" % durl)
got = True
except urllib2.HTTPError:
time.sleep(1)
self.assert_(got)
self.__dc.set_port(12000)
self.__dc.set_writable_root(writable_root)
durl = self.__dc.get_depot_url()
self.__dc.set_property("publisher", "prefix", "test")
self.__dc.set_property("repository", "origins", durl)
self.__dc.start()
check_state(False)
self.pkgsend_bulk(durl, TestPkgDepot.quux10)
get_feed(durl)
check_state(True)
self.image_create(durl)
self.pkg("search -r cat")
self.__dc.stop()
self.__dc.set_readonly()
shutil.rmtree(writable_root)
self.__dc.start()
get_feed(durl)
check_state(True)
self.pkg("search -r cat")
self.__dc.stop()
self.__dc.set_refresh_index()
shutil.rmtree(writable_root)
self.__dc.start()
check_state(False)
self.__dc.stop()
self.__dc.set_norefresh_index()
self.__dc.start()
get_feed(durl)
check_state(True)
self.pkg("search -r cat")
def testBadArgs(self):
self.__dc.set_port(12000)
self.__dc.set_readonly()
self.__dc.set_rebuild()
self.__dc.set_norefresh_index()
self.assert_(self.__dc.start_expected_fail())
self.__dc.set_readonly()
self.__dc.set_norebuild()
self.__dc.set_refresh_index()
self.assert_(self.__dc.start_expected_fail())
self.__dc.set_readonly()
self.__dc.set_rebuild()
self.__dc.set_refresh_index()
self.assert_(self.__dc.start_expected_fail())
self.__dc.set_readwrite()
self.__dc.set_rebuild()
self.__dc.set_refresh_index()
self.assert_(self.__dc.start_expected_fail())
self.__dc.set_mirror()
self.__dc.set_rebuild()
self.__dc.set_norefresh_index()
self.assert_(self.__dc.start_expected_fail())
self.__dc.set_mirror()
self.__dc.set_norebuild()
self.__dc.set_refresh_index()
self.assert_(self.__dc.start_expected_fail())
def test_disable_ops(self):
"""Verify that disable-ops works as expected."""
# For this disabled case, /catalog/1/ should return
# a NOT_FOUND error.
self.__dc.set_disable_ops(["catalog/1"])
self.__dc.set_port(12000)
self.__dc.start()
durl = self.__dc.get_depot_url()
try:
urllib2.urlopen("%s/catalog/1/" % durl)
except urllib2.HTTPError, e:
self.assertEqual(e.code, httplib.NOT_FOUND)
self.__dc.stop()
# For this disabled case, all /catalog/ operations should return
# a NOT_FOUND error.
self.__dc.set_disable_ops(["catalog"])
self.__dc.set_port(12000)
self.__dc.start()
durl = self.__dc.get_depot_url()
for ver in (0, 1):
try:
urllib2.urlopen("%s/catalog/%d/" % (durl, ver))
except urllib2.HTTPError, e:
self.assertEqual(e.code, httplib.NOT_FOUND)
self.__dc.stop()
# In the normal case, /catalog/1/ should return
# a FORBIDDEN error.
self.__dc.unset_disable_ops()
self.__dc.start()
durl = self.__dc.get_depot_url()
try:
urllib2.urlopen("%s/catalog/1/" % durl)
except urllib2.HTTPError, e:
self.assertEqual(e.code, httplib.FORBIDDEN)
self.__dc.stop()
# A bogus operation should prevent the depot from starting.
self.__dc.set_disable_ops(["no_such_op/0"])
self.__dc.start_expected_fail()
self.assertFalse(self.__dc.is_alive())
class TestDepotOutput(pkg5unittest.SingleDepotTestCase):
# Since these tests are output sensitive, the depots should be purged
# after each one is run.
persistent_setup = False
quux10 = """
open quux@1.0,5.11-0
add dir mode=0755 owner=root group=bin path=/bin
close """
info10 = """
open info@1.0,5.11-0
close """
system10 = """
open system/libc@1.0,5.11-0
add set name="description" value="Package to test package names with slashes"
add dir path=tmp/foo mode=0755 owner=root group=bin
add depend type=require fmri=pkg:/SUNWcsl
close """
zfsextras10 = """
open zfs-extras@1.0,5.11-0
close """
zfsutils10 = """
open zfs/utils@1.0,5.11-0
close """
repo_cfg = {
"publisher": {
"alias": "pending",
"prefix": "org.opensolaris.pending"
},
"repository": {
"collection_type": "supplemental",
"description":
"Development packages for the contrib repository.",
"legal_uris": [
"http://www.opensolaris.org/os/copyrights",
"http://www.opensolaris.org/os/tou",
"http://www.opensolaris.org/os/trademark"
],
"mirrors": [],
"name": """"Pending" Repository""",
"origins": [], # Has to be set during setUp for correct origin.
"refresh_seconds": 86400,
"registration_uri": "",
"related_uris": [
"http://jucr.opensolaris.org/contrib",
"http://jucr.opensolaris.org/pending",
"http://pkg.opensolaris.org/contrib",
]
}
}
def setUp(self):
pkg5unittest.SingleDepotTestCase.setUp(self, start_depot=True)
# All of the tests will start depot if needed.
self.dc.stop()
# Prevent override of custom configuration;
# tests will set as needed.
self.dc.clear_property("publisher", "prefix")
# Set repository origins.
self.repo_cfg["repository"]["origins"] = \
[self.dc.get_depot_url()]
self.tpath = tempfile.mkdtemp(prefix="tpath",
dir=self.test_root)
def test_0_depot_bui_output(self):
"""Verify that a non-error response and valid HTML is returned
for each known BUI page in every available depot mode."""
self.dc.set_property("publisher", "prefix", "test")
# A list of tuples containing the name of the method used to set
# the mode, and then the method needed to unset that mode.
mode_methods = [
("set_readwrite", None),
("set_mirror", "unset_mirror"),
("set_readonly", "set_readwrite"),
]
pages = [
"index.shtml",
"en/catalog.shtml",
"en/index.shtml",
"en/advanced_search.shtml",
"en/search.shtml",
"en/stats.shtml",
]
for with_packages in (False, True):
shutil.rmtree(self.dc.get_repodir(),
ignore_errors=True)
if with_packages:
self.dc.set_readwrite()
self.dc.set_port(12000)
self.dc.start()
durl = self.dc.get_depot_url()
self.pkgsend_bulk(durl, (self.info10,
self.quux10, self.system10))
self.dc.stop()
for set_method, unset_method in mode_methods:
if set_method:
getattr(self.dc, set_method)()
self.dc.set_port(12000)
self.dc.start()
durl = self.dc.get_depot_url()
for path in pages:
# Any error responses will cause an
# exception.
response = urllib2.urlopen(
"%s/%s" % (durl, path))
fd, fpath = tempfile.mkstemp(
suffix="html", dir=self.tpath)
fp = os.fdopen(fd, "w")
fp.write(response.read())
fp.close()
self.validate_html_file(fpath)
self.dc.stop()
if unset_method:
getattr(self.dc, unset_method)()
def __update_repo_config(self):
"""Helper function to generate test repository configuration."""
# Find and load the repository configuration.
rpath = self.dc.get_repodir()
rcpath = os.path.join(rpath, "cfg_cache")
rc = rcfg.RepositoryConfig(pathname=rcpath)
# Update the configuration with our sample data.
cfg = self.repo_cfg
for section in cfg:
for prop in cfg[section]:
rc.set_property(section, prop,
cfg[section][prop])
# Save it.
rc.write()
def test_1_depot_publisher(self):
"""Verify the output of the depot /publisher operation."""
# Now update the repository configuration while the depot is
# stopped so changes won't be overwritten on exit.
self.__update_repo_config()
# Start the depot.
self.dc.start()
durl = self.dc.get_depot_url()
purl = urlparse.urljoin(durl, "publisher/0")
pub, pkglist = p5i.parse(location=purl)[0]
# Now verify that the parsed response has the expected data.
cfg = self.repo_cfg
for prop in cfg["publisher"]:
self.assertEqual(getattr(pub, prop),
cfg["publisher"][prop])
repo = pub.selected_repository
for prop in cfg["repository"]:
returned = getattr(repo, prop)
expected = cfg["repository"][prop]
if prop.endswith("uris") or prop == "origins":
uris = []
for u in returned:
uri = u.uri
if uri.endswith("/"):
uri = uri[:-1]
uris.append(uri)
returned = uris
self.assertEqual(returned, expected)
def test_2_depot_p5i(self):
"""Verify the output of the depot /publisher operation."""
# Now update the repository configuration while the depot is
# stopped so changes won't be overwritten on exit.
self.__update_repo_config()
# Start the depot.
self.dc.start()
# Then, publish some packages we can abuse for testing.
durl = self.dc.get_depot_url()
plist = self.pkgsend_bulk(durl, (self.info10, self.quux10,
self.system10, self.zfsextras10, self.zfsutils10))
# Now, for each published package, attempt to get a p5i file
# and then verify that the parsed response has the expected
# package information under the expected publisher.
for p in plist:
purl = urlparse.urljoin(durl, "p5i/0/%s" % p)
pub, pkglist = p5i.parse(location=purl)[0]
# p5i files contain non-qualified FMRIs as the FMRIs
# are already grouped by publisher.
nq_p = fmri.PkgFmri(p).get_fmri(anarchy=True,
include_scheme=False)
self.assertEqual(pkglist, [nq_p])
# Try again, but only using package stems.
for p in plist:
stem = fmri.PkgFmri(p).pkg_name
purl = urlparse.urljoin(durl, "p5i/0/%s" % stem)
pub, pkglist = p5i.parse(location=purl)[0]
self.assertEqual(pkglist, [stem])
# Try again, but using wildcards (which will return a list of
# matching package stems).
purl = urlparse.urljoin(durl, "p5i/0/zfs*")
pub, pkglist = p5i.parse(location=purl)[0]
self.assertEqual(pkglist, ["zfs-extras", "zfs/utils"])
# Finally, verify that a non-existent package will error out
# with a httplib.NOT_FOUND.
try:
urllib2.urlopen(urlparse.urljoin(durl,
"p5i/0/nosuchpackage"))
except urllib2.HTTPError, e:
if e.code != httplib.NOT_FOUND:
raise
def test_bug_15482(self):
"""Test to make sure BUI search doesn't trigger a traceback."""
# Now update the repository configuration while the depot is
# stopped so changes won't be overwritten on exit.
self.__update_repo_config()
# Start the depot.
self.dc.start()
# Then, publish some packages we can abuse for testing.
durl = self.dc.get_depot_url()
plist = self.pkgsend_bulk(durl, self.quux10)
time.sleep(1)
surl = urlparse.urljoin(durl,
"en/search.shtml?action=Search&token=*")
urllib2.urlopen(surl).read()
surl = urlparse.urljoin(durl,
"en/advanced_search.shtml?action=Search&token=*")
urllib2.urlopen(surl).read()
surl = urlparse.urljoin(durl,
"en/advanced_search.shtml?token=*&show=a&rpp=50&"
"action=Advanced+Search")
urllib2.urlopen(surl).read()
if __name__ == "__main__":
unittest.main()