| 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" | |
| 55 PARAM_CALLBACK = "callback" | 54 PARAM_CALLBACK = "callback" |
| 56 | 55 |
| 57 | 56 |
| 58 def _replace_jsonp_callback(json, callback_name): | 57 def _replace_jsonp_callback(json, callback_name): |
| 59 if callback_name and re.search(r"^[A-Za-z0-9_]+$", callback_name): | 58 if callback_name and re.search(r"^[A-Za-z0-9_]+$", callback_name): |
| 60 if re.search(r"^[A-Za-z0-9_]+[(]", json): | 59 if re.search(r"^[A-Za-z0-9_]+[(]", json): |
| 61 return re.sub(r"^[A-Za-z0-9_]+[(]", callback_name + "(", json) | 60 return re.sub(r"^[A-Za-z0-9_]+[(]", callback_name + "(", json) |
| 62 return callback_name + "(" + json + ")" | 61 return callback_name + "(" + json + ")" |
| 63 | 62 |
| 64 return json | 63 return json |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 def _get_file_content_from_key(self, key): | 147 def _get_file_content_from_key(self, key): |
| 149 file = db.get(key) | 148 file = db.get(key) |
| 150 | 149 |
| 151 if not file: | 150 if not file: |
| 152 logging.info("File not found, key %s.", key) | 151 logging.info("File not found, key %s.", key) |
| 153 return None | 152 return None |
| 154 | 153 |
| 155 file.load_data() | 154 file.load_data() |
| 156 return file.data, file.date | 155 return file.data, file.date |
| 157 | 156 |
| 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 | |
| 173 def _serve_json(self, json, modified_date): | 157 def _serve_json(self, json, modified_date): |
| 174 if json: | 158 if json: |
| 175 if "If-Modified-Since" in self.request.headers: | 159 if "If-Modified-Since" in self.request.headers: |
| 176 old_date = self.request.headers["If-Modified-Since"] | 160 old_date = self.request.headers["If-Modified-Since"] |
| 177 if time.strptime(old_date, '%a, %d %b %Y %H:%M:%S %Z') == modifi
ed_date.utctimetuple(): | 161 if time.strptime(old_date, '%a, %d %b %Y %H:%M:%S %Z') == modifi
ed_date.utctimetuple(): |
| 178 self.response.set_status(304) | 162 self.response.set_status(304) |
| 179 return | 163 return |
| 180 | 164 |
| 181 # The appengine datetime objects are naive, so they lack a timezone. | 165 # The appengine datetime objects are naive, so they lack a timezone. |
| 182 # In practice, appengine seems to use GMT. | 166 # In practice, appengine seems to use GMT. |
| 183 self.response.headers["Last-Modified"] = modified_date.strftime('%a,
%d %b %Y %H:%M:%S') + ' GMT' | 167 self.response.headers["Last-Modified"] = modified_date.strftime('%a,
%d %b %Y %H:%M:%S') + ' GMT' |
| 184 self.response.headers["Content-Type"] = "application/json" | 168 self.response.headers["Content-Type"] = "application/json" |
| 185 self.response.headers["Access-Control-Allow-Origin"] = "*" | 169 self.response.headers["Access-Control-Allow-Origin"] = "*" |
| 186 self.response.out.write(json) | 170 self.response.out.write(json) |
| 187 else: | 171 else: |
| 188 self.error(404) | 172 self.error(404) |
| 189 | 173 |
| 190 def get(self): | 174 def get(self): |
| 191 key = self.request.get(PARAM_KEY) | 175 key = self.request.get(PARAM_KEY) |
| 192 master = self.request.get(PARAM_MASTER) | 176 master = self.request.get(PARAM_MASTER) |
| 193 builder = self.request.get(PARAM_BUILDER) | 177 builder = self.request.get(PARAM_BUILDER) |
| 194 test_type = self.request.get(PARAM_TEST_TYPE) | 178 test_type = self.request.get(PARAM_TEST_TYPE) |
| 195 build_number = self.request.get(PARAM_BUILD_NUMBER, default_value=None) | 179 build_number = self.request.get(PARAM_BUILD_NUMBER, default_value=None) |
| 196 name = self.request.get(PARAM_NAME) | 180 name = self.request.get(PARAM_NAME) |
| 197 before = self.request.get(PARAM_BEFORE) | 181 before = self.request.get(PARAM_BEFORE) |
| 198 num_files = self.request.get(PARAM_NUM_FILES) | 182 num_files = self.request.get(PARAM_NUM_FILES) |
| 199 test_list_json = self.request.get(PARAM_TEST_LIST_JSON) | |
| 200 callback_name = self.request.get(PARAM_CALLBACK) | 183 callback_name = self.request.get(PARAM_CALLBACK) |
| 201 | 184 |
| 202 logging.debug( | 185 logging.debug( |
| 203 "Getting files, master %s, builder: %s, test_type: %s, build_number:
%s, name: %s, before: %s.", | 186 "Getting files, master %s, builder: %s, test_type: %s, build_number:
%s, name: %s, before: %s.", |
| 204 master, builder, test_type, build_number, name, before) | 187 master, builder, test_type, build_number, name, before) |
| 205 | 188 |
| 206 if key: | 189 if key: |
| 207 json, date = self._get_file_content_from_key(key) | 190 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) | |
| 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: | 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: |
| 211 limit = int(num_files) if num_files else 100 | 192 limit = int(num_files) if num_files else 100 |
| 212 self._get_file_list(master, builder, test_type, build_number, name,
before, limit, callback_name) | 193 self._get_file_list(master, builder, test_type, build_number, name,
before, limit, callback_name) |
| 213 return | 194 return |
| 214 else: | 195 else: |
| 215 # FIXME: Stop using the old master name style after all files have b
een updated. | 196 # FIXME: Stop using the old master name style after all files have b
een updated. |
| 216 master_data = master_config.getMaster(master) | 197 master_data = master_config.getMaster(master) |
| 217 if not master_data: | 198 if not master_data: |
| 218 master_data = master_config.getMasterByMasterName(master) | 199 master_data = master_config.getMasterByMasterName(master) |
| 219 if not master_data: | 200 if not master_data: |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 | 297 |
| 317 class UploadForm(webapp2.RequestHandler): | 298 class UploadForm(webapp2.RequestHandler): |
| 318 """Show a form so user can upload a file.""" | 299 """Show a form so user can upload a file.""" |
| 319 | 300 |
| 320 def get(self): | 301 def get(self): |
| 321 template_values = { | 302 template_values = { |
| 322 "upload_url": "/testfile/upload", | 303 "upload_url": "/testfile/upload", |
| 323 } | 304 } |
| 324 self.response.out.write(template.render("templates/uploadform.html", | 305 self.response.out.write(template.render("templates/uploadform.html", |
| 325 template_values)) | 306 template_values)) |
| OLD | NEW |