Merge lp:~jameinel/u1db/c-sync-to-http into lp:u1db

Proposed by John A Meinel
Status: Merged
Merged at revision: 268
Proposed branch: lp:~jameinel/u1db/c-sync-to-http
Merge into: lp:u1db
Diff against target: 100 lines (+58/-4)
2 files modified
u1db/tests/c_backend_wrapper.pyx (+5/-4)
u1db/tests/test_c_backend.py (+53/-0)
To merge this branch: bzr merge lp:~jameinel/u1db/c-sync-to-http
Reviewer Review Type Date Requested Status
Eric Casteleijn (community) Approve
Review via email: mp+104563@code.launchpad.net

Description of the change

This adds a couple of integration tests that we were missing.

Namely, that we use a real HTTP (and a real OAuth + HTTP) server and makes sure that the C-level sync code is able to have the two objects talk to each other.

We had code that the C HTTP Sync Target acts like all other sync targets, but not an end-to-end via C test.

It turned out that we needed to play with the gil code a bit, because you have libcurl code waiting for a response, and need to let the python server run. But we've done that elsewhere as well.

The good thing, is that it just worked, and we didn't have to actually change any code.

To post a comment you must log in.
Revision history for this message
Eric Casteleijn (thisfred) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'u1db/tests/c_backend_wrapper.pyx'
2--- u1db/tests/c_backend_wrapper.pyx 2012-04-30 11:19:18 +0000
3+++ u1db/tests/c_backend_wrapper.pyx 2012-05-03 14:32:17 +0000
4@@ -208,7 +208,7 @@
5 int u1db__get_sync_target(u1database *db, u1db_sync_target **sync_target)
6 int u1db__free_sync_target(u1db_sync_target **sync_target)
7 int u1db__sync_db_to_target(u1database *db, u1db_sync_target *target,
8- int *local_gen_before_sync)
9+ int *local_gen_before_sync) nogil
10
11 int u1db__sync_exchange_insert_doc_from_source(u1db_sync_exchange *se,
12 u1db_document *doc, int source_gen)
13@@ -1122,12 +1122,13 @@
14 """Sync the data between a CDatabase and a CSyncTarget"""
15 cdef CDatabase cdb
16 cdef CSyncTarget ctarget
17- cdef int local_gen = 0
18+ cdef int local_gen = 0, status
19
20 cdb = db
21 ctarget = target
22- handle_status("sync_db_to_target",
23- u1db__sync_db_to_target(cdb._db, ctarget._st, &local_gen))
24+ with nogil:
25+ status = u1db__sync_db_to_target(cdb._db, ctarget._st, &local_gen)
26+ handle_status("sync_db_to_target", status)
27 return local_gen
28
29
30
31=== modified file 'u1db/tests/test_c_backend.py'
32--- u1db/tests/test_c_backend.py 2012-04-27 14:22:47 +0000
33+++ u1db/tests/test_c_backend.py 2012-05-03 14:32:17 +0000
34@@ -19,6 +19,10 @@
35 tests,
36 )
37 from u1db.tests import c_backend_wrapper, c_backend_error
38+from u1db.tests.test_remote_sync_target import (
39+ http_server_def,
40+ oauth_http_server_def,
41+ )
42
43
44 class TestCDatabaseExists(tests.TestCase):
45@@ -295,6 +299,55 @@
46 self.assertIn('oauth_signature="', auth)
47
48
49+class TestSyncCtoHTTPViaC(tests.TestCaseWithServer):
50+
51+ server_def = staticmethod(http_server_def)
52+
53+ def setUp(self):
54+ super(TestSyncCtoHTTPViaC, self).setUp()
55+ if c_backend_wrapper is None:
56+ self.skipTest("The c_backend_wrapper could not be imported")
57+ self.startServer()
58+
59+ def test_trivial_sync(self):
60+ mem_db = self.request_state._create_database('test.db')
61+ mem_doc = mem_db.create_doc(tests.nested_doc)
62+ url = self.getURL('test.db')
63+ target = c_backend_wrapper.create_http_sync_target(url)
64+ db = c_backend_wrapper.CDatabase(':memory:')
65+ doc = db.create_doc(tests.simple_doc)
66+ c_backend_wrapper.sync_db_to_target(db, target)
67+ self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.content, False)
68+ self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.content,
69+ False)
70+
71+
72+class TestSyncCtoOAuthHTTPViaC(tests.TestCaseWithServer):
73+
74+ server_def = staticmethod(oauth_http_server_def)
75+
76+ def setUp(self):
77+ super(TestSyncCtoOAuthHTTPViaC, self).setUp()
78+ if c_backend_wrapper is None:
79+ self.skipTest("The c_backend_wrapper could not be imported")
80+ self.startServer()
81+
82+ def test_trivial_sync(self):
83+ mem_db = self.request_state._create_database('test.db')
84+ mem_doc = mem_db.create_doc(tests.nested_doc)
85+ url = self.getURL('~/test.db')
86+ target = c_backend_wrapper.create_oauth_http_sync_target(url,
87+ tests.consumer1.key, tests.consumer1.secret,
88+ tests.token1.key, tests.token1.secret)
89+ db = c_backend_wrapper.CDatabase(':memory:')
90+ doc = db.create_doc(tests.simple_doc)
91+ c_backend_wrapper.sync_db_to_target(db, target)
92+ self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.content, False)
93+ self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.content,
94+ False)
95+
96+
97+
98 class TestVectorClock(BackendTests):
99
100 def create_vcr(self, rev):

Subscribers

People subscribed via source and target branches