def testPutWhenHashFail(self): """Test put() with valid input params, giving success.""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' body = '<fakexml>blabla</fakexml>' self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = ['manifest1', 'manifest2'] install_types = ['type1', 'type2'] self.request.get('hash').AndReturn('goodhash') self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(','.join(manifests)) self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.IsSafeToModify().AndReturn(True) self.mox.StubOutWithMock(self.c, '_Hash') pkginfo.plist = 'foo' self.c._Hash(pkginfo.plist).AndReturn('otherhash') self.response.set_status(httplib.CONFLICT).AndReturn(None) self.response.out.write('Update hash does not match').AndReturn(None) self.mox.ReplayAll() self.c.put(filename_quoted) self.mox.VerifyAll()
def testPutOnNonexistentPackageInfo(self): """Test put() with valid input params, but non-existent pkginfo.""" filename = 'pkgname.dmg' body = '<fakexml>blabla</fakexml>' pkgloc = '/package/location.pkg' pkgdict = {'installer_item_location': pkgloc} self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = ['manifest1', 'manifest2'] install_types = ['type1', 'type2'] self.request.get('hash').AndReturn(None) self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(','.join(manifests)) self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) self._MockObtainLock('pkgsinfo_%s' % filename, timeout=5.0) self.MockModelStaticBase('PackageInfo', 'get_by_key_name', filename).AndReturn(None) self.response.set_status(403).AndReturn(None) self.response.out.write('Only updates supported') self._MockReleaseLock('pkgsinfo_%s' % filename) self.mox.ReplayAll() self.c.put(filename) self.mox.VerifyAll()
def testPutWhenNotModifiableAndPkginfoChanged(self): """Test put() when pkginfo is not modifiable and pkginfo changed.""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' name = 'foo pkg name' body = '<fakexml>blabla</fakexml>' pkgloc = '/package/location.pkg' pkgdict = {'installer_item_location': pkgloc} self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = ['manifest1', 'manifest2'] install_types = ['type1', 'type2'] self.request.get('hash').AndReturn('goodhash') self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(','.join(manifests)) self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.plist = 'foo' pkginfo.IsSafeToModify().AndReturn(False) mock_mpl.EqualIgnoringManifestsAndCatalogs(pkginfo.plist).AndReturn( False) self.response.set_status(httplib.FORBIDDEN).AndReturn(None) self.response.out.write('Changes to pkginfo not allowed').AndReturn( None) self.mox.ReplayAll() self.c.put(filename_quoted) self.mox.VerifyAll()
def testPutSuccessWhenHash(self): """Test put() with valid input params, giving success.""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' name = 'foo pkg name' body = '<fakexml>blabla</fakexml>' pkgloc = '/package/location.pkg' pkgdict = {'installer_item_location': pkgloc} self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = ['manifest1', 'manifest2'] install_types = ['type1', 'type2'] user = '******' self.request.get('hash').AndReturn('goodhash') self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(','.join(manifests)) self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() session = self.mox.CreateMockAnything() session.uuid = user self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG, and_return=session) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) self._MockObtainLock('pkgsinfo_%s' % filename, timeout=5.0) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.IsSafeToModify().AndReturn(True) self.mox.StubOutWithMock(self.c, '_Hash') self.c._Hash(pkginfo.plist).AndReturn('goodhash') pkginfo.name = mock_mpl.GetPackageName().AndReturn(name) pkginfo.put() self._MockReleaseLock('pkgsinfo_%s' % filename) self.mox.StubOutWithMock(pkgsinfo.models.Catalog, 'Generate') for catalog in catalogs: pkgsinfo.models.Catalog.Generate(catalog, delay=1).AndReturn(None) mock_mpl.GetXml().AndReturn(body) mock_log = self.MockModel('AdminPackageLog', user=user, action='pkginfo', filename=filename, catalogs=catalogs, manifests=manifests, install_types=install_types, plist=body) mock_log.put().AndReturn(None) self.mox.ReplayAll() self.c.put(filename_quoted) self.assertEqual(pkginfo.plist, mock_mpl) self.assertEqual(pkginfo.name, name) self.assertEqual(pkginfo.catalogs, catalogs) self.assertEqual(pkginfo.manifests, manifests) self.assertEqual(pkginfo.install_types, install_types) self.mox.VerifyAll()
def testPutSuccessWhenNoManifestsValueSpecified(self): """Test put() with no manifest value specified, resulting in no change.""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' name = 'foo pkg name' body = '<fakexml>blabla</fakexml>' self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = None install_types = ['type1', 'type2'] user = '******' self.request.get('hash').AndReturn(None) self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(None) # == no value provided self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() session = self.mox.CreateMockAnything() session.uuid = user self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG, and_return=session) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) self._MockObtainLock('pkgsinfo_%s' % filename, timeout=5.0) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.IsSafeToModify().AndReturn(True) pkginfo.name = mock_mpl.GetPackageName().AndReturn(name) pkginfo.put() self._MockReleaseLock('pkgsinfo_%s' % filename) self.mox.StubOutWithMock(pkgsinfo.models.Catalog, 'Generate') for catalog in catalogs: pkgsinfo.models.Catalog.Generate(catalog, delay=1).AndReturn(None) mock_mpl.GetXml().AndReturn(body) mock_log = self.MockModel('AdminPackageLog', user=user, action='pkginfo', filename=filename, catalogs=catalogs, manifests=pkginfo.manifests, install_types=install_types, plist=body) mock_log.put().AndReturn(None) self.mox.ReplayAll() self.c.put(filename_quoted) self.assertEqual(pkginfo.plist, mock_mpl) self.assertEqual(pkginfo.name, name) self.assertEqual(pkginfo.catalogs, catalogs) # since the tested function did not set a pkginfo.manifests value # then this value is still MockMethod since pkginfo is a mock. self.assertNotEqual(pkginfo.manifests, manifests) self.assertEqual(pkginfo.install_types, install_types) self.mox.VerifyAll()
def testPutSuccessWhenManifestsIsIntentionalEmptyList(self): """Test put() with a manifest value that sets the manifest list to [].""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' name = 'foo pkg name' body = '<fakexml>blabla</fakexml>' self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = [] # this pkg is in no manifests install_types = ['type1', 'type2'] user = '******' self.request.get('hash').AndReturn(None) self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn('') # == NO manifests self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() session = self.mox.CreateMockAnything() session.uuid = user self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG, and_return=session) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) self._MockObtainLock('pkgsinfo_%s' % filename, timeout=5.0) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.IsSafeToModify().AndReturn(True) pkginfo.name = mock_mpl.GetPackageName().AndReturn(name) pkginfo.put() self._MockReleaseLock('pkgsinfo_%s' % filename) self.mox.StubOutWithMock(pkgsinfo.models.Catalog, 'Generate') for catalog in catalogs: pkgsinfo.models.Catalog.Generate(catalog, delay=1).AndReturn(None) mock_mpl.GetXml().AndReturn(body) mock_log = self.MockModel('AdminPackageLog', user=user, action='pkginfo', filename=filename, catalogs=catalogs, manifests=manifests, install_types=install_types, plist=body) mock_log.put().AndReturn(None) self.mox.ReplayAll() self.c.put(filename_quoted) self.assertEqual(pkginfo.plist, mock_mpl) self.assertEqual(pkginfo.name, name) self.assertEqual(pkginfo.catalogs, catalogs) self.assertEqual(pkginfo.manifests, manifests) self.assertEqual(pkginfo.install_types, install_types) self.mox.VerifyAll()
def testPutWhenNotModifiableButOnlyManifestsChanged(self): """Test put() when pkginfo is not modifiable but only manifests changed.""" filename = 'pkg name.dmg' filename_quoted = 'pkg%20name.dmg' name = 'foo pkg name' body = '<fakexml>blabla</fakexml>' pkgloc = '/package/location.pkg' pkgdict = {'installer_item_location': pkgloc} self.request.body = body catalogs = ['catalog1', 'catalog2'] manifests = ['manifest1', 'manifest2'] install_types = ['type1', 'type2'] self.request.get('hash').AndReturn('goodhash') self.request.get('catalogs', None).AndReturn(','.join(catalogs)) self.request.get('manifests', None).AndReturn(','.join(manifests)) self.request.get('install_types').AndReturn(','.join(install_types)) mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) mock_mpl.Parse().AndReturn(None) self._MockObtainLock('pkgsinfo_%s' % filename, timeout=5.0) pkginfo = self.MockModelStatic('PackageInfo', 'get_by_key_name', filename) pkginfo.plist = 'foo' pkginfo.IsSafeToModify().AndReturn(False) mock_mpl.EqualIgnoringManifestsAndCatalogs( pkginfo.plist).AndReturn(True) # we've previously tested past hash check, so bail there. self.mox.StubOutWithMock(self.c, '_Hash') self.c._Hash(pkginfo.plist).AndReturn('otherhash') self.response.set_status(409).AndReturn(None) self.response.out.write('Update hash does not match').AndReturn(None) self._MockReleaseLock('pkgsinfo_%s' % filename) self.mox.ReplayAll() self.c.put(filename_quoted) self.mox.VerifyAll()
def testPutFailInputNotParseable(self): """Test put() with input that isn't parseable as a plist.""" filename = 'pkgname.dmg' body = 'junk' self.request.body = body self.request.get('hash').AndReturn(None) self.request.get('catalogs', None).AndReturn('anything') self.request.get('manifests', None).AndReturn('anything') self.request.get('install_types').AndReturn('anything') mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) exc = pkgsinfo.plist.MalformedPlistError('foo error') mock_mpl.Parse().AndRaise(exc) self.response.set_status(400).AndReturn(None) self.response.out.write('foo error').AndReturn(None) self.mox.ReplayAll() self.c.put(filename) self.mox.VerifyAll()
def testPutFailPackageNoExist(self): """Test put() with valid input params, but package does not exist.""" filename = 'pkgname.dmg' body = '<fakexml>blabla</fakexml>' self.request.body = body self.request.get('hash').AndReturn(None) self.request.get('catalogs', None).AndReturn('anything') self.request.get('manifests', None).AndReturn('anything') self.request.get('install_types').AndReturn('anything') mock_mpl = self.mox.CreateMockAnything() self.MockDoMunkiAuth(require_level=pkgsinfo.gaeserver.LEVEL_UPLOADPKG) self.mox.StubOutWithMock(pkgsinfo, 'MunkiPackageInfoPlistStrict') pkgsinfo.MunkiPackageInfoPlistStrict(body).AndReturn(mock_mpl) exc = pkgsinfo.PackageDoesNotExistError('foo error') mock_mpl.Parse().AndRaise(exc) self.response.set_status(httplib.BAD_REQUEST).AndReturn(None) self.response.out.write('foo error').AndReturn(None) self.mox.ReplayAll() self.c.put(filename) self.mox.VerifyAll()
def setUp(self): mox.MoxTestBase.setUp(self) self.stubs = stubout.StubOutForTesting() self.mpl = pkgsinfo.MunkiPackageInfoPlistStrict()