OLD | NEW |
1 # Copyright (C) 2010 Google Inc. All rights reserved. | 1 # Copyright (C) 2010 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 PARAM_MASTER = "master" | 44 PARAM_MASTER = "master" |
45 PARAM_BUILDER = "builder" | 45 PARAM_BUILDER = "builder" |
46 PARAM_BUILD_NUMBER = "buildnumber" | 46 PARAM_BUILD_NUMBER = "buildnumber" |
47 PARAM_DIR = "dir" | 47 PARAM_DIR = "dir" |
48 PARAM_FILE = "file" | 48 PARAM_FILE = "file" |
49 PARAM_NAME = "name" | 49 PARAM_NAME = "name" |
50 PARAM_BEFORE = "before" | 50 PARAM_BEFORE = "before" |
51 PARAM_NUM_FILES = "numfiles" | 51 PARAM_NUM_FILES = "numfiles" |
52 PARAM_KEY = "key" | 52 PARAM_KEY = "key" |
53 PARAM_TEST_TYPE = "testtype" | 53 PARAM_TEST_TYPE = "testtype" |
| 54 PARAM_TEST_LIST_JSON = "testlistjson" |
54 PARAM_CALLBACK = "callback" | 55 PARAM_CALLBACK = "callback" |
55 | 56 |
56 | 57 |
57 def _replace_jsonp_callback(json, callback_name): | 58 def _replace_jsonp_callback(json, callback_name): |
58 if callback_name and re.search(r"^[A-Za-z0-9_]+$", callback_name): | 59 if callback_name and re.search(r"^[A-Za-z0-9_]+$", callback_name): |
59 if re.search(r"^[A-Za-z0-9_]+[(]", json): | 60 if re.search(r"^[A-Za-z0-9_]+[(]", json): |
60 return re.sub(r"^[A-Za-z0-9_]+[(]", callback_name + "(", json) | 61 return re.sub(r"^[A-Za-z0-9_]+[(]", callback_name + "(", json) |
61 return callback_name + "(" + json + ")" | 62 return callback_name + "(" + json + ")" |
62 | 63 |
63 return json | 64 return json |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 def _get_file_content_from_key(self, key): | 148 def _get_file_content_from_key(self, key): |
148 file = db.get(key) | 149 file = db.get(key) |
149 | 150 |
150 if not file: | 151 if not file: |
151 logging.info("File not found, key %s.", key) | 152 logging.info("File not found, key %s.", key) |
152 return None | 153 return None |
153 | 154 |
154 file.load_data() | 155 file.load_data() |
155 return file.data, file.date | 156 return file.data, file.date |
156 | 157 |
| 158 def _get_test_list_json(self, master, builder, test_type, build_number): |
| 159 """Return json file with test name list only, do not include test |
| 160 results and other non-test-data . |
| 161 |
| 162 Args: |
| 163 builder: builder name. |
| 164 test_type: type of test results. |
| 165 """ |
| 166 |
| 167 json, date = self._get_file_content(master, builder, test_type, build_nu
mber, "results.json") |
| 168 if not json: |
| 169 return None |
| 170 |
| 171 return JsonResults.get_test_list(builder, json), date |
| 172 |
157 def _serve_json(self, json, modified_date): | 173 def _serve_json(self, json, modified_date): |
158 if json: | 174 if json: |
159 if "If-Modified-Since" in self.request.headers: | 175 if "If-Modified-Since" in self.request.headers: |
160 old_date = self.request.headers["If-Modified-Since"] | 176 old_date = self.request.headers["If-Modified-Since"] |
161 if time.strptime(old_date, '%a, %d %b %Y %H:%M:%S %Z') == modifi
ed_date.utctimetuple(): | 177 if time.strptime(old_date, '%a, %d %b %Y %H:%M:%S %Z') == modifi
ed_date.utctimetuple(): |
162 self.response.set_status(304) | 178 self.response.set_status(304) |
163 return | 179 return |
164 | 180 |
165 # The appengine datetime objects are naive, so they lack a timezone. | 181 # The appengine datetime objects are naive, so they lack a timezone. |
166 # In practice, appengine seems to use GMT. | 182 # In practice, appengine seems to use GMT. |
167 self.response.headers["Last-Modified"] = modified_date.strftime('%a,
%d %b %Y %H:%M:%S') + ' GMT' | 183 self.response.headers["Last-Modified"] = modified_date.strftime('%a,
%d %b %Y %H:%M:%S') + ' GMT' |
168 self.response.headers["Content-Type"] = "application/json" | 184 self.response.headers["Content-Type"] = "application/json" |
169 self.response.headers["Access-Control-Allow-Origin"] = "*" | 185 self.response.headers["Access-Control-Allow-Origin"] = "*" |
170 self.response.out.write(json) | 186 self.response.out.write(json) |
171 else: | 187 else: |
172 self.error(404) | 188 self.error(404) |
173 | 189 |
174 def get(self): | 190 def get(self): |
175 key = self.request.get(PARAM_KEY) | 191 key = self.request.get(PARAM_KEY) |
176 master = self.request.get(PARAM_MASTER) | 192 master = self.request.get(PARAM_MASTER) |
177 builder = self.request.get(PARAM_BUILDER) | 193 builder = self.request.get(PARAM_BUILDER) |
178 test_type = self.request.get(PARAM_TEST_TYPE) | 194 test_type = self.request.get(PARAM_TEST_TYPE) |
179 build_number = self.request.get(PARAM_BUILD_NUMBER, default_value=None) | 195 build_number = self.request.get(PARAM_BUILD_NUMBER, default_value=None) |
180 name = self.request.get(PARAM_NAME) | 196 name = self.request.get(PARAM_NAME) |
181 before = self.request.get(PARAM_BEFORE) | 197 before = self.request.get(PARAM_BEFORE) |
182 num_files = self.request.get(PARAM_NUM_FILES) | 198 num_files = self.request.get(PARAM_NUM_FILES) |
| 199 test_list_json = self.request.get(PARAM_TEST_LIST_JSON) |
183 callback_name = self.request.get(PARAM_CALLBACK) | 200 callback_name = self.request.get(PARAM_CALLBACK) |
184 | 201 |
185 logging.debug( | 202 logging.debug( |
186 "Getting files, master %s, builder: %s, test_type: %s, build_number:
%s, name: %s, before: %s.", | 203 "Getting files, master %s, builder: %s, test_type: %s, build_number:
%s, name: %s, before: %s.", |
187 master, builder, test_type, build_number, name, before) | 204 master, builder, test_type, build_number, name, before) |
188 | 205 |
189 if key: | 206 if key: |
190 json, date = self._get_file_content_from_key(key) | 207 json, date = self._get_file_content_from_key(key) |
| 208 elif test_list_json: |
| 209 json, date = self._get_test_list_json(master, builder, test_type, bu
ild_number) |
191 elif num_files or not master or not builder or not test_type or (not bui
ld_number and not JsonResults.is_aggregate_file(name)) or not name: | 210 elif num_files or not master or not builder or not test_type or (not bui
ld_number and not JsonResults.is_aggregate_file(name)) or not name: |
192 limit = int(num_files) if num_files else 100 | 211 limit = int(num_files) if num_files else 100 |
193 self._get_file_list(master, builder, test_type, build_number, name,
before, limit, callback_name) | 212 self._get_file_list(master, builder, test_type, build_number, name,
before, limit, callback_name) |
194 return | 213 return |
195 else: | 214 else: |
196 # FIXME: Stop using the old master name style after all files have b
een updated. | 215 # FIXME: Stop using the old master name style after all files have b
een updated. |
197 master_data = master_config.getMaster(master) | 216 master_data = master_config.getMaster(master) |
198 if not master_data: | 217 if not master_data: |
199 master_data = master_config.getMasterByMasterName(master) | 218 master_data = master_config.getMasterByMasterName(master) |
200 if not master_data: | 219 if not master_data: |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 | 316 |
298 class UploadForm(webapp2.RequestHandler): | 317 class UploadForm(webapp2.RequestHandler): |
299 """Show a form so user can upload a file.""" | 318 """Show a form so user can upload a file.""" |
300 | 319 |
301 def get(self): | 320 def get(self): |
302 template_values = { | 321 template_values = { |
303 "upload_url": "/testfile/upload", | 322 "upload_url": "/testfile/upload", |
304 } | 323 } |
305 self.response.out.write(template.render("templates/uploadform.html", | 324 self.response.out.write(template.render("templates/uploadform.html", |
306 template_values)) | 325 template_values)) |
OLD | NEW |