diff options
Diffstat (limited to 'tests/units')
-rwxr-xr-x | tests/units/db/db_routes.py | 49 | ||||
-rwxr-xr-x | tests/units/model/post.py | 109 | ||||
-rw-r--r-- | tests/units/node/__main__.py | 1 | ||||
-rwxr-xr-x | tests/units/node/stats.py | 444 | ||||
-rw-r--r-- | tests/units/toolkit/__main__.py | 1 | ||||
-rwxr-xr-x | tests/units/toolkit/rrd.py | 429 |
6 files changed, 923 insertions, 110 deletions
diff --git a/tests/units/db/db_routes.py b/tests/units/db/db_routes.py index e9f3b28..86c699c 100755 --- a/tests/units/db/db_routes.py +++ b/tests/units/db/db_routes.py @@ -19,7 +19,7 @@ from __init__ import tests from sugar_network import db, toolkit from sugar_network.db import routes as db_routes from sugar_network.model.user import User -from sugar_network.toolkit.router import Router, Request, Response, fallbackroute, ACL, File +from sugar_network.toolkit.router import Router, Request, Response, fallbackroute, ACL, File, postroute from sugar_network.toolkit.coroutine import this from sugar_network.toolkit import coroutine, http, i18n @@ -1851,6 +1851,53 @@ class DbRoutesTest(tests.Test): [{'event': 'delete', 'resource': 'document', 'guid': guid}], events) + def test_ThisResourceInPostrouteOnCreation(self): + + class Document(db.Resource): + + @db.stored_property() + def prop(self, value): + return value + + class Routes(db.Routes): + + @postroute + def postroute(self, result, exception): + return this.resource.properties(['guid', 'prop']) + + volume = db.Volume(tests.tmpdir, [Document]) + router = Router(Routes(volume)) + + self.assertEqual({ + 'guid': 'guid', + 'prop': 'probe', + }, + this.call(method='POST', path=['document'], content={'guid': 'guid', 'prop': 'probe'})) + + def test_ThisResourceInPostrouteOnDeletion(self): + + class Document(db.Resource): + + @db.stored_property() + def prop(self, value): + return value + + class Routes(db.Routes): + + @postroute + def postroute(self, result, exception): + return this.resource.properties(['guid', 'prop']) + + volume = db.Volume(tests.tmpdir, [Document]) + router = Router(Routes(volume)) + + this.call(method='POST', path=['document'], content={'guid': 'guid', 'prop': 'probe'}) + self.assertEqual({ + 'guid': 'guid', + 'prop': 'probe', + }, + this.call(method='DELETE', path=['document', 'guid'])) + if __name__ == '__main__': tests.main() diff --git a/tests/units/model/post.py b/tests/units/model/post.py index 655c08e..5e089ce 100755 --- a/tests/units/model/post.py +++ b/tests/units/model/post.py @@ -44,115 +44,6 @@ class PostTest(tests.Test): ['1', '3', '4'], [i.guid for i in directory.find(query='comments:foo')[0]]) - def test_ShiftContextRating(self): - volume = db.Volume('db', [Context, Post]) - this.volume = volume - - context = volume['context'].create({ - 'type': 'activity', - 'title': {}, - 'summary': {}, - 'description': {}, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - - volume['post'].create({ - 'context': context, - 'type': 'post', - 'title': {}, - 'message': {}, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - - volume['post'].create({ - 'context': context, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 0, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - - volume['post'].create({ - 'context': context, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 1, - }) - self.assertEqual([1, 1], volume['context'][context]['rating']) - - volume['post'].create({ - 'context': context, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 2, - }) - self.assertEqual([2, 3], volume['context'][context]['rating']) - - def test_ShiftTopicRating(self): - volume = db.Volume('db2', [Context, Post]) - this.volume = volume - - context = volume['context'].create({ - 'type': 'activity', - 'title': {}, - 'summary': {}, - 'description': {}, - }) - topic = volume['post'].create({ - 'context': context, - 'type': 'post', - 'title': {}, - 'message': {}, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - self.assertEqual([0, 0], volume['post'][topic]['rating']) - - volume['post'].create({ - 'context': context, - 'topic': topic, - 'type': 'post', - 'title': {}, - 'message': {}, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - self.assertEqual([0, 0], volume['post'][topic]['rating']) - - volume['post'].create({ - 'context': context, - 'topic': topic, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 0, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - self.assertEqual([0, 0], volume['post'][topic]['rating']) - - volume['post'].create({ - 'context': context, - 'topic': topic, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 1, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - self.assertEqual([1, 1], volume['post'][topic]['rating']) - - volume['post'].create({ - 'context': context, - 'topic': topic, - 'type': 'post', - 'title': {}, - 'message': {}, - 'vote': 2, - }) - self.assertEqual([0, 0], volume['context'][context]['rating']) - self.assertEqual([2, 3], volume['post'][topic]['rating']) - if __name__ == '__main__': tests.main() diff --git a/tests/units/node/__main__.py b/tests/units/node/__main__.py index 27f0bab..6d8ad70 100644 --- a/tests/units/node/__main__.py +++ b/tests/units/node/__main__.py @@ -7,6 +7,7 @@ from node_model import * from node_routes import * from master import * from slave import * +from stats import * if __name__ == '__main__': tests.main() diff --git a/tests/units/node/stats.py b/tests/units/node/stats.py new file mode 100755 index 0000000..738b5f6 --- /dev/null +++ b/tests/units/node/stats.py @@ -0,0 +1,444 @@ +#!/usr/bin/env python +# sugar-lint: disable + +import time +from cStringIO import StringIO + +from __init__ import tests + +from sugar_network.node.auth import RootAuth +from sugar_network.node.model import Volume +from sugar_network.node.stats import StatRoutes +from sugar_network.toolkit.coroutine import this + + +class StatsTest(tests.Test): + + def test_StatContexts(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + guid1 = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + guid2 = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 2.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='DELETE', path=['context', guid1]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 2.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 2, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='DELETE', path=['context', guid2]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 2.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 2, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 3, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatReleased(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + guid = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + agg1 = this.call(method='POST', path=['context', guid, 'releases'], content=StringIO( + self.zips(('topdir/activity/activity.info', '\n'.join([ + '[Activity]', + 'name = Activity', + 'bundle_id = %s' % guid, + 'exec = true', + 'icon = icon', + 'activity_version = 1', + 'license = Public Domain', + ]))))) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + agg2 = this.call(method='POST', path=['context', guid, 'releases'], content=StringIO( + self.zips(('topdir/activity/activity.info', '\n'.join([ + '[Activity]', + 'name = Activity', + 'bundle_id = %s' % guid, + 'exec = true', + 'icon = icon', + 'activity_version = 2', + 'license = Public Domain', + ]))))) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 2.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + agg2 = this.call(method='POST', path=['context', guid, 'releases'], content=StringIO( + self.zips(('topdir/activity/activity.info', '\n'.join([ + '[Activity]', + 'name = Activity', + 'bundle_id = %s' % guid, + 'exec = true', + 'icon = icon', + 'activity_version = 3', + 'license = Public Domain', + ]))))) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 2.0, 'posts': 0.0, 'users': 1.0}), + (ts + 3, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 0.0, 'topics': 3.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatSolved(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + guid = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + this.call(method='POST', path=['context', guid, 'releases'], content=StringIO( + self.zips(('topdir/activity/activity.info', '\n'.join([ + '[Activity]', + 'name = Activity', + 'bundle_id = %s' % guid, + 'exec = true', + 'icon = icon', + 'activity_version = 1', + 'license = Public Domain', + ]))))) + this.call(method='GET', path=['context', guid], cmd='solve') + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='GET', path=['context', guid], cmd='solve') + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='GET', path=['context', guid], cmd='solve') + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 1.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + (ts + 3, {'contexts': 1.0, 'released': 0.0, 'reported': 0.0, 'solved': 1.0, 'topics': 1.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatReported(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + this.call(method='POST', path=['report'], content={'context': 'context', 'error': '', 'lsb_release': {}, 'uname': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='POST', path=['report'], content={'context': 'context', 'error': '', 'lsb_release': {}, 'uname': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='POST', path=['report'], content={'context': 'context', 'error': '', 'lsb_release': {}, 'uname': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 3, {'contexts': 0.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatUsers(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY2}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 2.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='DELETE', path=['user', tests.UID]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 2.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='DELETE', path=['user', tests.UID2]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 2.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 1.0}), + (ts + 3, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatTopics(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + guid1 = this.call(method='POST', path=['post'], content={'context': '', 'type': 'post', 'title': '', 'message': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + guid2 = this.call(method='POST', path=['post'], content={'context': '', 'type': 'post', 'title': '', 'message': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 2.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='DELETE', path=['post', guid1]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 2.0, 'posts': 0.0, 'users': 0.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='DELETE', path=['post', guid2]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 2.0, 'posts': 0.0, 'users': 0.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 1.0, 'posts': 0.0, 'users': 0.0}), + (ts + 3, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatPosts(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + self.override(time, 'time', lambda: ts) + guid1 = this.call(method='POST', path=['post'], content={'topic': 'topic', 'context': '', 'type': 'post', 'title': '', 'message': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 1) + guid2 = this.call(method='POST', path=['post'], content={'topic': 'topic', 'context': '', 'type': 'post', 'title': '', 'message': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 2.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 2) + this.call(method='DELETE', path=['post', guid1]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 2.0, 'users': 0.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + self.override(time, 'time', lambda: ts + 3) + this.call(method='DELETE', path=['post', guid2]) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + (ts + 1, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 2.0, 'users': 0.0}), + (ts + 2, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 1.0, 'users': 0.0}), + (ts + 3, {'contexts': 0.0, 'released': 0.0, 'reported': 0.0, 'solved': 0.0, 'topics': 0.0, 'posts': 0.0, 'users': 0.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_ReuseTotalsOnInitialStart(self): + volume = self.start_master(auth=RootAuth()) + this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + this.call(method='POST', path=['user'], content={'name': '', 'pubkey': tests.PUBKEY}) + this.call(method='POST', path=['post'], content={'context': '', 'type': 'post', 'title': '', 'message': ''}) + this.call(method='POST', path=['post'], content={'topic': 'topic', 'context': '', 'type': 'post', 'title': '', 'message': ''}) + + ts = int(time.time()) + self.override(time, 'time', lambda: ts) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + this.call(method='POST', path=['report'], content={'context': 'context', 'error': '', 'lsb_release': {}, 'uname': ''}) + self.node_routes.stats_commit() + self.assertEqual([ + (ts + 0, {'contexts': 1.0, 'released': 0.0, 'reported': 1.0, 'solved': 0.0, 'topics': 1.0, 'posts': 1.0, 'users': 1.0}), + ], + this.call(method='GET', cmd='stats')) + + def test_StatContextRating(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + guid = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'}) + self.node_routes.stats_commit() + self.assertEqual([0, 0], volume['context'][guid]['rating']) + + post1 = this.call(method='POST', path=['post'], content={'context': guid, 'type': 'review', 'title': '', 'message': '', 'vote': 0}) + self.node_routes.stats_commit() + self.assertEqual([1, 0], volume['context'][guid]['rating']) + + post2 = this.call(method='POST', path=['post'], content={'context': guid, 'type': 'review', 'title': '', 'message': '', 'vote': 1}) + self.node_routes.stats_commit() + self.assertEqual([2, 1], volume['context'][guid]['rating']) + + post3 = this.call(method='POST', path=['post'], content={'context': guid, 'type': 'review', 'title': '', 'message': '', 'vote': 4}) + self.node_routes.stats_commit() + self.assertEqual([3, 5], volume['context'][guid]['rating']) + + this.call(method='DELETE', path=['post', post2]) + self.node_routes.stats_commit() + self.assertEqual([2, 4], volume['context'][guid]['rating']) + + this.call(method='DELETE', path=['post', post1]) + self.node_routes.stats_commit() + self.assertEqual([1, 4], volume['context'][guid]['rating']) + + this.call(method='DELETE', path=['post', post3]) + self.node_routes.stats_commit() + self.assertEqual([0, 0], volume['context'][guid]['rating']) + + def test_StatTopicRating(self): + ts = int(time.time()) + volume = self.start_master(auth=RootAuth()) + self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10']) + + guid = this.call(method='POST', path=['post'], content={'context': '', 'type': 'post', 'title': '', 'message': ''}) + self.assertEqual([0, 0], volume['post'][guid]['rating']) + + self.node_routes.stats_commit() + self.assertEqual([0, 0], volume['post'][guid]['rating']) + + post1 = this.call(method='POST', path=['post'], content={'context': '', 'topic': guid, 'type': 'post', 'title': '', 'message': '', 'vote': 0}) + self.node_routes.stats_commit() + self.assertEqual([1, 0], volume['post'][guid]['rating']) + + post2 = this.call(method='POST', path=['post'], content={'context': '', 'topic': guid, 'type': 'post', 'title': '', 'message': '', 'vote': 1}) + self.node_routes.stats_commit() + self.assertEqual([2, 1], volume['post'][guid]['rating']) + + post3 = this.call(method='POST', path=['post'], content={'context': '', 'topic': guid, 'type': 'post', 'title': '', 'message': '', 'vote': 4}) + self.node_routes.stats_commit() + self.assertEqual([3, 5], volume['post'][guid]['rating']) + + this.call(method='DELETE', path=['post', post2]) + self.node_routes.stats_commit() + self.assertEqual([2, 4], volume['post'][guid]['rating']) + + this.call(method='DELETE', path=['post', post1]) + self.node_routes.stats_commit() + self.assertEqual([1, 4], volume['post'][guid]['rating']) + + this.call(method='DELETE', path=['post', post3]) + self.node_routes.stats_commit() + self.assertEqual([0, 0], volume['post'][guid]['rating']) + + +if __name__ == '__main__': + tests.main() diff --git a/tests/units/toolkit/__main__.py b/tests/units/toolkit/__main__.py index 45a6810..18f9c69 100644 --- a/tests/units/toolkit/__main__.py +++ b/tests/units/toolkit/__main__.py @@ -16,6 +16,7 @@ from sat import * from packets import * from ranges import * from packagekit import * +from rrd import * if __name__ == '__main__': tests.main() diff --git a/tests/units/toolkit/rrd.py b/tests/units/toolkit/rrd.py new file mode 100755 index 0000000..9c2e020 --- /dev/null +++ b/tests/units/toolkit/rrd.py @@ -0,0 +1,429 @@ +#!/usr/bin/env python +# sugar-lint: disable + +import os +import time +import json + +import rrdtool + +from __init__ import tests + +from sugar_network.toolkit import rrd + + +class RrdTest(tests.Test): + + def setUp(self): + tests.Test.setUp(self) + rrd._FETCH_PAGE = 100 + rrd._rrdtool = rrdtool + + def test_Db(self): + ts = int(time.time()) + 100 + + rrdtool.create('test.rrd', + '--start', str(ts), + '-s', '1', + 'DS:f1:GAUGE:1:2:3', + 'DS:f2:COUNTER:4:5:6', + 'RRA:AVERAGE:0.1:7:8', + 'RRA:LAST:0.2:9:10', + ) + + db = rrd._Db('test.rrd') + self.assertEqual(1, db.step) + self.assertEqual([ + 'DS:f1:GAUGE:1:U:U', + 'DS:f2:COUNTER:4:U:U' + ], + db.fields) + self.assertEqual([ + 'RRA:AVERAGE:0.1:7:8', + 'RRA:LAST:0.2:9:10', + ], + db.rras) + + def test_load(self): + rrdtool.create('1.rrd', 'DS:f:GAUGE:1:2:3', 'RRA:AVERAGE:0.1:7:8') + rrdtool.create('2.rrd', 'DS:f:GAUGE:1:2:3', 'RRA:AVERAGE:0.1:7:8') + rrdtool.create('3.rrd', 'DS:f:GAUGE:1:2:3', 'RRA:AVERAGE:0.1:7:8') + + dbset = rrd.Rrd('.', None, None, None, None) + dbset._load('1.rrd', 1) + self.assertEqual( + ['./1.rrd'], + [i.path for i in dbset._revisions]) + dbset._load('2.rrd' ,2) + self.assertEqual( + ['./1.rrd', './2.rrd'], + [i.path for i in dbset._revisions]) + dbset._load('3.rrd', 3) + self.assertEqual( + ['./1.rrd', './2.rrd', './3.rrd'], + [i.path for i in dbset._revisions]) + + dbset = rrd.Rrd('.', None, None, None, None) + dbset._load('3.rrd', 3) + self.assertEqual( + ['./3.rrd'], + [i.path for i in dbset._revisions]) + dbset._load('2.rrd', 2) + self.assertEqual( + ['./2.rrd', './3.rrd'], + [i.path for i in dbset._revisions]) + dbset._load('1.rrd', 1) + self.assertEqual( + ['./1.rrd', './2.rrd', './3.rrd'], + [i.path for i in dbset._revisions]) + + def test_put_WithChangedLayout(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1}, ts) + self.assertEqual('./test.rrd', dbset._get_db(0, {}).path) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset._load('test.rrd', 0) + dbset.put({'f1': 2, 'f2': 2}, ts + 1) + self.assertEqual('./test-1.rrd', dbset._get_db(0, {}).path) + + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 10)) + assert (1,) in values + assert (2, 2) not in values + + __, __, values = rrdtool.fetch('test-1.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 10)) + assert (1,) not in values + assert (2, 2) in values + + def test_put_WithChangedRRA(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1}, ts) + self.assertEqual('./test.rrd', dbset._get_db(0, {}).path) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.1:1:10']) + dbset._load('test.rrd', 0) + dbset.put({'f1': 1}, ts + 1) + self.assertEqual('./test-1.rrd', dbset._get_db(0, {}).path) + + def test_put_WithChangedStep(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1}, ts) + self.assertEqual('./test.rrd', dbset._get_db(0, {}).path) + + dbset = rrd.Rrd('.', 'test', None, 2, ['RRA:AVERAGE:0.5:1:10']) + dbset._load('test.rrd', 0) + dbset.put({'f1': 1}, ts + 2) + self.assertEqual('./test-1.rrd', dbset._get_db(0, {}).path) + + def test_get_OneDb(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1, 'f2': 1}, ts) + dbset.put({'f1': 2, 'f2': 2}, ts + 1) + dbset.put({'f1': 3, 'f2': 3}, ts + 2) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset._load('test.rrd', 0) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0})], + [(t, i) for t, i in dbset.get(ts, ts)]) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0}), (ts + 1, {'f1': 2.0, 'f2': 2.0})], + [(t, i) for t, i in dbset.get(ts, ts + 1)]) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0}), (ts + 1, {'f1': 2.0, 'f2': 2.0}), (ts + 2, {'f1': 3.0, 'f2': 3.0})], + [(t, i) for t, i in dbset.get(ts, ts + 2)]) + + def test_get_OneDbLongSteps(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1, 'f2': 1}, ts) + dbset.put({'f1': 2, 'f2': 2}, ts + 3) + dbset.put({'f1': 3, 'f2': 3}, ts + 6) + + ts = ts / 3 * 3 + + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + dbset._load('test.rrd', 0) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0})], + [(t, i) for t, i in dbset.get(ts, ts)]) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0}), (ts + 3, {'f1': 2.0, 'f2': 2.0})], + [(t, i) for t, i in dbset.get(ts, ts + 3)]) + self.assertEqual( + [(ts, {'f1': 1.0, 'f2': 1.0}), (ts + 3, {'f1': 2.0, 'f2': 2.0}), (ts + 6, {'f1': 3.0, 'f2': 3.0})], + [(t, i) for t, i in dbset.get(ts, ts + 6)]) + + def test_get_MultipeDbs(self): + ts = int(time.time()) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset.put({'f1': 1, 'f2': 1}, ts) + ts = dbset._get_db(0, {}).last + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.6:1:10']) + dbset._load('test.rrd', 0) + dbset.put({'f1': 2, 'f2': 2}, ts + 1) + dbset.put({'f1': 3, 'f2': 3}, ts + 2) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.7:1:10']) + dbset._load('test.rrd', 0) + dbset._load('test-1.rrd', 1) + dbset.put({'f1': 4, 'f2': 4}, ts + 3) + dbset.put({'f1': 5, 'f2': 5}, ts + 4) + dbset.put({'f1': 6, 'f2': 6}, ts + 5) + + dbset = rrd.Rrd('.', 'test', None, 1, ['RRA:AVERAGE:0.5:1:10']) + dbset._load('test.rrd', 0) + dbset._load('test-1.rrd', 1) + dbset._load('test-2.rrd', 2) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts)]) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + (ts + 1, {'f1': 2.0, 'f2': 2.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts + 1)]) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + (ts + 1, {'f1': 2.0, 'f2': 2.0}), + (ts + 2, {'f1': 3.0, 'f2': 3.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts + 2)]) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + (ts + 1, {'f1': 2.0, 'f2': 2.0}), + (ts + 2, {'f1': 3.0, 'f2': 3.0}), + (ts + 3, {'f1': 4.0, 'f2': 4.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts + 3)]) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + (ts + 1, {'f1': 2.0, 'f2': 2.0}), + (ts + 2, {'f1': 3.0, 'f2': 3.0}), + (ts + 3, {'f1': 4.0, 'f2': 4.0}), + (ts + 4, {'f1': 5.0, 'f2': 5.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts + 4)]) + self.assertEqual( + [ + (ts, {'f1': 1.0, 'f2': 1.0}), + (ts + 1, {'f1': 2.0, 'f2': 2.0}), + (ts + 2, {'f1': 3.0, 'f2': 3.0}), + (ts + 3, {'f1': 4.0, 'f2': 4.0}), + (ts + 4, {'f1': 5.0, 'f2': 5.0}), + (ts + 5, {'f1': 6.0, 'f2': 6.0}), + ], + [(t, i) for t, i in dbset.get(ts, ts + 5)]) + + def test_NoTimestampDupes(self): + start_ts = int(time.time()) + end_ts = start_ts + 86400 * 3 + + dbset = rrd.Rrd('.', 'test', None, 300, [ + 'RRA:AVERAGE:0.5:1:288', + 'RRA:AVERAGE:0.5:3:672', + 'RRA:AVERAGE:0.5:12:744', + 'RRA:AVERAGE:0.5:144:732', + ]) + for i in xrange((end_ts - start_ts) / 300): + dbset.put({'f': i}, start_ts + i * 300) + + prev_ts = -1 + prev_value = -1 + for ts, value in dbset.get(start_ts, end_ts, 86400): + value = value['f'] + assert ts > prev_ts + assert value > prev_value + prev_ts = ts + prev_value = value + + def test_PendingPuts(self): + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + ts = int(time.time()) / 3 * 3 + dbset.put({'f': 1}, ts) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset.put({'f': 2}, ts + 1) + self.assertEqual({ + 'first': ts, + 'pending': {'f': 2}, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset.put({'f': 3}, ts + 2) + self.assertEqual({ + 'first': ts, + 'pending': {'f': 3}, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset.put({'f': 4}, ts + 3) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (4.0,), + ], + values) + + def test_SavePendingPuts(self): + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + ts = int(time.time()) / 3 * 3 + dbset.put({'f': 1}, ts) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 5)) + self.assertEqual([ + (1.0,), (None,), (None,), + ], + values) + + dbset.put({'f': 2}, ts + 1) + self.assertEqual({ + 'first': ts, + 'pending': {'f': 2}, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 5)) + self.assertEqual([ + (1.0,), (None,), (None, ), + ], + values) + + dbset.put({'f': 3}, ts + 6) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 5)) + self.assertEqual([ + (1.0,), (2.0,), (3.0,), + ], + values) + + def test_PendingPutsAfterOnStartup(self): + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + ts = int(time.time()) / 3 * 3 + dbset.put({'f': 1}, ts) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + dbset.put({'f': 2}, ts + 1) + self.assertEqual({ + 'first': ts, + 'pending': {'f': 2}, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + dbset.put({'f': 3}, ts + 2) + self.assertEqual({ + 'first': ts, + 'pending': {'f': 3}, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + dbset.put({'f': 4}, ts + 3) + self.assertEqual({ + 'first': ts, + }, + json.load(file('test.meta'))) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (4.0,), + ], + values) + + def test_GetPendingValues(self): + dbset = rrd.Rrd('.', 'test', None, 3, ['RRA:AVERAGE:0.5:1:10']) + + ts = int(time.time()) / 3 * 3 - 3 + dbset.put({'f': 1}, ts) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + self.assertEqual({'f': 1.0}, dbset.values()) + self.assertEqual({'f': 1.0}, dbset.values(ts)) + + dbset.put({'f': 2}, ts + 1) + __, __, values = rrdtool.fetch('test.rrd', 'AVERAGE', '-s', str(ts - 1), '-e', str(ts + 2)) + self.assertEqual([ + (1.0,), (None,), + ], + values) + self.assertEqual({'f': 1.0}, dbset.values()) + self.assertEqual({'f': 2.0}, dbset.values(ts)) + self.assertEqual({'f': 2.0}, dbset.values(ts + 1)) + self.assertEqual({'f': 2.0}, dbset.values(ts + 2)) + self.assertEqual({'f': 2.0}, dbset.values(ts + 3)) + self.assertEqual({'f': 1.0}, dbset.values(ts + 4)) + + +if __name__ == '__main__': + tests.main() |