blob: c0db64dfc969a46c1a06a5926875a2d96a4dd904 [file] [log] [blame]
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from future import Future
from object_store import ObjectStore
class TestObjectStore(ObjectStore):
'''An object store which records its namespace and behaves like a dict.
Specify |init| with an initial object for the object store.
Use CheckAndReset to assert how many times Get/Set/Del have been called. Get
is a special case; it is only incremented once the future has had Get called.
'''
def __init__(self, namespace, start_empty=False, init=None):
self.namespace = namespace
self.start_empty = start_empty
self._store = {} if init is None else init
if start_empty:
assert not self._store
self._get_count = 0
self._set_count = 0
self._del_count = 0
#
# ObjectStore implementation.
#
def GetMulti(self, keys):
class FutureImpl(object):
def Get(self2):
self._get_count += 1
return dict((k, self._store.get(k)) for k in keys if k in self._store)
return Future(delegate=FutureImpl())
def SetMulti(self, mapping):
self._set_count += 1
self._store.update(mapping)
def DelMulti(self, keys):
self._del_count += 1
for k in keys:
self._store.pop(k, None)
#
# Testing methods.
#
def CheckAndReset(self, get_count=0, set_count=0, del_count=0):
'''Returns a tuple (success, error). Use in tests like:
self.assertTrue(*object_store.CheckAndReset(...))
'''
errors = []
for desc, expected, actual in (('get_count', get_count, self._get_count),
('set_count', set_count, self._set_count),
('del_count', del_count, self._del_count)):
if actual != expected:
errors.append('%s: expected %s got %s' % (desc, expected, actual))
try:
return (len(errors) == 0, ', '.join(errors))
finally:
self.Reset()
def Reset(self):
self._get_count = 0
self._set_count = 0
self._del_count = 0