Merge lp:~mvo/software-center/recagent-test-cleanup into lp:software-center

Proposed by Michael Vogt
Status: Merged
Merged at revision: 3133
Proposed branch: lp:~mvo/software-center/recagent-test-cleanup
Merge into: lp:software-center
Diff against target: 229 lines (+77/-95)
2 files modified
softwarecenter/backend/recagent.py (+1/-1)
tests/test_recagent.py (+76/-94)
To merge this branch: bzr merge lp:~mvo/software-center/recagent-test-cleanup
Reviewer Review Type Date Requested Status
Gary Lasker (community) Approve
Michael Vogt Needs Resubmitting
Review via email: mp+121559@code.launchpad.net

Description of the change

Small branch that consolidates code in test_recagent into common
functions

To post a comment you must log in.
Revision history for this message
Gary Lasker (gary-lasker) wrote :
Download full text (4.1 KiB)

Hi Michael, this all seems good and the cleanup is great. I assume all of these tests are working for you now, but I am consistently getting 401 errors for three of the tests (see below). It's late though, we can look at this tomorrow.

$ PYTHONPATH=. python tests/test_recagent.py
.No handlers could be found for logger "softwarecenter.backend.spawn_helper"
F.F..F..s
======================================================================
FAIL: test_recagent_post_submit_profile (__main__.TestRecommenderAgent)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/test_recagent.py", line 81, in test_recagent_post_submit_profile
    self.assertServerReturnsWithNoError()
  File "tests/test_recagent.py", line 68, in assertServerReturnsWithNoError
    self.assertFalse(self.error, "got error: '%s'" % self.error_msg)
AssertionError: got error: 'WARNING:__main__:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica.canonical.com:3128 (squid/2.7.STABLE7)', 'x-cache': 'MISS from myrica.canonical.com', 'x-cache-lookup': 'MISS from myrica.canonical.com:3128', 'expires': 'Wed, 29 Aug 2012 02:04:18 GMT', 'vary': 'Authorization,Accept-Encoding', '-content-encoding': 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:18 GMT', 'etag': '"7e287fc885d9fdcf42da3a12f38572c1"', 'strict-transport-security': 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:18 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm="SoftwareCenter Agent"'}
'

======================================================================
FAIL: test_recagent_query_profile (__main__.TestRecommenderAgent)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/test_recagent.py", line 97, in test_recagent_query_profile
    self.assertServerReturnsWithNoError()
  File "tests/test_recagent.py", line 68, in assertServerReturnsWithNoError
    self.assertFalse(self.error, "got error: '%s'" % self.error_msg)
AssertionError: got error: 'WARNING:__main__:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica.canonical.com:3128 (squid/2.7.STABLE7)', 'x-cache': 'MISS from myrica.canonical.com', 'x-cache-lookup': 'MISS from myrica.canonical.com:3128', 'expires': 'Wed, 29 Aug 2012 02:04:24 GMT', 'vary': 'Authorization,Accept-Encoding', '-content-encoding': 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:24 GMT', 'etag': '"7e287fc885d9fdcf42da3a12f38572c1"', 'strict-transport-security': 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:24 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm="SoftwareCenter Agent"'}
'

======================================================================
FAIL: test_recagent_query_recommend_me (__main__.TestRecommenderAgent)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/test_recagent.py", line 102, in test_recagent_query_recommend_me
    self.assertServerReturnsWithNoErro...

Read more...

Revision history for this message
Michael Vogt (mvo) wrote :
Download full text (4.6 KiB)

On Wed, Aug 29, 2012 at 02:07:19AM -0000, Gary Lasker wrote:
> Hi Michael, this all seems good and the cleanup is great. I assume all of these tests are working for you now, but I am consistently getting 401 errors for three of the tests (see below). It's late though, we can look at this tomorrow.

Thanks, I guess we need to add skip decorators again for those, it
seems to be dependant on the account of maybe on the time the tests
are run :) I wonder if instead we should build a mock service but I
guess that is a bit too much work :/

> $ PYTHONPATH=. python tests/test_recagent.py
> .No handlers could be found for logger "softwarecenter.backend.spawn_helper"
> F.F..F..s
> ======================================================================
> FAIL: test_recagent_post_submit_profile (__main__.TestRecommenderAgent)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "tests/test_recagent.py", line 81, in test_recagent_post_submit_profile
> self.assertServerReturnsWithNoError()
> File "tests/test_recagent.py", line 68, in assertServerReturnsWithNoError
> self.assertFalse(self.error, "got error: '%s'" % self.error_msg)
> AssertionError: got error: 'WARNING:__main__:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica.canonical.com:3128 (squid/2.7.STABLE7)', 'x-cache': 'MISS from myrica.canonical.com', 'x-cache-lookup': 'MISS from myrica.canonical.com:3128', 'expires': 'Wed, 29 Aug 2012 02:04:18 GMT', 'vary': 'Authorization,Accept-Encoding', '-content-encoding': 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:18 GMT', 'etag': '"7e287fc885d9fdcf42da3a12f38572c1"', 'strict-transport-security': 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:18 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm="SoftwareCenter Agent"'}
> '
>
> ======================================================================
> FAIL: test_recagent_query_profile (__main__.TestRecommenderAgent)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "tests/test_recagent.py", line 97, in test_recagent_query_profile
> self.assertServerReturnsWithNoError()
> File "tests/test_recagent.py", line 68, in assertServerReturnsWithNoError
> self.assertFalse(self.error, "got error: '%s'" % self.error_msg)
> AssertionError: got error: 'WARNING:__main__:401: {'status': '401', 'content-length': '22', 'via': '1.1 myrica.canonical.com:3128 (squid/2.7.STABLE7)', 'x-cache': 'MISS from myrica.canonical.com', 'x-cache-lookup': 'MISS from myrica.canonical.com:3128', 'expires': 'Wed, 29 Aug 2012 02:04:24 GMT', 'vary': 'Authorization,Accept-Encoding', '-content-encoding': 'gzip', 'server': 'Apache/2.2.22 (Ubuntu)', 'last-modified': 'Wed, 29 Aug 2012 02:04:24 GMT', 'etag': '"7e287fc885d9fdcf42da3a12f38572c1"', 'strict-transport-security': 'max-age=2592000', 'cache-control': 'max-age=0', 'date': 'Wed, 29 Aug 2012 02:04:24 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'OAuth realm="SoftwareCenter Agent"'}
> '
>
> ========...

Read more...

3128. By Michael Vogt

add some skip() decorators, refactor to move the Mock test into its own test case and simply it as it does not really need all the complex loop magic

Revision history for this message
Michael Vogt (mvo) wrote :

I added a bunch of skip() decorators now and also moved the mocked version into its own TestCase.

review: Needs Resubmitting
Revision history for this message
Gary Lasker (gary-lasker) wrote :

Thanks Michael, all good now!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'softwarecenter/backend/recagent.py'
2--- softwarecenter/backend/recagent.py 2012-08-28 18:14:50 +0000
3+++ softwarecenter/backend/recagent.py 2012-08-29 14:48:17 +0000
4@@ -24,7 +24,7 @@
5 import hashlib
6
7 import softwarecenter.paths
8-from spawn_helper import SpawnHelper
9+from .spawn_helper import SpawnHelper
10
11 from softwarecenter.config import get_config
12 from softwarecenter.db.utils import get_installed_apps_list
13
14=== modified file 'tests/test_recagent.py'
15--- tests/test_recagent.py 2012-06-11 14:50:53 +0000
16+++ tests/test_recagent.py 2012-08-29 14:48:17 +0000
17@@ -10,12 +10,30 @@
18 )
19 setup_test_env()
20
21+import softwarecenter
22 from softwarecenter.backend.recagent import RecommenderAgent
23
24
25-class TestRecommenderAgent(unittest.TestCase):
26+class MockTestRecommenderAgent(unittest.TestCase):
27+
28+ @patch.object(softwarecenter.backend.recagent.SpawnHelper,
29+ 'run_generic_piston_helper')
30+ def test_mocked_recagent_post_submit_profile(self, mock_spawn_helper_run):
31+ recommender_agent = RecommenderAgent()
32+ recommender_agent._calc_profile_id = lambda profile: "i-am-random"
33+ db = get_test_db()
34+ recommender_agent.post_submit_profile(db)
35+ args, kwargs = mock_spawn_helper_run.call_args
36+ # ensure we have packages in the package list and the
37+ # kwargs have the names we expect
38+ self.assertNotEqual(kwargs['data'][0]['package_list'], [])
39+
40+
41+class RealTestRecommenderAgent(unittest.TestCase):
42 """ tests the recommender agent """
43-
44+
45+ @unittest.skipIf(os.getuid() == 0,
46+ "this is not supported running as root")
47 def setUp(self):
48 self.loop = GObject.MainLoop(GObject.main_context_default())
49 self.error = False
50@@ -27,117 +45,78 @@
51 self.addCleanup(os.environ.pop, "SOFTWARE_CENTER_RECOMMENDER_HOST")
52 server = "https://rec.staging.ubuntu.com"
53 os.environ["SOFTWARE_CENTER_RECOMMENDER_HOST"] = server
54-
55- @patch('softwarecenter.backend.recagent.SpawnHelper'
56- '.run_generic_piston_helper')
57- def test_mocked_recagent_post_submit_profile(self, mock_spawn_helper_run):
58- def _patched_on_submit_profile_data(*args, **kwargs):
59- piston_submit_profile = {}
60- recommender_agent.emit("submit-profile-finished",
61- piston_submit_profile)
62- mock_spawn_helper_run.side_effect = _patched_on_submit_profile_data
63- recommender_agent = RecommenderAgent()
64- recommender_agent.connect("submit-profile-finished", self.on_query_done)
65- recommender_agent.connect("error", self.on_query_error)
66- recommender_agent._calc_profile_id = lambda profile: "i-am-random"
67- db = get_test_db()
68- recommender_agent.post_submit_profile(db)
69- self.assertFalse(self.error)
70- args, kwargs = mock_spawn_helper_run.call_args
71- self.assertNotEqual(kwargs['data'][0]['package_list'], [])
72+ # most tests need it
73+ self.recommender_agent = RecommenderAgent()
74+ self.recommender_agent.connect("error", self.on_query_error)
75
76 def on_query_done(self, recagent, data):
77- # print "query done, data: '%s'" % data
78+ #print "query done, data: '%s'" % data
79 self.loop.quit()
80+ self.error = False
81+ self.error_msg = ""
82
83 def on_query_error(self, recagent, error):
84- # print "query error received: ", error
85+ #print "query error received: ", error
86 self.loop.quit()
87 self.error = True
88+ self.error_msg = error
89+
90+ def assertServerReturnsWithNoError(self):
91+ self.loop.run()
92+ self.assertFalse(self.error, "got error: '%s'" % self.error_msg)
93
94 def test_recagent_query_server_status(self):
95- # NOTE: This requires a working recommender host that is reachable
96- recommender_agent = RecommenderAgent()
97- recommender_agent.connect("server-status", self.on_query_done)
98- recommender_agent.connect("error", self.on_query_error)
99- recommender_agent.query_server_status()
100- self.loop.run()
101- self.assertFalse(self.error)
102+ self.recommender_agent.connect("server-status", self.on_query_done)
103+ self.recommender_agent.query_server_status()
104+ self.assertServerReturnsWithNoError()
105
106- # FIXME: disabled for now as the server is not quite working
107- def disabled_test_recagent_post_submit_profile(self):
108+ @unittest.skip("server returns 401")
109+ def test_recagent_post_submit_profile(self):
110 # NOTE: This requires a working recommender host that is reachable
111- recommender_agent = RecommenderAgent()
112- recommender_agent.connect("submit-profile-finished", self.on_query_done)
113- recommender_agent.connect("error", self.on_query_error)
114 db = get_test_db()
115- recommender_agent.post_submit_profile(db)
116- self.loop.run()
117- self.assertFalse(self.error)
118+ self.recommender_agent.connect(
119+ "submit-profile-finished", self.on_query_done)
120+ self.recommender_agent.post_submit_profile(db)
121+ self.assertServerReturnsWithNoError()
122 #print mock_request._post
123-
124- # NOTE: this server call is currently not needed and not used
125-# def disabled_test_recagent_query_submit_anon_profile(self):
126-# # NOTE: This requires a working recommender host that is reachable
127-# recommender_agent = RecommenderAgent()
128-# recommender_agent.connect("submit-anon-profile", self.on_query_done)
129-# recommender_agent.connect("error", self.on_query_error)
130-# recommender_agent.query_submit_anon_profile(
131-# uuid=recommender_uuid,
132-# installed_packages=["pitivi", "fretsonfire"],
133-# extra="")
134-# self.loop.run()
135-# self.assertFalse(self.error)
136-
137- # FIXME: disabled for now as the server is not quite working
138- def disabled_test_recagent_query_profile(self):
139- # NOTE: This requires a working recommender host that is reachable
140- recommender_agent = RecommenderAgent()
141- recommender_agent.connect("profile", self.on_query_done)
142- recommender_agent.connect("error", self.on_query_error)
143- recommender_agent.query_profile(pkgnames=["pitivi", "fretsonfire"])
144- self.loop.run()
145- self.assertFalse(self.error)
146-
147- # FIXME: disabled for now as the server is not quite working
148- def disabled_test_recagent_query_recommend_me(self):
149- # NOTE: This requires a working recommender host that is reachable
150- recommender_agent = RecommenderAgent()
151- recommender_agent.connect("recommend-me", self.on_query_done)
152- recommender_agent.connect("error", self.on_query_error)
153- recommender_agent.query_recommend_me()
154- self.loop.run()
155- self.assertFalse(self.error)
156+
157+ @unittest.skip("server returns 401")
158+ def test_recagent_query_submit_anon_profile(self):
159+ self.recommender_agent.connect(
160+ "submit-anon-profile-finished", self.on_query_done)
161+ self.recommender_agent.post_submit_anon_profile(
162+ uuid="xxxyyyzzz",
163+ installed_packages=["pitivi", "fretsonfire"],
164+ extra="")
165+ self.assertServerReturnsWithNoError()
166+
167+ @unittest.skip("server returns 401")
168+ def test_recagent_query_profile(self):
169+ self.recommender_agent.connect("profile", self.on_query_done)
170+ self.recommender_agent.query_profile(pkgnames=["pitivi", "fretsonfire"])
171+ self.assertServerReturnsWithNoError()
172+
173+ @unittest.skip("server returns 401")
174+ def test_recagent_query_recommend_me(self):
175+ self.recommender_agent.connect("recommend-me", self.on_query_done)
176+ self.recommender_agent.query_recommend_me()
177+ self.assertServerReturnsWithNoError()
178
179 def test_recagent_query_recommend_app(self):
180- # NOTE: This requires a working recommender host that is reachable
181- recommender_agent = RecommenderAgent()
182- recommender_agent.connect("recommend-app", self.on_query_done)
183- recommender_agent.connect("error", self.on_query_error)
184- recommender_agent.query_recommend_app("pitivi")
185- self.loop.run()
186- self.assertFalse(self.error)
187+ self.recommender_agent.connect("recommend-app", self.on_query_done)
188+ self.recommender_agent.query_recommend_app("pitivi")
189+ self.assertServerReturnsWithNoError()
190
191- # disabled for now (2012-03-20) as the server is returning 504
192- def disabled_test_recagent_query_recommend_all_apps(self):
193- # NOTE: This requires a working recommender host that is reachable
194- recommender_agent = RecommenderAgent()
195- recommender_agent.connect("recommend-all-apps", self.on_query_done)
196- recommender_agent.connect("error", self.on_query_error)
197- recommender_agent.query_recommend_all_apps()
198- self.loop.run()
199- self.assertFalse(self.error)
200+ def test_recagent_query_recommend_all_apps(self):
201+ self.recommender_agent.connect("recommend-all-apps", self.on_query_done)
202+ self.recommender_agent.query_recommend_all_apps()
203+ self.assertServerReturnsWithNoError()
204
205 def test_recagent_query_recommend_top(self):
206- # NOTE: This requires a working recommender host that is reachable
207- recommender_agent = RecommenderAgent()
208- recommender_agent.connect("recommend-top", self.on_query_done)
209- recommender_agent.connect("error", self.on_query_error)
210- recommender_agent.query_recommend_top()
211- self.loop.run()
212- self.assertFalse(self.error)
213+ self.recommender_agent.connect("recommend-top", self.on_query_done)
214+ self.recommender_agent.query_recommend_top()
215+ self.assertServerReturnsWithNoError()
216
217- @unittest.skip('Disabled, should be re-enabled ASAP')
218 def test_recagent_query_error(self):
219 # NOTE: This tests the error condition itself! it simply forces an error
220 # 'cuz there definitely isn't a server here :)
221@@ -150,5 +129,8 @@
222 self.loop.run()
223 self.assertTrue(self.error)
224
225+
226 if __name__ == "__main__":
227+ #import logging
228+ #logging.basicConfig(level=logging.DEBUG)
229 unittest.main()

Subscribers

People subscribed via source and target branches