122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import nilmdb
|
|
from nilmdb.utils.printf import *
|
|
from nose.tools import *
|
|
from nose.tools import assert_raises
|
|
import itertools
|
|
|
|
from testutil.helpers import *
|
|
|
|
testdb = "tests/bulkdata-testdb"
|
|
|
|
import nilmdb.server.bulkdata
|
|
from nilmdb.server.bulkdata import BulkData
|
|
|
|
class TestBulkData(object):
|
|
|
|
def test_bulkdata(self):
|
|
for (size, files, db) in [ ( 0, 0, testdb ),
|
|
( 25, 1000, testdb ),
|
|
( 1000, 3, testdb.decode("utf-8") ) ]:
|
|
recursive_unlink(db)
|
|
os.mkdir(db)
|
|
self.do_basic(db, size, files)
|
|
|
|
def do_basic(self, db, size, files):
|
|
"""Do the basic test with variable file_size and files_per_dir"""
|
|
if not size or not files:
|
|
data = BulkData(db)
|
|
else:
|
|
data = BulkData(db, file_size = size, files_per_dir = files)
|
|
|
|
# Try opening it again (should result in locking error)
|
|
with assert_raises(IOError) as e:
|
|
data2 = BulkData(db)
|
|
in_("already locked by another process", str(e.exception))
|
|
|
|
# create empty
|
|
with assert_raises(ValueError):
|
|
data.create("/foo", "uint16_8")
|
|
with assert_raises(ValueError):
|
|
data.create("foo/bar", "uint16_8")
|
|
data.create("/foo/bar", "uint16_8")
|
|
data.create(u"/foo/baz/quux", "float64_16")
|
|
with assert_raises(ValueError):
|
|
data.create("/foo/bar/baz", "uint16_8")
|
|
with assert_raises(ValueError):
|
|
data.create("/foo/baz", "float64_16")
|
|
|
|
# get node -- see if caching works
|
|
nodes = []
|
|
for i in range(5000):
|
|
nodes.append(data.getnode("/foo/bar"))
|
|
nodes.append(data.getnode("/foo/baz/quux"))
|
|
del nodes
|
|
|
|
def get_node_slice(key):
|
|
if isinstance(key, slice):
|
|
return [ node.get_data(x, x+1) for x in
|
|
xrange(*key.indices(node.nrows)) ]
|
|
return node.get_data(key, key+1)
|
|
|
|
# Test node
|
|
node = data.getnode("/foo/bar")
|
|
with assert_raises(IndexError):
|
|
x = get_node_slice(0)
|
|
with assert_raises(IndexError):
|
|
x = node[0] # timestamp
|
|
raw = []
|
|
for i in range(1000):
|
|
raw.append("%d 1 2 3 4 5 6 7 8\n" % (10000 + i))
|
|
node.append_data("".join(raw[0:1]), 0, 50000)
|
|
node.append_data("".join(raw[1:100]), 0, 50000)
|
|
node.append_data("".join(raw[100:]), 0, 50000)
|
|
|
|
misc_slices = [ 0, 100, slice(None), slice(0), slice(10),
|
|
slice(5,10), slice(3,None), slice(3,-3),
|
|
slice(20,10), slice(200,100,-1), slice(None,0,-1),
|
|
slice(100,500,5) ]
|
|
|
|
# Extract slices
|
|
for s in misc_slices:
|
|
eq_(get_node_slice(s), raw[s])
|
|
|
|
# Extract misc slices while appending, to make sure the
|
|
# data isn't being added in the middle of the file
|
|
for s in [2, slice(1,5), 2, slice(1,5)]:
|
|
node.append_data("0 0 0 0 0 0 0 0 0\n", 0, 50000)
|
|
raw.append("0 0 0 0 0 0 0 0 0\n")
|
|
eq_(get_node_slice(s), raw[s])
|
|
|
|
# Get some coverage of remove; remove is more fully tested
|
|
# in cmdline
|
|
with assert_raises(IndexError):
|
|
node.remove(9999,9998)
|
|
|
|
# close, reopen
|
|
# reopen
|
|
data.close()
|
|
if not size or not files:
|
|
data = BulkData(db)
|
|
else:
|
|
data = BulkData(db, file_size = size, files_per_dir = files)
|
|
node = data.getnode("/foo/bar")
|
|
|
|
# Extract slices
|
|
for s in misc_slices:
|
|
eq_(get_node_slice(s), raw[s])
|
|
|
|
# destroy
|
|
with assert_raises(ValueError):
|
|
data.destroy("/foo")
|
|
with assert_raises(ValueError):
|
|
data.destroy("/foo/baz")
|
|
with assert_raises(ValueError):
|
|
data.destroy("/foo/qwerty")
|
|
data.destroy("/foo/baz/quux")
|
|
data.destroy("/foo/bar")
|
|
|
|
# close
|
|
data.close()
|