Package omeroweb :: Package webgateway :: Package tests :: Module unittests
[hide private]
[frames] | no frames]

Source Code for Module omeroweb.webgateway.tests.unittests

  1  import unittest, time, os, datetime 
  2  import tempfile 
  3   
  4  #from models import StoredConnection 
  5  from webgateway.webgateway_cache import FileCache, WebGatewayCache 
  6  from webgateway import views 
  7  import omero 
  8  from omero.gateway.scripts.testdb_create import * 
  9   
 10  from django.test.client import Client 
 11  from django.core.handlers.wsgi import WSGIRequest 
 12  from django.conf import settings 
 13  from django.http import QueryDict 
 14   
 15  #omero.gateway.BlitzGateway = omero.gateway._BlitzGateway 
 16  #omero.gateway.ProjectWrapper = omero.gateway._ProjectWrapper 
 17  #omero.gateway.DatasetWrapper = omero.gateway._DatasetWrapper 
 18  #omero.gateway.ImageWrapper = omero.gateway._ImageWrapper 
 19   
 20   
 21  CLIENT_BASE='test' 
 22   
23 -def fakeRequest (**kwargs):
24 def bogus_request(self, **request): 25 """ 26 The master request method. Composes the environment dictionary 27 and passes to the handler, returning the result of the handler. 28 Assumes defaults for the query environment, which can be overridden 29 using the arguments to the request. 30 """ 31 environ = { 32 'HTTP_COOKIE': self.cookies, 33 'PATH_INFO': '/', 34 'QUERY_STRING': '', 35 'REQUEST_METHOD': 'GET', 36 'SCRIPT_NAME': '', 37 'SERVER_NAME': 'testserver', 38 'SERVER_PORT': '80', 39 'SERVER_PROTOCOL': 'HTTP/1.1', 40 'HTTP_HOST': 'localhost', 41 'wsgi.version': (1,0), 42 'wsgi.url_scheme': 'http', 43 'wsgi.errors': None,#self.errors, 44 'wsgi.multiprocess': True, 45 'wsgi.multithread': False, 46 'wsgi.run_once': False, 47 } 48 environ.update(self.defaults) 49 environ.update(request) 50 r = WSGIRequest(environ) 51 if 'django.contrib.sessions' in settings.INSTALLED_APPS: 52 engine = __import__(settings.SESSION_ENGINE, {}, {}, ['']) 53 r.session = engine.SessionStore() 54 qlen = len(r.REQUEST.dicts) 55 def setQuery (**query): 56 r.REQUEST.dicts = r.REQUEST.dicts[:qlen] 57 q = QueryDict('', mutable=True) 58 q.update(query) 59 r.REQUEST.dicts += (q,)
60 r.setQuery = setQuery 61 return r 62 Client.bogus_request = bogus_request 63 c = Client() 64 return c.bogus_request(**kwargs) 65
66 -class WGTest (GTest):
67 - def doLogin (self, user):
68 r = fakeRequest() 69 q = QueryDict('', mutable=True) 70 q.update({'username': user.name, 'password': user.passwd}) 71 r.REQUEST.dicts += (q,) 72 self.gateway = views.getBlitzConnection(r, 1, group=user.groupname, try_super=user.admin) 73 if self.gateway is None: 74 # If the login framework was customized (using this app outside omeroweb) the above fails 75 super(WGTest, self).doLogin(user) 76 self.gateway.user = views.UserProxy(self.gateway)
77
78 -class HelperObjectsTest (unittest.TestCase):
79 - def testColorHolder (self):
80 ColorHolder = omero.gateway.ColorHolder 81 c1 = ColorHolder() 82 self.assertEqual(c1._color, {'red': 0, 'green': 0,'blue': 0, 'alpha': 255}) 83 c1 = ColorHolder('blue') 84 self.assertEqual(c1.getHtml(), '0000FF') 85 self.assertEqual(c1.getCss(), 'rgba(0,0,255,1.000)') 86 self.assertEqual(c1.getRGB(), (0,0,255)) 87 c1.setRed(0xF0) 88 self.assertEqual(c1.getCss(), 'rgba(240,0,255,1.000)') 89 c1.setGreen(0x0F) 90 self.assertEqual(c1.getCss(), 'rgba(240,15,255,1.000)') 91 c1.setBlue(0) 92 self.assertEqual(c1.getCss(), 'rgba(240,15,0,1.000)') 93 c1.setAlpha(0x7F) 94 self.assertEqual(c1.getCss(), 'rgba(240,15,0,0.498)') 95 c1 = ColorHolder.fromRGBA(50,100,200,300) 96 self.assertEqual(c1.getCss(), 'rgba(50,100,200,1.000)')
97
98 - def testOmeroType (self):
99 omero_type = omero.gateway.omero_type 100 self.assert_(isinstance(omero_type('rstring'), omero.RString)) 101 self.assert_(isinstance(omero_type(u'rstring'), omero.RString)) 102 self.assert_(isinstance(omero_type(1), omero.RInt)) 103 self.assert_(isinstance(omero_type(1L), omero.RLong)) 104 self.assert_(not isinstance(omero_type((1,2,'a')), omero.RType))
105
106 - def testSplitHTMLColor (self):
107 splitHTMLColor = omero.gateway.splitHTMLColor 108 self.assertEqual(splitHTMLColor('abc'), [0xAA, 0xBB, 0xCC, 0xFF]) 109 self.assertEqual(splitHTMLColor('abcd'), [0xAA, 0xBB, 0xCC, 0xDD]) 110 self.assertEqual(splitHTMLColor('abbccd'), [0xAB, 0xBC, 0xCD, 0xFF]) 111 self.assertEqual(splitHTMLColor('abbccdde'), [0xAB, 0xBC, 0xCD, 0xDE]) 112 self.assertEqual(splitHTMLColor('#$%&%'), None)
113 114
115 -def _testCacheFSBlockSize (cache):
116 cache.wipe() 117 c1 = cache._du() 118 cache.set('test/1', 'a') 119 c2 = cache._du() 120 cache.wipe() 121 return c1, c2-c1
122
123 -class FileCacheTest(unittest.TestCase):
124 - def setUp (self):
125 self.cache = FileCache('test_cache')
126
127 - def tearDown (self):
128 os.system('rm -fr test_cache')
129
130 - def testTimeouts (self):
131 self.assertEqual(self.cache.get('date/test/1'), None, 'Key already exists in cache') 132 self.cache.set('date/test/1', '1', 3) 133 self.assertEqual(self.cache.get('date/test/1'), '1', 'Key not properly cached') 134 time.sleep(4) 135 self.assertEqual(self.cache.get('date/test/1'), None, 'Timeout failed')
136
137 - def testMaxSize (self):
138 empty_size, cache_block = _testCacheFSBlockSize(self.cache) 139 self.cache._max_size = empty_size + 4*cache_block + 1 140 # There is an overhead (8 bytes in my system) for timestamp per file, 141 # and the limit is only enforced after we cross over it 142 for i in range(6): 143 self.cache.set('date/test/%d' % i, 'abcdefgh'*127*cache_block) 144 for i in range(4): 145 self.assertEqual(self.cache.get('date/test/%d' % i), 'abcdefgh'*127*cache_block, 146 'Key %d not properly cached' % i) 147 self.assertEqual(self.cache.get('date/test/5'), None, 'Size limit failed')
148
149 - def testMaxEntries (self):
150 self.cache._max_entries = 2 151 self.cache.set('date/test/1', '1') 152 self.cache.set('date/test/2', '2') 153 self.cache.set('date/test/3', '3') 154 self.assertEqual(self.cache.get('date/test/1'), '1', 'Key not properly cached') 155 self.assertEqual(self.cache.get('date/test/2'), '2', 'Key not properly cached') 156 self.assertEqual(self.cache.get('date/test/3'), None, 'File number limit failed')
157
158 - def testPurge (self):
159 self.cache._max_entries = 2 160 self.cache._default_timeout = 3 161 self.cache.set('date/test/1', '1') 162 self.cache.set('date/test/2', '2') 163 self.cache.set('date/test/3', '3') 164 self.assertEqual(self.cache.get('date/test/1'), '1', 'Key not properly cached') 165 self.assertEqual(self.cache.get('date/test/2'), '2', 'Key not properly cached') 166 self.assertEqual(self.cache.get('date/test/3'), None, 'File number limit failed') 167 time.sleep(4) 168 self.cache.set('date/test/3', '3') 169 self.assertEqual(self.cache.get('date/test/3'), '3', 'Purge not working')
170
171 - def testOther (self):
172 # set should only accept strings as values 173 self.assertRaises(ValueError, self.cache.set, 'date/test/1', 123) 174 # keys can't have .. or start with / 175 self.assertRaises(ValueError, self.cache.set, '/date/test/1', '1') 176 self.assertRaises(ValueError, self.cache.set, 'date/test/../1', '1') 177 # get some test data in 178 self.cache.set('date/test/1', '1') 179 self.cache.set('date/test/2', '2') 180 self.cache.set('date/test/3', '3') 181 self.assertEqual(self.cache.get('date/test/1'), '1', 'Key not properly cached') 182 self.assertEqual(self.cache.get('date/test/2'), '2', 'Key not properly cached') 183 self.assertEqual(self.cache.get('date/test/3'), '3', 'Key not properly cached') 184 # check has_key 185 self.assert_(self.cache.has_key('date/test/1')) 186 self.assert_(not self.cache.has_key('date/test/bogus')) 187 # assert wipe() nukes the whole thing 188 self.assertEqual(self.cache._num_entries, 3) 189 self.cache.wipe() 190 self.assertEqual(self.cache._num_entries, 0)
191
192 -class WebGatewayCacheTest(unittest.TestCase):
193 - def setUp (self):
194 self.wcache = WebGatewayCache(backend=FileCache, basedir='test_cache') 195 class r: 196 def __init__ (self): 197 self.REQUEST = {'c':'1|292:1631$FF0000,2|409:5015$0000FF','m':'c', 'q':'0.9'}
198 def new (self, q): 199 rv = self.__class__() 200 rv.REQUEST.update(q) 201 return rv
202 self.request = r() 203
204 - def tearDown (self):
205 os.system('rm -fr test_cache')
206
207 - def testCacheSettings (self):
208 uid = 123 209 empty_size, cache_block = _testCacheFSBlockSize(self.wcache._thumb_cache) 210 max_size = empty_size + 4 * cache_block + 1 211 self.wcache._updateCacheSettings(self.wcache._thumb_cache, timeout=2, max_entries=5, max_size=max_size ) 212 for i in range(6): 213 self.wcache.setThumb(self.request, 'test', uid, i, 'abcdefgh'*127*cache_block) 214 for i in range(4): 215 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, i), 'abcdefgh'*127*cache_block, 216 'Key %d not properly cached' % i) 217 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 5), None, 'Size limit failed') 218 for i in range(10): 219 self.wcache.setThumb(self.request, 'test', uid, i, 'abcdefgh') 220 for i in range(5): 221 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, i), 'abcdefgh', 'Key %d not properly cached' % i) 222 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 5), None, 'Entries limit failed') 223 time.sleep(2) 224 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 0), None, 'Time limit failed')
225
226 - def testThumbCache (self):
227 uid = 123 228 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), None) 229 self.wcache.setThumb(self.request, 'test', uid, 1, 'thumbdata') 230 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), 'thumbdata', 231 'Thumb not properly cached (%s)' % self.wcache.getThumb(self.request, 'test', uid, 1)) 232 self.wcache.clearThumb(self.request, 'test', uid, 1) 233 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), None) 234 # Make sure clear() nukes this 235 self.wcache.setThumb(self.request, 'test', uid, 1, 'thumbdata') 236 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), 'thumbdata', 'Thumb not properly cached') 237 self.assertNotEqual(self.wcache._thumb_cache._num_entries, 0) 238 self.wcache.clear() 239 self.assertEqual(self.wcache._thumb_cache._num_entries, 0)
240
241 - def testImageCache (self):
242 uid = 123 243 # Also add a thumb, a split channel and a projection, as it should get deleted with image 244 preq = self.request.new({'p':'intmax'}) 245 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), None) 246 self.wcache.setThumb(self.request, 'test', uid, 1, 'thumbdata') 247 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), 'thumbdata') 248 img = omero.gateway.ImageWrapper(None, omero.model.ImageI(1,False)) 249 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), None) 250 self.wcache.setImage(self.request, 'test', img, 2, 3, 'imagedata') 251 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), 'imagedata') 252 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), None) 253 self.wcache.setImage(preq, 'test', img, 2, 3, 'imagedata') 254 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), 'imagedata') 255 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), None) 256 self.wcache.setSplitChannelImage(self.request, 'test', img, 2, 3, 'imagedata') 257 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), 'imagedata') 258 self.wcache.clearImage(self.request, 'test', uid, img) 259 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), None) 260 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), None) 261 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), None) 262 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), None) 263 # The exact same behaviour, using invalidateObject 264 self.wcache.setThumb(self.request, 'test', uid, 1, 'thumbdata') 265 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), 'thumbdata') 266 self.wcache.setImage(self.request, 'test', img, 2, 3, 'imagedata') 267 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), 'imagedata') 268 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), None) 269 self.wcache.setImage(preq, 'test', img, 2, 3, 'imagedata') 270 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), 'imagedata') 271 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), None) 272 self.wcache.setSplitChannelImage(self.request, 'test', img, 2, 3, 'imagedata') 273 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), 'imagedata') 274 self.wcache.invalidateObject('test', uid, img) 275 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), None) 276 self.assertEqual(self.wcache.getSplitChannelImage(self.request, 'test', img, 2, 3), None) 277 self.assertEqual(self.wcache.getImage(preq, 'test', img, 2, 3), None) 278 self.assertEqual(self.wcache.getThumb(self.request, 'test', uid, 1), None) 279 # Make sure clear() nukes this 280 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), None) 281 self.wcache.setImage(self.request, 'test', img, 2, 3, 'imagedata') 282 self.assertEqual(self.wcache.getImage(self.request, 'test', img, 2, 3), 'imagedata') 283 self.assertNotEqual(self.wcache._img_cache._num_entries, 0) 284 self.wcache.clear() 285 self.assertEqual(self.wcache._img_cache._num_entries, 0)
286
287 - def testLocks (self):
288 wcache2 = WebGatewayCache(backend=FileCache, basedir=self.wcache._basedir) 289 #wcache2 will hold the lock 290 self.assert_(wcache2.tryLock()) 291 self.assert_(not self.wcache.tryLock()) 292 self.assert_(wcache2.tryLock()) 293 del wcache2 294 # The lock should have been removed 295 self.assert_(self.wcache.tryLock())
296
297 - def testJsonCache (self):
298 uid = 123 299 ds = omero.gateway.DatasetWrapper(None, omero.model.DatasetI(1,False)) 300 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), None) 301 self.wcache.setDatasetContents(self.request, 'test', ds, 'datasetdata') 302 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), 'datasetdata') 303 self.wcache.clearDatasetContents(self.request, 'test', ds) 304 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), None) 305 # The exact same behaviour, using invalidateObject 306 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), None) 307 self.wcache.setDatasetContents(self.request, 'test', ds, 'datasetdata') 308 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), 'datasetdata') 309 self.wcache.invalidateObject('test', uid, ds) 310 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), None) 311 # Make sure clear() nukes this 312 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), None) 313 self.wcache.setDatasetContents(self.request, 'test', ds, 'datasetdata') 314 self.assertEqual(self.wcache.getDatasetContents(self.request, 'test', ds), 'datasetdata') 315 self.assertNotEqual(self.wcache._json_cache._num_entries, 0) 316 self.wcache.clear() 317 self.assertEqual(self.wcache._json_cache._num_entries, 0)
318 319 320
321 -class JsonTest (WGTest):
322 - def testImageData (self):
323 self.loginAsAuthor() 324 iid = self.getTestImage().getId() 325 r = fakeRequest() 326 v = views.imageData_json(r, iid=iid, _conn=self.gateway) 327 self.assert_(type(v) == type('')) 328 self.assert_('"width": 512' in v) 329 self.assert_('"split_channel":' in v) 330 self.assert_('"pixel_range": [-32768, 32767]' in v)
331
332 -class UserProxyTest (WGTest):
333 - def test (self):
334 self.loginAsAuthor() 335 user = self.gateway.user 336 self.assertEqual(user.isAdmin(), False) 337 int(user.getId()) 338 self.assertEqual(user.getName(), self.AUTHOR.name) 339 self.assertEqual(user.getFirstName(), self.AUTHOR.firstname) 340 views._purge(True)
341 342
343 -class ZZ_TDTest(WGTest):
344 - def setUp (self):
345 super(ZZ_TDTest, self).setUp(skipTestDB=True) 346 dbhelpers.cleanup()
347
348 - def runTest (self):
349 pass
350