Browse Source

Minor testsuite and commandline fixes.

Now supports "list /foo/bar" in addition to the older "list --path /foo/bar"
tags/nilmdb-0.1
Jim Paris 11 years ago
parent
commit
c81972e66e
6 changed files with 98 additions and 17 deletions
  1. +4
    -0
      nilmdb/cmdline/cmdline.py
  2. +18
    -3
      nilmdb/cmdline/list.py
  3. +1
    -1
      runtests.py
  4. +1
    -0
      setup.cfg
  5. +5
    -0
      tests/test.order
  6. +69
    -13
      tests/test_cmdline.py

+ 4
- 0
nilmdb/cmdline/cmdline.py View File

@@ -131,6 +131,10 @@ class Cmdline(object):
self.parser_setup() self.parser_setup()
self.args = self.parser.parse_args(self.argv) self.args = self.parser.parse_args(self.argv)


# Run preconnect handler if there is one
if "preconnect" in self.args:
self.args.preconnect(self)

self.client = nilmdb.Client(self.args.url) self.client = nilmdb.Client(self.args.url)


# Make a test connection to make sure things work # Make a test connection to make sure things work


+ 18
- 3
nilmdb/cmdline/list.py View File

@@ -3,6 +3,7 @@ from nilmdb.utils.printf import *
import nilmdb.client import nilmdb.client


import fnmatch import fnmatch
import argparse
from argparse import ArgumentDefaultsHelpFormatter as def_form from argparse import ArgumentDefaultsHelpFormatter as def_form


def setup(self, sub): def setup(self, sub):
@@ -13,13 +14,16 @@ def setup(self, sub):
optionally filtering by layout or path. Wildcards optionally filtering by layout or path. Wildcards
are accepted. are accepted.
""") """)
cmd.set_defaults(handler = cmd_list)
cmd.set_defaults(preconnect = cmd_preconnect,
handler = cmd_list)


group = cmd.add_argument_group("Stream filtering") group = cmd.add_argument_group("Stream filtering")
group.add_argument("-p", "--path", metavar="PATH", default="*",
help="Match only this path (-p can be omitted)")
group.add_argument("path_positional", default="*",
nargs="?", help=argparse.SUPPRESS)
group.add_argument("-l", "--layout", default="*", group.add_argument("-l", "--layout", default="*",
help="Match only this stream layout") help="Match only this stream layout")
group.add_argument("-p", "--path", default="*",
help="Match only this path")


group = cmd.add_argument_group("Interval details") group = cmd.add_argument_group("Interval details")
group.add_argument("-d", "--detail", action="store_true", group.add_argument("-d", "--detail", action="store_true",
@@ -31,6 +35,17 @@ def setup(self, sub):
metavar="TIME", type=self.arg_time, metavar="TIME", type=self.arg_time,
help="Ending timestamp (free-form)") help="Ending timestamp (free-form)")


def cmd_preconnect(self):
# A hidden "path_positional" argument lets the user leave off the
# "-p" when specifying the path. Handle it here.
got_opt = self.args.path != "*"
got_pos = self.args.path_positional != "*"
if got_pos:
if got_opt:
self.parser.error("too many paths specified")
else:
self.args.path = self.args.path_positional

def cmd_list(self): def cmd_list(self):
"""List available streams""" """List available streams"""
streams = self.client.stream_list() streams = self.client.stream_list()


+ 1
- 1
runtests.py View File

@@ -26,7 +26,7 @@ class JimOrderPlugin(nose.plugins.Plugin):
if order and os.path.exists(order): if order and os.path.exists(order):
files = [] files = []
for line in open(order): for line in open(order):
line = line.strip()
line = line.split('#')[0].strip()
if not line: if not line:
continue continue
fn = os.path.join(addr.filename, line.strip()) fn = os.path.join(addr.filename, line.strip())


+ 1
- 0
setup.cfg View File

@@ -12,6 +12,7 @@ cover-erase=
#debug-log=nose.log #debug-log=nose.log
stop= stop=
verbosity=2 verbosity=2
tests=tests
#tests=tests/test_bulkdata.py #tests=tests/test_bulkdata.py
#tests=tests/test_mustclose.py #tests=tests/test_mustclose.py
#tests=tests/test_lrucache.py #tests=tests/test_lrucache.py


+ 5
- 0
tests/test.order View File

@@ -1,3 +1,8 @@
test_cmdline.py
##########

test_client.py

test_printf.py test_printf.py
test_lrucache.py test_lrucache.py
test_mustclose.py test_mustclose.py


+ 69
- 13
tests/test_cmdline.py View File

@@ -4,6 +4,7 @@ import nilmdb
from nilmdb.utils.printf import * from nilmdb.utils.printf import *
import nilmdb.cmdline import nilmdb.cmdline


import unittest
from nose.tools import * from nose.tools import *
from nose.tools import assert_raises from nose.tools import assert_raises
import itertools import itertools
@@ -133,7 +134,7 @@ class TestCmdline(object):
def dump(self): def dump(self):
printf("-----dump start-----\n%s-----dump end-----\n", self.captured) printf("-----dump start-----\n%s-----dump end-----\n", self.captured)


def test_cmdline_01_basic(self):
def test_01_basic(self):


# help # help
self.ok("--help") self.ok("--help")
@@ -179,14 +180,14 @@ class TestCmdline(object):
self.fail("extract --start 2000-01-01 --start 2001-01-02") self.fail("extract --start 2000-01-01 --start 2001-01-02")
self.contain("duplicated argument") self.contain("duplicated argument")


def test_cmdline_02_info(self):
def test_02_info(self):
self.ok("info") self.ok("info")
self.contain("Server URL: http://localhost:12380/") self.contain("Server URL: http://localhost:12380/")
self.contain("Server version: " + test_server.version) self.contain("Server version: " + test_server.version)
self.contain("Server database path") self.contain("Server database path")
self.contain("Server database size") self.contain("Server database size")


def test_cmdline_03_createlist(self):
def test_03_createlist(self):
# Basic stream tests, like those in test_client. # Basic stream tests, like those in test_client.


# No streams # No streams
@@ -230,10 +231,17 @@ class TestCmdline(object):
"/newton/raw RawData\n" "/newton/raw RawData\n"
"/newton/zzz/rawnotch RawNotchedData\n") "/newton/zzz/rawnotch RawNotchedData\n")


# Match just one type or one path
# Match just one type or one path. Also check
# that --path is optional
self.ok("list --path /newton/raw") self.ok("list --path /newton/raw")
self.match("/newton/raw RawData\n") self.match("/newton/raw RawData\n")


self.ok("list /newton/raw")
self.match("/newton/raw RawData\n")

self.fail("list -p /newton/raw /newton/raw")
self.contain("too many paths")

self.ok("list --layout RawData") self.ok("list --layout RawData")
self.match("/newton/raw RawData\n") self.match("/newton/raw RawData\n")


@@ -245,10 +253,14 @@ class TestCmdline(object):
self.ok("list --path *zzz* --layout Raw*") self.ok("list --path *zzz* --layout Raw*")
self.match("/newton/zzz/rawnotch RawNotchedData\n") self.match("/newton/zzz/rawnotch RawNotchedData\n")


self.ok("list *zzz* --layout Raw*")
self.match("/newton/zzz/rawnotch RawNotchedData\n")

self.ok("list --path *zzz* --layout Prep*") self.ok("list --path *zzz* --layout Prep*")
self.match("") self.match("")


def test_cmdline_04_metadata(self):

def test_04_metadata(self):
# Set / get metadata # Set / get metadata
self.fail("metadata") self.fail("metadata")
self.fail("metadata --get") self.fail("metadata --get")
@@ -305,7 +317,7 @@ class TestCmdline(object):
self.fail("metadata /newton/nosuchpath") self.fail("metadata /newton/nosuchpath")
self.contain("No stream at path /newton/nosuchpath") self.contain("No stream at path /newton/nosuchpath")


def test_cmdline_05_parsetime(self):
def test_05_parsetime(self):
os.environ['TZ'] = "America/New_York" os.environ['TZ'] = "America/New_York"
cmd = nilmdb.cmdline.Cmdline(None) cmd = nilmdb.cmdline.Cmdline(None)
test = datetime_tz.datetime_tz.now() test = datetime_tz.datetime_tz.now()
@@ -320,7 +332,7 @@ class TestCmdline(object):
eq_(cmd.parse_time("snapshot-20120405-140000.raw.gz"), test) eq_(cmd.parse_time("snapshot-20120405-140000.raw.gz"), test)
eq_(cmd.parse_time("prep-20120405T1400"), test) eq_(cmd.parse_time("prep-20120405T1400"), test)


def test_cmdline_06_insert(self):
def test_06_insert(self):
self.ok("insert --help") self.ok("insert --help")


self.fail("insert /foo/bar baz qwer") self.fail("insert /foo/bar baz qwer")
@@ -380,7 +392,7 @@ class TestCmdline(object):
# bad start time # bad start time
self.fail("insert --rate 120 --start 'whatever' /newton/prep /dev/null") self.fail("insert --rate 120 --start 'whatever' /newton/prep /dev/null")


def test_cmdline_07_detail(self):
def test_07_detail(self):
# Just count the number of lines, it's probably fine # Just count the number of lines, it's probably fine
self.ok("list --detail") self.ok("list --detail")
lines_(self.captured, 8) lines_(self.captured, 8)
@@ -414,7 +426,7 @@ class TestCmdline(object):
self.ok("list --detail") self.ok("list --detail")
lines_(self.captured, 8) lines_(self.captured, 8)


def test_cmdline_08_extract(self):
def test_08_extract(self):
# nonexistent stream # nonexistent stream
self.fail("extract /no/such/foo --start 2000-01-01 --end 2020-01-01") self.fail("extract /no/such/foo --start 2000-01-01 --end 2020-01-01")
self.contain("Error getting stream info") self.contain("Error getting stream info")
@@ -469,7 +481,7 @@ class TestCmdline(object):
self.ok("extract -c /newton/prep --start 2000-01-01 --end 2020-01-01") self.ok("extract -c /newton/prep --start 2000-01-01 --end 2020-01-01")
self.match("43200\n") self.match("43200\n")


def test_cmdline_09_truncated(self):
def test_09_truncated(self):
# Test truncated responses by overriding the nilmdb max_results # Test truncated responses by overriding the nilmdb max_results
server_stop() server_stop()
server_start(max_results = 2) server_start(max_results = 2)
@@ -478,7 +490,51 @@ class TestCmdline(object):
server_stop() server_stop()
server_start() server_start()


def test_cmdline_10_destroy(self):
@unittest.skip("not ready")
def test_10_remove(self):
# Removing data

# Try nonexistent stream
self.fail("remove /no/such/foo --start 2000-01-01 --end 2020-01-01")
self.contain("Error getting stream info")

# empty ranges return success
self.ok("remove /newton/prep " +
"--start '23 Mar 2012 10:00:30' " +
"--end '23 Mar 2012 10:00:30'")
self.match("")
self.ok("remove /newton/prep " +
"--start '23 Mar 2012 10:00:30.000001' " +
"--end '23 Mar 2012 10:00:30.000001'")
self.match("")
self.ok("remove /newton/prep " +
"--start '23 Mar 2022 10:00:30' " +
"--end '23 Mar 2022 10:00:30'")
self.match("")

# Verbose
self.ok("remove -v /newton/prep " +
"--start '23 Mar 2012 10:00:30' " +
"--end '23 Mar 2012 10:00:30'")
self.match("0\n")
self.ok("remove --verbose /newton/prep " +
"--start '23 Mar 2012 10:00:30' " +
"--end '23 Mar 2012 10:00:30'")
self.match("0\n")

# Remove various chunks of prep data and make sure
# they're gone
self.ok("remove -v /newton/prep " +
"--start '23 Mar 2012 10:00:30' " +
"--end '23 Mar 2012 10:00:40'")
self.match("1200\n")
self.ok("extract -c /newton/prep --start 2000-01-01 --end 2020-01-01")
self.match("42000\n")

# See the missing chunk in list output
#self.ok("list --detail ")

def test_11_destroy(self):
# Delete records # Delete records
self.ok("destroy --help") self.ok("destroy --help")


@@ -529,7 +585,7 @@ class TestCmdline(object):
self.ok("list --detail --path " + path) self.ok("list --detail --path " + path)
self.contain("(no intervals)") self.contain("(no intervals)")


def test_cmdline_11_unicode(self):
def test_12_unicode(self):
# Unicode paths. # Unicode paths.
self.ok("destroy /newton/asdf/qwer") self.ok("destroy /newton/asdf/qwer")
self.ok("destroy /newton/prep") self.ok("destroy /newton/prep")
@@ -549,7 +605,7 @@ class TestCmdline(object):


self.ok(u"destroy /düsseldorf/raw") self.ok(u"destroy /düsseldorf/raw")


def test_cmdline_12_files(self):
def test_13_files(self):
# Test BulkData's ability to split into multiple files, # Test BulkData's ability to split into multiple files,
# by forcing the file size to be really small. # by forcing the file size to be really small.
server_stop() server_stop()


Loading…
Cancel
Save