Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rwxr-xr-xtests/units/db/db_routes.py49
-rwxr-xr-xtests/units/model/post.py109
-rw-r--r--tests/units/node/__main__.py1
-rwxr-xr-xtests/units/node/stats.py444
-rw-r--r--tests/units/toolkit/__main__.py1
-rwxr-xr-xtests/units/toolkit/rrd.py429
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()