[pypy-svn] r69311 - in codespeed: . documentation pyspeed/codespeed pyspeed/fixtures tools

tobami at codespeak.net tobami at codespeak.net
Mon Nov 16 01:01:03 CET 2009


Author: tobami
Date: Mon Nov 16 01:01:01 2009
New Revision: 69311

Added:
   codespeed/documentation/
   codespeed/documentation/Backend_DB.mwb   (contents, props changed)
   codespeed/documentation/Backend_DB.png
      - copied unchanged from r69108, codespeed/Backend_DB.png
   codespeed/tools/
   codespeed/tools/save_result.py
Removed:
   codespeed/Backend_DB.png
   codespeed/pyspeed/fixtures/fixtures.json
Modified:
   codespeed/pyspeed/codespeed/admin.py
   codespeed/pyspeed/codespeed/models.py
   codespeed/pyspeed/codespeed/tests.py
   codespeed/pyspeed/codespeed/urls.py
   codespeed/pyspeed/codespeed/views.py
Log:
Add view to save result data.
Add unittest for the view
Add script to save result data


Added: codespeed/documentation/Backend_DB.mwb
==============================================================================
Binary file. No diff available.

Modified: codespeed/pyspeed/codespeed/admin.py
==============================================================================
--- codespeed/pyspeed/codespeed/admin.py	(original)
+++ codespeed/pyspeed/codespeed/admin.py	Mon Nov 16 01:01:01 2009
@@ -3,7 +3,7 @@
 from django.contrib import admin
 
 class RevisionAdmin(admin.ModelAdmin):
-    list_display = ('number', 'project', 'tag')
+    list_display = ('number', 'project', 'tag', 'date')
     
 admin.site.register(Revision, RevisionAdmin)
 

Modified: codespeed/pyspeed/codespeed/models.py
==============================================================================
--- codespeed/pyspeed/codespeed/models.py	(original)
+++ codespeed/pyspeed/codespeed/models.py	Mon Nov 16 01:01:01 2009
@@ -26,6 +26,7 @@
     TYPES = (
         ('T', 'Trunk'),
         ('D', 'Debug'),
+        ('P', 'Python'),
         ('M', 'Multilanguage'),
     )
     def __unicode__(self):

Modified: codespeed/pyspeed/codespeed/tests.py
==============================================================================
--- codespeed/pyspeed/codespeed/tests.py	(original)
+++ codespeed/pyspeed/codespeed/tests.py	Mon Nov 16 01:01:01 2009
@@ -1,35 +1,79 @@
 # -*- coding: utf-8 -*-
-"""
-This file demonstrates two different styles of tests (one doctest and one
-unittest). These will both pass when you run "manage.py test".
-
-Replace these with more appropriate tests for your application.
-"""
-
 from django.test import TestCase
-import urllib, urllib2
-import simplejson
 from datetime import datetime
+from django.test.client import Client
+from pyspeed.codespeed.models import Benchmark, Revision, Interpreter, Environment, Result
 
 class AddResultTest(TestCase):
+    def setUp(self):
+        self.path = '/result/add/'
+        self.client = Client()
+        self.e = Environment(name='Dual Core Linux', cpu='Core 2 Duo 8200')
+        self.e.save()
+        self.cdate = datetime.today()
+        self.data = {
+                'revision_number': '23232',
+                'revision_project': 'pypy',
+                'interpreter_name': 'pypy-c',
+                'interpreter_coptions': 'gc=Böhm',
+                'benchmark_name': 'Richards',
+                'environment': 'Dual Core Linux',
+                'result_key': 'total',
+                'result_value': 456,
+                'result_date': self.cdate,
+        }        
     def test_add_result(self):
         """
         Add result data
         """
-        data = {
-            'revision_number': '23232',
-            'revision_project': 'pypy',
-            'interpreter_name': 'pypy-c',
-            'interpreter_coptions': 'gc=Boehm',
-            'benchmark_name': 'Richards',
-            'environment': 1,
-            'result_key': 'total',
-            'result_value': 456,
-            'result_date': datetime.today(),
-        }
-        params = urllib.urlencode(data)
-        f = urllib2.urlopen('http://localhost:8000/pypy/result/add/', params)
-        data = f.read()
-        print "Server response:", data
-        f.close()
+        response = self.client.post(self.path, self.data)
+        self.assertEquals(response.status_code, 200)
+        self.assertEquals(response.content, "Result data saved succesfully")
+        e = Environment.objects.get(name='Dual Core Linux')        
+        b = Benchmark.objects.get(name='Richards')
+        r = Revision.objects.get(number='23232', project='pypy')
+        i = Interpreter.objects.get(name='pypy-c', coptions='gc=Böhm')
+        self.assertTrue(Result.objects.get(
+            key='total',
+            value=456,
+            date=self.cdate,
+            revision=r,
+            interpreter=i,
+            benchmark=b,
+            environment=e
+        ))
 
+    def test_bad_environment(self):
+        """
+        Add result associated with non-existing environment
+        """
+        no_name = 'Dual Core Linux1'
+        self.data['environment'] = no_name
+        response = self.client.post(self.path, self.data)
+        self.assertEquals(response.status_code, 404)
+        self.assertEquals(response.content, "Environment " + no_name + " not found")
+        self.data['environment'] = 'Dual Core Linux'
+    
+    def test_empty_argument(self):
+        """
+        Make POST request with an empty argument.
+        """
+        for key in self.data:
+            backup = self.data[key]
+            self.data[key] = ""
+            response = self.client.post(self.path, self.data)
+            self.assertEquals(response.status_code, 400)
+            self.assertEquals(response.content, 'Key "' + key + '" empty in request')
+            self.data[key] = backup
+    
+    def test_missing_argument(self):
+        """
+        Make POST request with a missing argument.
+        """
+        for key in self.data:
+            backup = self.data[key]
+            del(self.data[key])
+            response = self.client.post(self.path, self.data)
+            self.assertEquals(response.status_code, 400)
+            self.assertEquals(response.content, 'Key "' + key + '" missing from request')
+            self.data[key] = backup

Modified: codespeed/pyspeed/codespeed/urls.py
==============================================================================
--- codespeed/pyspeed/codespeed/urls.py	(original)
+++ codespeed/pyspeed/codespeed/urls.py	Mon Nov 16 01:01:01 2009
@@ -33,7 +33,7 @@
     (r'^pypy/result/$', list_detail.object_list, result_list),
     (r'^pypy/revision/$', list_detail.object_list, revision_list),
     # URL interface for adding results
-    (r'^pypy/result/add/$', 'addresult'),
+    (r'^result/add/$', 'addresult'),
 )
 
 if settings.DEBUG:

Modified: codespeed/pyspeed/codespeed/views.py
==============================================================================
--- codespeed/pyspeed/codespeed/views.py	(original)
+++ codespeed/pyspeed/codespeed/views.py	Mon Nov 16 01:01:01 2009
@@ -1,20 +1,53 @@
 # -*- coding: utf-8 -*-
-#from django.shortcuts import render_to_response
-#from django.views.generic.list_detail import object_list
-from pyspeed.codespeed.models import Revision, Result, Interpreter, Benchmark
-#from pyspeed import settings
-from django.http import HttpResponse, HttpResponseNotAllowed
 from django.shortcuts import get_object_or_404
+from pyspeed.codespeed.models import Revision, Result, Interpreter, Benchmark, Environment
+from django.http import HttpResponse, Http404, HttpResponseBadRequest, HttpResponseNotFound
 
 def addresult(request):
     if request.method != 'POST':
         return HttpResponseNotAllowed('POST')
     data =  request.POST
-    print data
-    ben = get_object_or_404(Benchmark, name=data["benchmark_name"])
-    print "benchmark:", ben
-    rev = get_object_or_404(Revision, number=data["revision_number"], project=data["revision_project"])
-    print "revision object:", rev
-    inter = get_object_or_404(Interpreter, name=data["interpreter_name"], coptions=data["interpreter_coptions"])
-    print inter
-    return HttpResponse("Data saved succesfully")
+    
+    mandatory_data = [
+        'revision_number',
+        'revision_project',
+        'interpreter_name',
+        'interpreter_coptions',
+        'benchmark_name',
+        'environment',
+        'result_key',
+        'result_value',
+        'result_date',
+    ]
+    for key in mandatory_data:
+        if data.has_key(key):
+            if data[key] == "":
+                return HttpResponseBadRequest('Key "' + key + '" empty in request')
+        else: return HttpResponseBadRequest('Key "' + key + '" missing from request')
+    b, created = Benchmark.objects.get_or_create(name=data["benchmark_name"])
+    if data.has_key('benchmark_type'):
+        b.benchmark_type = data['benchmark_type']
+        b.save()
+    rev, created = Revision.objects.get_or_create(number=data["revision_number"], project=data["revision_project"])
+    if data.has_key('revision_date'):
+        rev.date = data['revision_date']
+        rev.save()
+    inter, created = Interpreter.objects.get_or_create(name=data["interpreter_name"], coptions=data["interpreter_coptions"])
+    try:
+        e = get_object_or_404(Environment, name=data["environment"])
+    except Http404:
+        return HttpResponseNotFound("Environment " + data["environment"] + " not found")
+    result_type = "T"
+    if data.has_key('result_type'):
+        result_type = data['result_type']
+    r, created = Result.objects.get_or_create(
+            key=data["result_key"],
+            value=data["result_value"],
+            result_type=result_type,
+            date=data["result_date"],
+            revision=rev,
+            interpreter=inter,
+            benchmark=b,
+            environment=e
+    )
+    return HttpResponse("Result data saved succesfully")

Added: codespeed/tools/save_result.py
==============================================================================
--- (empty file)
+++ codespeed/tools/save_result.py	Mon Nov 16 01:01:01 2009
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+from datetime import datetime
+import urllib, urllib2
+
+BASEURL = 'http://localhost:8080/'
+
+def add_result():
+    data = {
+        'revision_number': '23238',
+        'revision_project': 'pypy',
+        'revision_date': "2009-11-15 18:11:29", # Optional
+        'interpreter_name': 'pypy-c-jit',
+        'interpreter_coptions': 'gc=Boehm',
+        'benchmark_name': 'Richards',
+        'benchmark_type': 'P',# Optional. Default Trunk. (Trunk, Debug, Python, Multilanguage)
+        'environment': "Dual Core Linux",
+        'result_key': 'total',
+        'result_value': 400,
+        'result_type': 'M',# Optional. Default Time in milliseconds. (Time, Memory, Score)
+        'result_date': datetime.today(),
+    }
+    
+    # TODO add HTTPError try
+    params = urllib.urlencode(data)
+    f = urllib2.urlopen(BASEURL + 'result/add/', params)
+    response = f.read()
+    print "Server response:", response
+    f.close()
+
+if __name__ == "__main__":
+    add_result()



More information about the Pypy-commit mailing list