Merge lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing into lp:stock-ticker-mobile-app
- mock-server-for-testing
- Merge into trunk
Status: | Rejected |
---|---|
Rejected by: | Nicholas Skaggs |
Proposed branch: | lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing |
Merge into: | lp:stock-ticker-mobile-app |
Prerequisite: | lp:~veebers/stock-ticker-mobile-app/porting-autopilot-1.4 |
Diff against target: |
313 lines (+196/-14) 4 files modified
Add_Stocks_page.qml (+2/-2) Stock_Ticker.qml (+31/-4) tests/autopilot/stock_ticker/mock_data_server.py (+144/-0) tests/autopilot/stock_ticker/tests/__init__.py (+19/-8) |
To merge this branch: | bzr merge lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
David Planella | Disapprove | ||
Nicholas Skaggs | Pending | ||
Review via email: mp+194971@code.launchpad.net |
This proposal supersedes a proposal from 2013-11-13.
Commit message
Description of the change
Introduce a mock http server for use in testing (no need to hit external network).
Modify application so that it can take a data source url as an argument (enabling use of the mock server).
Nicholas Skaggs (nskaggs) wrote : | # |
Robert Steckroth (robertsteckroth) wrote : | # |
I would need to take time off of work to do it. I almost had 3 days this
week, but... I should be available sooner than later.
I do not know how functional the mock server will be in development either.
The unit tests should not rely on application code. The application
run-time functions which switch the server url should be removed and a url
set in the autopilot.
Other than that, it will be difficult to get the merge through at its
current state.
On Mon, Dec 2, 2013 at 3:36 PM, Nicholas Skaggs <
<email address hidden>> wrote:
> Veebers, any feedback from the developers?
> --
>
> https:/
> Your team Stock Ticker Developers is requested to review the proposed
> merge of lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing into
> lp:stock-ticker-mobile-app.
>
--
<surgemcgee> Systems/Software Engineer
Nicholas Skaggs (nskaggs) wrote : | # |
Robert, any chance to further this? Sounds like you want to change how dataServerUrl is set?
Robert Steckroth (robertsteckroth) wrote : | # |
I do have some extra time this week, hmm..
On Wed, Jan 22, 2014 at 5:01 PM, Nicholas Skaggs <
<email address hidden>> wrote:
> Robert, any chance to further this? Sounds like you want to change how
> dataServerUrl is set?
> --
>
> https:/
> Your team Stock Ticker Developers is requested to review the proposed
> merge of lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing into
> lp:stock-ticker-mobile-app.
>
--
<surgemcgee>
Alan Pope πΊπ§π± π¦ (popey) wrote : | # |
This has been idle for some months now. Is it still relevant and will it be reviewed at soon?
It's one of our oldest merge requests.
Nicholas Skaggs (nskaggs) wrote : | # |
It's contingent on what is happening from an application development standpoint. If the app is going to be changed, as suggested by Robert, the tests just need small tweaks to work. If it merges now, there's some qml changes that might not be in agreement with that.
Robert Steckroth (robertsteckroth) wrote : | # |
That changeset was too ambitious. Also, I personally do not like the
offline unit testing setup. I will be adding Indurate database 1.3 support
soon and do not plan on incorporating that branch.
It is unfortunate however, as the python work was very professional.
On Wed, Apr 30, 2014 at 3:28 PM, Nicholas Skaggs <
<email address hidden>> wrote:
> It's contingent on what is happening from an application development
> standpoint. If the app is going to be changed, as suggested by Robert, the
> tests just need small tweaks to work. If it merges now, there's some qml
> changes that might not be in agreement with that.
> --
>
> https:/
> Your team Stock Ticker Developers is requested to review the proposed
> merge of lp:~veebers/stock-ticker-mobile-app/mock-server-for-testing into
> lp:stock-ticker-mobile-app.
>
--
<surgemcgee>
David Planella (dpm) wrote : | # |
From the last comments, my recommendation would then be to mark the branch as Rejected. Christopher, please accept our apologies for the unresponsiveness on this branch. Feel free to reach out to me ('dpm'), popey or balloons on IRC for any questions.
Nicholas Skaggs (nskaggs) wrote : | # |
I've rejected the merge, but think the code in mock_data_server.py is very useful as a reference.
Unmerged revisions
- 76. By Christopher Lee
-
Initial server working
- 75. By Christopher Lee
-
Further additions to assist in mocking server.
- 74. By Christopher Lee
-
Enable being able to use a different datasource.
Preview Diff
1 | === modified file 'Add_Stocks_page.qml' | |||
2 | --- Add_Stocks_page.qml 2013-08-28 03:15:07 +0000 | |||
3 | +++ Add_Stocks_page.qml 2013-11-13 02:26:42 +0000 | |||
4 | @@ -27,6 +27,7 @@ | |||
5 | 27 | property string active_search_tick: "" | 27 | property string active_search_tick: "" |
6 | 28 | property string before_after_space: "00" | 28 | property string before_after_space: "00" |
7 | 29 | // This is used as two varibles > 0 is for has space at begining of line in `function update_search_text` | 29 | // This is used as two varibles > 0 is for has space at begining of line in `function update_search_text` |
8 | 30 | property string dataServerUrl: "http://d.yimg.com/autoc.finance.yahoo.com/" // Can be overwritten for testing. | ||
9 | 30 | 31 | ||
10 | 31 | Timer { | 32 | Timer { |
11 | 32 | id: reloadTrigger | 33 | id: reloadTrigger |
12 | @@ -55,7 +56,6 @@ | |||
13 | 55 | 56 | ||
14 | 56 | function text_change_handler() { | 57 | function text_change_handler() { |
15 | 57 | log("text_change_handler()") | 58 | log("text_change_handler()") |
16 | 58 | |||
17 | 59 | // Find the current word the user is editing by spaces before and after current word at cursor | 59 | // Find the current word the user is editing by spaces before and after current word at cursor |
18 | 60 | var cursor_to_end = addStockTextField.text.substr(addStockTextField.cursorPosition).split(' ') | 60 | var cursor_to_end = addStockTextField.text.substr(addStockTextField.cursorPosition).split(' ') |
19 | 61 | var cursor_to_begining = addStockTextField.text.substr(0, addStockTextField.cursorPosition+cursor_to_end[0].length).split(' ') | 61 | var cursor_to_begining = addStockTextField.text.substr(0, addStockTextField.cursorPosition+cursor_to_end[0].length).split(' ') |
20 | @@ -73,7 +73,7 @@ | |||
21 | 73 | matchIndicator = true | 73 | matchIndicator = true |
22 | 74 | active_search_tick = search_word | 74 | active_search_tick = search_word |
23 | 75 | before_after_space = before_after | 75 | before_after_space = before_after |
25 | 76 | xhr.open("GET","http://d.yimg.com/autoc.finance.yahoo.com/autoc?query="+search_word+"&callback=YAHOO.Finance.SymbolSuggest.ssCallback", true); | 76 | xhr.open("GET", dataServerUrl + "autoc?query="+search_word+"&callback=YAHOO.Finance.SymbolSuggest.ssCallback", true); |
26 | 77 | xhr.onreadystatechange = function() | 77 | xhr.onreadystatechange = function() |
27 | 78 | { | 78 | { |
28 | 79 | if ( xhr.readyState == xhr.DONE) { | 79 | if ( xhr.readyState == xhr.DONE) { |
29 | 80 | 80 | ||
30 | === modified file 'Stock_Ticker.qml' | |||
31 | --- Stock_Ticker.qml 2013-10-09 20:13:18 +0000 | |||
32 | +++ Stock_Ticker.qml 2013-11-13 02:26:42 +0000 | |||
33 | @@ -24,6 +24,17 @@ | |||
34 | 24 | 24 | ||
35 | 25 | 25 | ||
36 | 26 | MainView { | 26 | MainView { |
37 | 27 | Arguments { | ||
38 | 28 | id: args | ||
39 | 29 | |||
40 | 30 | Argument { | ||
41 | 31 | name: "dataserver" | ||
42 | 32 | help: "Server to use for retrieving data (Useful for testing.)" | ||
43 | 33 | required: false | ||
44 | 34 | valueNames: ["URL"] | ||
45 | 35 | } | ||
46 | 36 | } | ||
47 | 37 | |||
48 | 27 | // objectName for functional testing purposes (autopilot-qt5) | 38 | // objectName for functional testing purposes (autopilot-qt5) |
49 | 28 | objectName: "stockTicker" | 39 | objectName: "stockTicker" |
50 | 29 | applicationName: "com.ubuntu.stock-ticker-mobile" | 40 | applicationName: "com.ubuntu.stock-ticker-mobile" |
51 | @@ -47,13 +58,26 @@ | |||
52 | 47 | 58 | ||
53 | 48 | property int dummyTextWidth // Holds the width of the percent sign in Stock_Component_Main | 59 | property int dummyTextWidth // Holds the width of the percent sign in Stock_Component_Main |
54 | 49 | 60 | ||
57 | 50 | property string serverDomain: "http://www.surgemcgee.com:8080/" | 61 | property string serverDomain: get_data_server() ? get_data_server() : "http://www.surgemcgee.com:8080/" |
58 | 51 | // property string serverDomain: "http://localhost:8080/" | 62 | property string dataServer: get_data_server() ? get_data_server() : "http://finance.yahoo.com/" |
59 | 52 | 63 | ||
60 | 53 | function log(message) { | 64 | function log(message) { |
61 | 54 | console.log("["+applicationName+"] "+message) | 65 | console.log("["+applicationName+"] "+message) |
62 | 55 | } | 66 | } |
63 | 56 | 67 | ||
64 | 68 | // If no dataserver argument passed returns undefined, otherwise returns a cleaned up URL. | ||
65 | 69 | function get_data_server() { | ||
66 | 70 | var server = args.values.dataserver; | ||
67 | 71 | if (server === undefined) | ||
68 | 72 | return undefined | ||
69 | 73 | if (server.substr(0, 7) !== "http://") | ||
70 | 74 | server = "http://" + server | ||
71 | 75 | if (server.slice(-1) !== "/") | ||
72 | 76 | server += "/" | ||
73 | 77 | |||
74 | 78 | return server | ||
75 | 79 | } | ||
76 | 80 | |||
77 | 57 | property string quoteParams: "?f=sabl1vpghojkc8dre7j1n&s=" | 81 | property string quoteParams: "?f=sabl1vpghojkc8dre7j1n&s=" |
78 | 58 | property var database: new Store.IndurateDatabase({name: "SockTickerMobile", version: "1.0", description: "The Stock Ticker core application database", size: 4}, LocalStorage) | 82 | property var database: new Store.IndurateDatabase({name: "SockTickerMobile", version: "1.0", description: "The Stock Ticker core application database", size: 4}, LocalStorage) |
79 | 59 | property var userTable: database.initTable(primaryTable, false, function(msg){ console.log(msg) }) | 83 | property var userTable: database.initTable(primaryTable, false, function(msg){ console.log(msg) }) |
80 | @@ -413,7 +437,7 @@ | |||
81 | 413 | 437 | ||
82 | 414 | XmlListModel { | 438 | XmlListModel { |
83 | 415 | id: newsFeed | 439 | id: newsFeed |
85 | 416 | source: "http://finance.yahoo.com/rss/headline?s="+chartTick | 440 | source: dataServer + "rss/headline?s=" +chartTick |
86 | 417 | query: "/rss/channel/item" | 441 | query: "/rss/channel/item" |
87 | 418 | XmlRole { name: "title"; query: "title/string()" } | 442 | XmlRole { name: "title"; query: "title/string()" } |
88 | 419 | XmlRole { name: "description"; query: "description/string()" } | 443 | XmlRole { name: "description"; query: "description/string()" } |
89 | @@ -672,7 +696,10 @@ | |||
90 | 672 | width: parent.width - 10 // Subtract the main program border amount here | 696 | width: parent.width - 10 // Subtract the main program border amount here |
91 | 673 | height: parent.height | 697 | height: parent.height |
92 | 674 | anchors.horizontalCenter: parent.horizontalCenter | 698 | anchors.horizontalCenter: parent.horizontalCenter |
94 | 675 | Add_Stocks_page { id: addStocksTab } | 699 | Add_Stocks_page { |
95 | 700 | id: addStocksTab | ||
96 | 701 | dataServerUrl: get_data_server() ? get_data_server() : Add_Stocks_page.dataServerUrl | ||
97 | 702 | } | ||
98 | 676 | } | 703 | } |
99 | 677 | } | 704 | } |
100 | 678 | } | 705 | } |
101 | 679 | 706 | ||
102 | === added file 'tests/autopilot/stock_ticker/mock_data_server.py' | |||
103 | --- tests/autopilot/stock_ticker/mock_data_server.py 1970-01-01 00:00:00 +0000 | |||
104 | +++ tests/autopilot/stock_ticker/mock_data_server.py 2013-11-13 02:26:42 +0000 | |||
105 | @@ -0,0 +1,144 @@ | |||
106 | 1 | # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- | ||
107 | 2 | # | ||
108 | 3 | # Copyright (C) 2013 Canonical Ltd | ||
109 | 4 | # | ||
110 | 5 | # This program is free software: you can redistribute it and/or modify | ||
111 | 6 | # it under the terms of the GNU General Public License version 3 as | ||
112 | 7 | # published by the Free Software Foundation. | ||
113 | 8 | # | ||
114 | 9 | # This program is distributed in the hope that it will be useful, | ||
115 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
116 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
117 | 12 | # GNU General Public License for more details. | ||
118 | 13 | # | ||
119 | 14 | # You should have received a copy of the GNU General Public License | ||
120 | 15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
121 | 16 | |||
122 | 17 | import BaseHTTPServer | ||
123 | 18 | import errno | ||
124 | 19 | import os | ||
125 | 20 | import socket | ||
126 | 21 | import threading | ||
127 | 22 | from textwrap import dedent | ||
128 | 23 | import re | ||
129 | 24 | |||
130 | 25 | |||
131 | 26 | class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): | ||
132 | 27 | """Simple HTTP request handler that mocks data and requests for testing.""" | ||
133 | 28 | |||
134 | 29 | def _send_xml(self, xml): | ||
135 | 30 | self.send_response(200) | ||
136 | 31 | self.send_header("Content-Type", "application/xml") | ||
137 | 32 | self.end_headers() | ||
138 | 33 | self.wfile.write( | ||
139 | 34 | '<?xml version="1.0" encoding="UTF-8"?>{content}'.format( | ||
140 | 35 | content=xml | ||
141 | 36 | ) | ||
142 | 37 | ) | ||
143 | 38 | |||
144 | 39 | def _send_json(self, json): | ||
145 | 40 | self.send_response(200) | ||
146 | 41 | self.send_header( | ||
147 | 42 | "Content-Type", | ||
148 | 43 | "application/x-javascript; charset=utf-8" | ||
149 | 44 | ) | ||
150 | 45 | self.end_headers() | ||
151 | 46 | self.wfile.write(json) | ||
152 | 47 | |||
153 | 48 | def send_stock_data(self): | ||
154 | 49 | match_check = re.compile("\&s=[\+]+goo") | ||
155 | 50 | if match_check.search(self.path) is not None: | ||
156 | 51 | google_stock_data = dedent( | ||
157 | 52 | '<stockInfo>' | ||
158 | 53 | '<currentStats stkent0="GOOG" ' | ||
159 | 54 | 'stkent1="1040.66" stkent2="1009.50" stkent3="1010.59" ' | ||
160 | 55 | 'stkent4="1112778" stkent5="1016.03" stkent6="1008.00" ' | ||
161 | 56 | 'stkent7="1015.93" stkent8="1009.51" stkent9="636.00" ' | ||
162 | 57 | 'stkent10="1041.52" stkent11="N/A - N/A" stkent12="0.00" ' | ||
163 | 58 | 'stkent13="27.65" stkent14="44.06" stkent15="337.6B" ' | ||
164 | 59 | 'stkent16="Google Inc."/>' | ||
165 | 60 | '</stockInfo>' | ||
166 | 61 | ) | ||
167 | 62 | self._send_xml(google_stock_data) | ||
168 | 63 | else: | ||
169 | 64 | self._send_xml('<stockInfo></stockInfo>') | ||
170 | 65 | |||
171 | 66 | def send_autocomplete_data(self): | ||
172 | 67 | """Build up a response for the autocomplete. | ||
173 | 68 | |||
174 | 69 | Pad-out the wanted data with dummy data | ||
175 | 70 | |||
176 | 71 | """ | ||
177 | 72 | google_result = dedent( | ||
178 | 73 | '{"symbol":"GOOG","name": "Google Inc.","exch": "NMS","type": "S",' | ||
179 | 74 | '"exchDisp":"NASDAQ","typeDisp":"Equity"}' | ||
180 | 75 | ) | ||
181 | 76 | dummy_result = dedent( | ||
182 | 77 | '{"symbol":"DUMM","name": "Dummy Inc.","exch": "NMS","type": "S",' | ||
183 | 78 | '"exchDisp":"NASDAQ","typeDisp":"Equity"}' | ||
184 | 79 | ) | ||
185 | 80 | result_list = "{google},{dummies}".format( | ||
186 | 81 | google=google_result, | ||
187 | 82 | dummies=",".join([dummy_result for x in range(9)]) | ||
188 | 83 | ) | ||
189 | 84 | json = dedent( | ||
190 | 85 | 'YAHOO.Finance.SymbolSuggest.ssCallback(' | ||
191 | 86 | '{"ResultSet":{"Query":"goo","Result":' | ||
192 | 87 | '[' | ||
193 | 88 | '%s' | ||
194 | 89 | ']}})' | ||
195 | 90 | % result_list | ||
196 | 91 | ) | ||
197 | 92 | self._send_json(json) | ||
198 | 93 | |||
199 | 94 | def do_GET(self): | ||
200 | 95 | try: | ||
201 | 96 | if self.path.startswith("/?f"): | ||
202 | 97 | self.send_stock_data() | ||
203 | 98 | elif self.path.startswith("/rss/2.0/headline"): | ||
204 | 99 | self._send_xml('<rss version="2.0"><channel/></rss>') | ||
205 | 100 | elif self.path.startswith("/autoc"): | ||
206 | 101 | self.send_autocomplete_data() | ||
207 | 102 | else: | ||
208 | 103 | self.send_response(200) | ||
209 | 104 | self.end_headers() | ||
210 | 105 | self.wfile.write("[[[[ UNKNOWN ]]]]") | ||
211 | 106 | except IOError as e: | ||
212 | 107 | pass | ||
213 | 108 | |||
214 | 109 | class HTTPServerInAThread(threading.Thread): | ||
215 | 110 | """Simple custom HTTP server run in a separate thread.""" | ||
216 | 111 | |||
217 | 112 | def __init__(self): | ||
218 | 113 | super(HTTPServerInAThread, self).__init__() | ||
219 | 114 | port = 12345 | ||
220 | 115 | self.server = None | ||
221 | 116 | while self.server is None: | ||
222 | 117 | try: | ||
223 | 118 | self.server = BaseHTTPServer.HTTPServer( | ||
224 | 119 | ("", port), | ||
225 | 120 | HTTPRequestHandler | ||
226 | 121 | ) | ||
227 | 122 | except socket.error as error: | ||
228 | 123 | if (error.errno == errno.EADDRINUSE): | ||
229 | 124 | print "Port %d is already in use" % port | ||
230 | 125 | port += 1 | ||
231 | 126 | else: | ||
232 | 127 | print os.strerror(error.errno) | ||
233 | 128 | raise | ||
234 | 129 | self.server.allow_reuse_address = True | ||
235 | 130 | |||
236 | 131 | @property | ||
237 | 132 | def port(self): | ||
238 | 133 | return self.server.server_port | ||
239 | 134 | |||
240 | 135 | def run(self): | ||
241 | 136 | print "now serving on port %d" % self.port | ||
242 | 137 | self.server.serve_forever() | ||
243 | 138 | |||
244 | 139 | def shutdown(self): | ||
245 | 140 | self.server.shutdown() | ||
246 | 141 | self.server.server_close() | ||
247 | 142 | |||
248 | 143 | |||
249 | 144 | __all__ = ["HTTPServerInAThread"] | ||
250 | 0 | 145 | ||
251 | === modified file 'tests/autopilot/stock_ticker/tests/__init__.py' | |||
252 | --- tests/autopilot/stock_ticker/tests/__init__.py 2013-11-13 02:26:41 +0000 | |||
253 | +++ tests/autopilot/stock_ticker/tests/__init__.py 2013-11-13 02:26:42 +0000 | |||
254 | @@ -26,7 +26,7 @@ | |||
255 | 26 | from autopilot.testcase import AutopilotTestCase | 26 | from autopilot.testcase import AutopilotTestCase |
256 | 27 | 27 | ||
257 | 28 | from ubuntuuitoolkit import emulators as toolkit_emulators | 28 | from ubuntuuitoolkit import emulators as toolkit_emulators |
259 | 29 | from stock_ticker import emulators | 29 | from stock_ticker import emulators, mock_data_server |
260 | 30 | 30 | ||
261 | 31 | logger = logging.getLogger(__name__) | 31 | logger = logging.getLogger(__name__) |
262 | 32 | 32 | ||
263 | @@ -54,32 +54,43 @@ | |||
264 | 54 | self.temp_move_sqlite_db() | 54 | self.temp_move_sqlite_db() |
265 | 55 | self.addCleanup(self.restore_sqlite_db) | 55 | self.addCleanup(self.restore_sqlite_db) |
266 | 56 | 56 | ||
267 | 57 | self.server = mock_data_server.HTTPServerInAThread() | ||
268 | 58 | self.server.start() | ||
269 | 59 | self.addCleanup(self.server.shutdown) | ||
270 | 60 | |||
271 | 61 | url = self._get_data_server_url() | ||
272 | 57 | if os.path.exists(self.local_location): | 62 | if os.path.exists(self.local_location): |
274 | 58 | self.launch_test_local() | 63 | self.launch_test_local(url) |
275 | 59 | elif os.path.exists(self.installed_location): | 64 | elif os.path.exists(self.installed_location): |
277 | 60 | self.launch_test_installed() | 65 | self.launch_test_installed(url) |
278 | 61 | else: | 66 | else: |
282 | 62 | self.launch_test_click() | 67 | self.launch_test_click(url) |
283 | 63 | 68 | ||
284 | 64 | def launch_test_local(self): | 69 | def _get_data_server_url(self): |
285 | 70 | return "http://localhost:%s" % self.server.port | ||
286 | 71 | |||
287 | 72 | def launch_test_local(self, server_url): | ||
288 | 65 | self.app = self.launch_test_application( | 73 | self.app = self.launch_test_application( |
289 | 66 | "qmlscene", | 74 | "qmlscene", |
290 | 67 | self.local_location, | 75 | self.local_location, |
291 | 76 | "--dataserver=%s" % server_url, | ||
292 | 68 | app_type='qt', | 77 | app_type='qt', |
293 | 69 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) | 78 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) |
294 | 70 | 79 | ||
296 | 71 | def launch_test_installed(self): | 80 | def launch_test_installed(self, server_url): |
297 | 72 | self.app = self.launch_test_application( | 81 | self.app = self.launch_test_application( |
298 | 73 | "qmlscene", | 82 | "qmlscene", |
299 | 74 | self.installed_location, | 83 | self.installed_location, |
300 | 75 | "--desktop_file_hint=/usr/share/applications/" | 84 | "--desktop_file_hint=/usr/share/applications/" |
301 | 76 | "stock-ticker-app.desktop", | 85 | "stock-ticker-app.desktop", |
302 | 86 | "--dataserver=%s" % server_url, | ||
303 | 77 | app_type='qt', | 87 | app_type='qt', |
304 | 78 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) | 88 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) |
305 | 79 | 89 | ||
307 | 80 | def launch_test_click(self): | 90 | def launch_test_click(self, server_url): |
308 | 81 | self.app = self.launch_click_package( | 91 | self.app = self.launch_click_package( |
309 | 82 | "com.ubuntu.stock-ticker-mobile", | 92 | "com.ubuntu.stock-ticker-mobile", |
310 | 93 | "--dataserver=%s" % server_url, | ||
311 | 83 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) | 94 | emulator_base=toolkit_emulators.UbuntuUIToolkitEmulatorBase) |
312 | 84 | 95 | ||
313 | 85 | def temp_move_sqlite_db(self): | 96 | def temp_move_sqlite_db(self): |
Veebers, any feedback from the developers?