Branch data Line data Source code
1 [ + ]: 1 : /** 2 : 1 : * @module wpt-xhr 3 : 1 : * @desc The wpt-xhr test module. 4 : 1 : * @version 1.0.0 5 : 1 : * @author Essam A. El-Sherif 6 : 1 : */ 7 : 1 : 8 : 1 : /** Import test scripts */ 9 : 1 : import abort_event_order from './wpt/xhr/abort-event-order.js'; 10 : 1 : import data_uri from './wpt/xhr/data-uri.js'; 11 : 1 : import event_abort_any from './wpt/xhr/event-abort.any.js'; 12 : 1 : import event_error_order_sub from './wpt/xhr/event-error-order.sub.js'; 13 : 1 : import event_error_sub_any from './wpt/xhr/event-error.sub.any.js'; 14 : 1 : import event_load_any from './wpt/xhr/event-load.any.js'; 15 : 1 : import event_loadend_any from './wpt/xhr/event-loadend.any.js'; 16 : 1 : import event_loadstart_any from './wpt/xhr/event-loadstart.any.js'; 17 : 1 : import event_loadstart_upload_any from './wpt/xhr/event-loadstart-upload.any.js'; 18 : 1 : import event_progress_any from './wpt/xhr/event-progress.any.js'; 19 : 1 : import event_readystatechange_loaded_any from './wpt/xhr/event-readystatechange-loaded.any.js'; 20 : 1 : import event_readystate_sync_open_any from './wpt/xhr/event-readystate-sync-open.any.js'; 21 : 1 : import event_timeout_any from './wpt/xhr/event-timeout.any.js'; 22 : 1 : import event_timeout_order_any from './wpt/xhr/event-timeout-order.any.js'; 23 : 1 : import event_upload_progress_any from './wpt/xhr/event-upload-progress.any.js'; 24 : 1 : // import formdata.js from './wpt/xhr/formdata.js'; 25 : 1 : import firing_events_http_content_length from './wpt/xhr/firing-events-http-content-length.js'; 26 : 1 : import firing_events_http_no_content_length from './wpt/xhr/firing-events-http-no-content-length.js'; 27 : 1 : import getallresponseheaders_cookies from './wpt/xhr/getallresponseheaders-cookies.js'; 28 : 1 : import getallresponseheaders from './wpt/xhr/getallresponseheaders.js'; 29 : 1 : import getallresponseheaders_status from './wpt/xhr/getallresponseheaders-status.js'; 30 : 1 : import getresponseheader_case_insensitive from './wpt/xhr/getresponseheader-case-insensitive.js'; 31 : 1 : import getresponseheader_chunked_trailer from './wpt/xhr/getresponseheader-chunked-trailer.js'; 32 : 1 : import getresponseheader_cookies_and_more from './wpt/xhr/getresponseheader-cookies-and-more.js'; 33 : 1 : import getresponseheader_error_state from './wpt/xhr/getresponseheader-error-state.js'; 34 : 1 : import getresponseheader_server_date from './wpt/xhr/getresponseheader-server-date.js'; 35 : 1 : import getresponseheader_special_characters from './wpt/xhr/getresponseheader-special-characters.js'; 36 : 1 : import getresponseheader_unsent_opened_state from './wpt/xhr/getresponseheader-unsent-opened-state.js'; 37 : 1 : import headers_normalize_response from './wpt/xhr/headers-normalize-response.js'; 38 : 1 : import header_user_agent_async from './wpt/xhr/header-user-agent-async.js'; 39 : 1 : import header_user_agent_sync from './wpt/xhr/header-user-agent-sync.js'; 40 : 1 : import historical from './wpt/xhr/historical.js'; 41 : 1 : import loadstart_and_state from './wpt/xhr/loadstart-and-state.js'; 42 : 1 : import open_after_abort from './wpt/xhr/open-after-abort.js'; 43 : 1 : import open_after_setrequestheader from './wpt/xhr/open-after-setrequestheader.js'; 44 : 1 : import open_during_abort from './wpt/xhr/open-during-abort.js'; 45 : 1 : import open_during_abort_event from './wpt/xhr/open-during-abort-event.js'; 46 : 1 : import open_during_abort_processing from './wpt/xhr/open-during-abort-processing.js'; 47 : 1 : import open_method_bogus from './wpt/xhr/open-method-bogus.js'; 48 : 1 : import open_method_case_insensitive from './wpt/xhr/open-method-case-insensitive.js'; 49 : 1 : import open_method_case_sensitive from './wpt/xhr/open-method-case-sensitive.js'; 50 : 1 : import open_method_insecure from './wpt/xhr/open-method-insecure.js'; 51 : 1 : import open_method_responsetype_set_sync from './wpt/xhr/open-method-responsetype-set-sync.js'; 52 : 1 : import open_open_send from './wpt/xhr/open-open-send.js'; 53 : 1 : import open_open_sync_send from './wpt/xhr/open-open-sync-send.js'; 54 : 1 : import open_parameters_toString from './wpt/xhr/open-parameters-toString.js'; 55 : 1 : import open_send_during_abort from './wpt/xhr/open-send-during-abort.js'; 56 : 1 : import open_send_open from './wpt/xhr/open-send-open.js'; 57 : 1 : import open_sync_open_send from './wpt/xhr/open-sync-open-send.js'; 58 : 1 : import open_url_base from './wpt/xhr/open-url-base.js'; 59 : 1 : import open_url_encoding from './wpt/xhr/open-url-encoding.js'; 60 : 1 : import open_url_fragment from './wpt/xhr/open-url-fragment.js'; 61 : 1 : import overridemimetype_headers_received_state_force_shiftjis from './wpt/xhr/overridemimetype-headers-received-state-force-shiftjis.js'; 62 : 1 : import overridemimetype_invalid_mime_type from './wpt/xhr/overridemimetype-invalid-mime-type.js'; 63 : 1 : import overridemimetype_loading_state from './wpt/xhr/overridemimetype-loading-state.js'; 64 : 1 : import overridemimetype_open_state_force_utf_8 from './wpt/xhr/overridemimetype-open-state-force-utf-8.js'; 65 : 1 : import preserve_ua_header_on_redirect from './wpt/xhr/preserve-ua-header-on-redirect.js'; 66 : 1 : import progressevent_constructor from './wpt/xhr/progressevent-constructor.js'; 67 : 1 : import progressevent_interface from './wpt/xhr/progressevent-interface.js'; 68 : 1 : import progress_events_response_data_gzip from './wpt/xhr/progress-events-response-data-gzip.js'; 69 : 1 : import response_body_errors from './wpt/xhr/response-body-errors.any.js'; 70 : 1 : import response_data_arraybuffer from './wpt/xhr/response-data-arraybuffer.js'; 71 : 1 : import response_data_blob from './wpt/xhr/response-data-blob.js'; 72 : 1 : import response_data_progress from './wpt/xhr/response-data-progress.js'; 73 : 1 : import response_invalid_responsetype from './wpt/xhr/response-invalid-responsetype.js'; 74 : 1 : import response_json from './wpt/xhr/response-json.js'; 75 : 1 : import response_method from './wpt/xhr/response-method.js'; 76 : 1 : import responsetext_decoding from './wpt/xhr/responsetext-decoding.js'; 77 : 1 : import responsetext_status from './wpt/xhr/responsetext-status.js'; 78 : 1 : import send_accept from './wpt/xhr/send-accept.js'; 79 : 1 : import send_accept_language from './wpt/xhr/send-accept-language.js'; 80 : 1 : import send_blob_with_no_mime_type from './wpt/xhr/send-blob-with-no-mime-type.js'; 81 : 1 : import send_content_type_charset from './wpt/xhr/send-content-type-charset.js'; 82 : 1 : import send_content_type_string from './wpt/xhr/send-content-type-string.js'; 83 : 1 : import send_data_blob from './wpt/xhr/send-data-blob.js'; 84 : 1 : import send_entity_body_basic from './wpt/xhr/send-entity-body-basic.js'; 85 : 1 : import send_entity_body_empty from './wpt/xhr/send-entity-body-empty.js'; 86 : 1 : import send_entity_body_get_head from './wpt/xhr/send-entity-body-get-head.js'; 87 : 1 : import send_entity_body_get_head_async from './wpt/xhr/send-entity-body-get-head-async.js'; 88 : 1 : import send_entity_body_none from './wpt/xhr/send-entity-body-none.js'; 89 : 1 : import send_network_error_async_events_sub from './wpt/xhr/send-network-error-async-events.sub.js'; 90 : 1 : import send_network_error_sync_events_sub from './wpt/xhr/send-network-error-sync-events.sub.js'; 91 : 1 : import send_no_response_event_loadend from './wpt/xhr/send-no-response-event-loadend.js'; 92 : 1 : import send_no_response_event_loadstart from './wpt/xhr/send-no-response-event-loadstart.js'; 93 : 1 : import send_no_response_event_order from './wpt/xhr/send-no-response-event-order.js'; 94 : 1 : import send_receive_utf16 from './wpt/xhr/send-receive-utf16.js'; 95 : 1 : import send_redirect from './wpt/xhr/send-redirect.js'; 96 : 1 : import send_redirect_bogus from './wpt/xhr/send-redirect-bogus.js'; 97 : 1 : import send_redirect_bogus_sync from './wpt/xhr/send-redirect-bogus-sync.js'; 98 : 1 : import send_redirect_infinite from './wpt/xhr/send-redirect-infinite.js'; 99 : 1 : import send_redirect_infinite_sync from './wpt/xhr/send-redirect-infinite-sync.js'; 100 : 1 : import send_redirect_no_location from './wpt/xhr/send-redirect-no-location.js'; 101 : 1 : import send_redirect_post_upload from './wpt/xhr/send-redirect-post-upload.js'; 102 : 1 : import send_response_event_order from './wpt/xhr/send-response-event-order.js'; 103 : 1 : import send_response_upload_event_loadend from './wpt/xhr/send-response-upload-event-loadend.js'; 104 : 1 : import send_response_upload_event_loadstart from './wpt/xhr/send-response-upload-event-loadstart.js'; 105 : 1 : import send_response_upload_event_progress from './wpt/xhr/send-response-upload-event-progress.js'; 106 : 1 : import send_sync_blocks_async from './wpt/xhr/send-sync-blocks-async.js'; 107 : 1 : import send_sync_no_response_event_loadend from './wpt/xhr/send-sync-no-response-event-loadend.js'; 108 : 1 : import send_sync_no_response_event_load from './wpt/xhr/send-sync-no-response-event-load.js'; 109 : 1 : import send_sync_no_response_event_order from './wpt/xhr/send-sync-no-response-event-order.js'; 110 : 1 : import send_sync_response_event_order from './wpt/xhr/send-sync-response-event-order.js'; 111 : 1 : import send_sync_timeout from './wpt/xhr/send-sync-timeout.js'; 112 : 1 : import send_timeout_events from './wpt/xhr/send-timeout-events.js'; 113 : 1 : import setrequestheader_after_send from './wpt/xhr/setrequestheader-after-send.js'; 114 : 1 : import setrequestheader_allow_empty_value from './wpt/xhr/setrequestheader-allow-empty-value.js'; 115 : 1 : import setrequestheader_allow_whitespace_in_value from './wpt/xhr/setrequestheader-allow-whitespace-in-value.js'; 116 : 1 : import setrequestheader_before_open from './wpt/xhr/setrequestheader-before-open.js'; 117 : 1 : import setrequestheader_bogus_name from './wpt/xhr/setrequestheader-bogus-name.js'; 118 : 1 : import setrequestheader_bogus_value from './wpt/xhr/setrequestheader-bogus-value.js'; 119 : 1 : import setrequestheader_case_insensitive from './wpt/xhr/setrequestheader-case-insensitive.js'; 120 : 1 : import setrequestheader_content_type from './wpt/xhr/setrequestheader-content-type.js'; 121 : 1 : import setrequestheader_header_allowed from './wpt/xhr/setrequestheader-header-allowed.js'; 122 : 1 : import setrequestheader_header_forbidden from './wpt/xhr/setrequestheader-header-forbidden.js'; 123 : 1 : import setrequestheader_open_setrequestheader from './wpt/xhr/setrequestheader-open-setrequestheader.js'; 124 : 1 : import status_async from './wpt/xhr/status-async.js'; 125 : 1 : import status_basic from './wpt/xhr/status-basic.js'; 126 : 1 : import status_error from './wpt/xhr/status-error.js'; 127 : 1 : import xmlhttprequest_basic from './wpt/xhr/xmlhttprequest-basic.js'; 128 : 1 : import xmlhttprequest_eventtarget from './wpt/xhr/xmlhttprequest-eventtarget.js'; 129 : 1 : import xmlhttprequest_network_error from './wpt/xhr/xmlhttprequest-network-error.js'; 130 : 1 : import xmlhttprequest_network_error_sync from './wpt/xhr/xmlhttprequest-network-error-sync.js'; 131 : 1 : import xmlhttprequest_unsent from './wpt/xhr/xmlhttprequest-unsent.js'; 132 : 1 : 133 : 1 : /** @const {object} cmdOptions - Command line options */ 134 : 1 : import cmdOptions from './wpt-xhr.cmd.js'; 135 : 1 : 136 : 1 : let activeURL = new URL (cmdOptions.url).href; 137 : 1 : activeURL = activeURL.substring(0, activeURL.length - 1); 138 : 1 : 139 : 1 : /** Prepare test environment */ 140 : 1 : 141 : 1 : let testCount = 0; 142 : 1 : let passCount = 0; 143 : 1 : let failCount = 0; 144 : 1 : let cancelCount = 0; 145 : 1 : let skipCount = 0; 146 : 1 : let todoCount = 0; 147 : 1 : let startTime = Date.now(); 148 : 1 : 149 : 1 : const suites = new Map(); 150 : 1 : 151 : 1 : /** 152 : 1 : * @func Main 153 : 1 : * @desc The application entry point function 154 : 1 : */ 155 [ + ]: 1 : (() => { 156 : 1 : loadTestData(); 157 : 1 : 158 [ - ]: 1 : cmdOptions.verbose && splash(); 159 : 1 : 160 : 1 : if(cmdOptions.node){ 161 : 1 : import('node:test') 162 [ + ]: 1 : .then(runner => { 163 : 1 : nodeRunner(runner); 164 : 1 : }) 165 : 1 : .catch(() => { 166 : 0 : defRunner(); 167 : 1 : }); 168 [ - ]: 1 : } 169 : 0 : else{ 170 : 0 : defRunner(); 171 : 0 : } 172 : 1 : 173 : 1 : })('Main Function'); 174 : 1 : 175 : 1 : /** 176 : 1 : * @func loadTestData 177 : 1 : * @desc Load test data 178 : 1 : */ 179 [ + ]: 1 : function loadTestData(){ 180 : 1 : 181 : 1 : let testData = null; 182 : 1 : let suiteDesc = ''; 183 : 1 : 184 : 1 : // TEST SUITE #1 - XMLHttpRequest 185 : 1 : suiteDesc = 'XMLHttpRequest'; 186 : 1 : suites.set(suiteDesc, []); 187 : 1 : 188 : 1 : // TEST ### - XMLHttpRequest - prototype and members 189 : 1 : testData = {}; 190 : 1 : testData.desc = 'XMLHttpRequest - prototype and members'; 191 : 1 : testData.method = xmlhttprequest_basic; 192 : 1 : 193 : 1 : testData.skip = false; 194 : 1 : suites.get(suiteDesc).push(testData); 195 : 1 : 196 : 1 : // TEST ### - XMLHttpRequest - implements EventTarget 197 : 1 : testData = {}; 198 : 1 : testData.desc = 'XMLHttpRequest - implements EventTarget'; 199 : 1 : testData.method = xmlhttprequest_eventtarget; 200 : 1 : 201 : 1 : testData.skip = false; 202 : 1 : suites.get(suiteDesc).push(testData); 203 : 1 : 204 : 1 : // TEST ### - XMLHttpRequest - members during network errors (async) 205 : 1 : testData = {}; 206 : 1 : testData.desc = 'XMLHttpRequest - members during network errors (async)'; 207 : 1 : testData.method = xmlhttprequest_network_error; 208 : 1 : 209 : 1 : testData.skip = false; 210 : 1 : suites.get(suiteDesc).push(testData); 211 : 1 : 212 : 1 : // TEST ### - XMLHttpRequest - members during network errors (sync) 213 : 1 : testData = {}; 214 : 1 : testData.desc = 'XMLHttpRequest - members during network errors (sync)'; 215 : 1 : testData.method = xmlhttprequest_network_error_sync; 216 : 1 : 217 : 1 : testData.skip = false; 218 : 1 : suites.get(suiteDesc).push(testData); 219 : 1 : 220 : 1 : // TEST ### - XMLHttpRequest - members during UNSENT 221 : 1 : testData = {}; 222 : 1 : testData.desc = 'XMLHttpRequest - members during UNSENT'; 223 : 1 : testData.method = xmlhttprequest_unsent; 224 : 1 : 225 : 1 : testData.skip = false; 226 : 1 : suites.get(suiteDesc).push(testData); 227 : 1 : 228 : 1 : // TEST SUITE #2 - Events 229 : 1 : suiteDesc = 'Events'; 230 : 1 : suites.set(suiteDesc, []); 231 : 1 : 232 : 1 : // TEST ### - event - abort event 233 : 1 : testData = {}; 234 : 1 : testData.desc = 'event - abort event'; 235 : 1 : testData.method = event_abort_any; 236 : 1 : 237 : 1 : testData.skip = false; 238 : 1 : suites.get(suiteDesc).push(testData); 239 : 1 : 240 : 1 : // TEST ### - event - error (order of events) 241 : 1 : testData = {}; 242 : 1 : testData.desc = 'event - error (order of events)'; 243 : 1 : testData.method = event_error_order_sub; 244 : 1 : 245 : 1 : testData.skip = false; 246 : 1 : suites.get(suiteDesc).push(testData); 247 : 1 : 248 : 1 : // TEST ### - event - error event 249 : 1 : testData = {}; 250 : 1 : testData.desc = 'event - error event'; 251 : 1 : testData.method = event_error_sub_any; 252 : 1 : 253 : 1 : testData.skip = false; 254 : 1 : suites.get(suiteDesc).push(testData); 255 : 1 : 256 : 1 : // TEST ### - event - load event 257 : 1 : testData = {}; 258 : 1 : testData.desc = 'event - load event'; 259 : 1 : testData.method = event_load_any; 260 : 1 : 261 : 1 : testData.skip = false; 262 : 1 : suites.get(suiteDesc).push(testData); 263 : 1 : 264 : 1 : // TEST ### - event - loadend event 265 : 1 : testData = {}; 266 : 1 : testData.desc = 'event - loadend event'; 267 : 1 : testData.method = event_loadend_any; 268 : 1 : 269 : 1 : testData.skip = false; 270 : 1 : suites.get(suiteDesc).push(testData); 271 : 1 : 272 : 1 : // TEST ### - event - loadstart event 273 : 1 : testData = {}; 274 : 1 : testData.desc = 'event - loadstart event'; 275 : 1 : testData.method = event_loadstart_any; 276 : 1 : 277 : 1 : testData.skip = false; 278 : 1 : suites.get(suiteDesc).push(testData); 279 : 1 : 280 : 1 : // TEST ### - event - loadstart on upload object 281 : 1 : testData = {}; 282 : 1 : testData.desc = 'event - loadstart on upload object'; 283 : 1 : testData.method = event_loadstart_upload_any; 284 : 1 : 285 : 1 : testData.skip = false; 286 : 1 : suites.get(suiteDesc).push(testData); 287 : 1 : 288 : 1 : // TEST ### - event - the LOADING state change may be emitted multiple times 289 : 1 : testData = {}; 290 : 1 : testData.desc = 'event - the LOADING state change may be emitted multiple times'; 291 : 1 : testData.method = event_readystatechange_loaded_any; 292 : 1 : 293 : 1 : testData.skip = false; 294 : 1 : suites.get(suiteDesc).push(testData); 295 : 1 : 296 : 1 : // TEST ### - event - open() - call fires sync readystate event 297 : 1 : testData = {}; 298 : 1 : testData.desc = 'event - open() - call fires sync readystate event'; 299 : 1 : testData.method = event_readystate_sync_open_any; 300 : 1 : 301 : 1 : testData.skip = false; 302 : 1 : suites.get(suiteDesc).push(testData); 303 : 1 : 304 : 1 : // TEST ### - event - timeout event 305 : 1 : testData = {}; 306 : 1 : testData.desc = 'event - timeout event'; 307 : 1 : testData.method = event_timeout_any; 308 : 1 : 309 : 1 : testData.skip = false; 310 : 1 : suites.get(suiteDesc).push(testData); 311 : 1 : 312 : 1 : // TEST ### - event - timeout (order of events) 313 : 1 : testData = {}; 314 : 1 : testData.desc = 'event - timeout (order of events)'; 315 : 1 : testData.method = event_timeout_order_any; 316 : 1 : 317 : 1 : testData.skip = false; 318 : 1 : suites.get(suiteDesc).push(testData); 319 : 1 : 320 : 1 : // TEST ### - event - progress event 321 : 1 : testData = {}; 322 : 1 : testData.desc = 'event - progress event'; 323 : 1 : testData.method = event_progress_any; 324 : 1 : 325 : 1 : testData.skip = false; 326 : 1 : suites.get(suiteDesc).push(testData); 327 : 1 : 328 : 1 : // TEST ### - event - upload progress event 329 : 1 : testData = {}; 330 : 1 : testData.desc = 'event - upload progress event'; 331 : 1 : testData.method = event_upload_progress_any; 332 : 1 : 333 : 1 : testData.skip = false; 334 : 1 : suites.get(suiteDesc).push(testData); 335 : 1 : 336 : 1 : // TEST SUITE #3 - Progress Events 337 : 1 : suiteDesc = 'Progress Events'; 338 : 1 : suites.set(suiteDesc, []); 339 : 1 : 340 : 1 : // TEST ### - ProgressEvent - constructor 341 : 1 : testData = {}; 342 : 1 : testData.desc = 'ProgressEvent - constructor'; 343 : 1 : testData.method = progressevent_constructor; 344 : 1 : 345 : 1 : testData.skip = false; 346 : 1 : suites.get(suiteDesc).push(testData); 347 : 1 : 348 : 1 : // TEST ### - ProgressEvent - interface 349 : 1 : testData = {}; 350 : 1 : testData.desc = 'ProgressEvent - interface'; 351 : 1 : testData.method = progressevent_interface; 352 : 1 : 353 : 1 : testData.skip = false; 354 : 1 : suites.get(suiteDesc).push(testData); 355 : 1 : 356 : 1 : // TEST ### - ProgressEvent - firing events for HTTP with Content-Length 357 : 1 : testData = {}; 358 : 1 : testData.desc = 'ProgressEvent - firing events for HTTP with Content-Length'; 359 : 1 : testData.method = firing_events_http_content_length; 360 : 1 : 361 : 1 : testData.skip = false; 362 : 1 : suites.get(suiteDesc).push(testData); 363 : 1 : 364 : 1 : // TEST ### - ProgressEvent - firing events for HTTP with NO Content-Length 365 : 1 : testData = {}; 366 : 1 : testData.desc = 'ProgressEvent - firing events for HTTP with NO Content-Length'; 367 : 1 : testData.method = firing_events_http_no_content_length; 368 : 1 : 369 : 1 : testData.skip = false; 370 : 1 : suites.get(suiteDesc).push(testData); 371 : 1 : 372 : 1 : // TEST ### - ProgressEvent - and GZIP encoding 373 : 1 : testData = {}; 374 : 1 : testData.desc = 'ProgressEvent - and GZIP encoding'; 375 : 1 : testData.method = progress_events_response_data_gzip; 376 : 1 : 377 : 1 : testData.skip = false; 378 : 1 : suites.get(suiteDesc).push(testData); 379 : 1 : 380 : 1 : // TEST SUITE #4 - Headers 381 : 1 : suiteDesc = 'Headers'; 382 : 1 : suites.set(suiteDesc, []); 383 : 1 : 384 : 1 : // TEST ### - Headers - Whitespace and null in header values 385 : 1 : testData = {}; 386 : 1 : testData.desc = 'Headers - Whitespace and null in header values'; 387 : 1 : testData.method = headers_normalize_response; 388 : 1 : 389 : 1 : testData.skip = false; 390 : 1 : suites.get(suiteDesc).push(testData); 391 : 1 : 392 : 1 : // TEST ### - Headers - Test that async requests are sent with the User-Agent header 393 : 1 : testData = {}; 394 : 1 : testData.desc = 'Headers - Test that async requests are sent with the User-Agent header'; 395 : 1 : testData.method = header_user_agent_async; 396 : 1 : 397 : 1 : testData.skip = false; 398 : 1 : suites.get(suiteDesc).push(testData); 399 : 1 : 400 : 1 : // TEST ### - Headers - Test that sync requests are sent with the User-Agent header 401 : 1 : testData = {}; 402 : 1 : testData.desc = 'Headers - Test that sync requests are sent with the User-Agent header'; 403 : 1 : testData.method = header_user_agent_sync; 404 : 1 : 405 : 1 : testData.skip = false; 406 : 1 : suites.get(suiteDesc).push(testData); 407 : 1 : 408 : 1 : // TEST ### - Headers - User-Agent header is preserved on redirect 409 : 1 : testData = {}; 410 : 1 : testData.desc = 'Headers - User-Agent header is preserved on redirect'; 411 : 1 : testData.method = preserve_ua_header_on_redirect; 412 : 1 : 413 : 1 : testData.skip = false; 414 : 1 : suites.get(suiteDesc).push(testData); 415 : 1 : 416 : 1 : // TEST SUITE #5 - Methods - open 417 : 1 : suiteDesc = 'Methods - open'; 418 : 1 : suites.set(suiteDesc, []); 419 : 1 : 420 : 1 : // TEST ### - open() - after abort() 421 : 1 : testData = {}; 422 : 1 : testData.desc = 'open() - after abort()'; 423 : 1 : testData.method = open_after_abort; 424 : 1 : 425 : 1 : testData.skip = false; 426 : 1 : suites.get(suiteDesc).push(testData); 427 : 1 : 428 : 1 : // TEST ### - open() - after setRequestHeader() 429 : 1 : testData = {}; 430 : 1 : testData.desc = 'open() - after setRequestHeader()'; 431 : 1 : testData.method = open_after_setrequestheader; 432 : 1 : 433 : 1 : testData.skip = false; 434 : 1 : suites.get(suiteDesc).push(testData); 435 : 1 : 436 : 1 : // TEST ### - open() - during abort() 437 : 1 : testData = {}; 438 : 1 : testData.desc = 'open() - during abort()'; 439 : 1 : testData.method = open_during_abort; 440 : 1 : 441 : 1 : testData.skip = false; 442 : 1 : suites.get(suiteDesc).push(testData); 443 : 1 : 444 : 1 : // TEST ### - open() - bogus methods 445 : 1 : testData = {}; 446 : 1 : testData.desc = 'open() - bogus methods'; 447 : 1 : testData.method = open_method_bogus; 448 : 1 : 449 : 1 : testData.skip = false; 450 : 1 : suites.get(suiteDesc).push(testData); 451 : 1 : 452 : 1 : // TEST ### - open() - case-insensitive methods test 453 : 1 : testData = {}; 454 : 1 : testData.desc = 'open() - case-insensitive methods test'; 455 : 1 : testData.method = open_method_case_insensitive; 456 : 1 : 457 : 1 : testData.skip = false; 458 : 1 : suites.get(suiteDesc).push(testData); 459 : 1 : 460 : 1 : // TEST ### - open() - "insecure" methods 461 : 1 : testData = {}; 462 : 1 : testData.desc = 'open() - "insecure" methods'; 463 : 1 : testData.method = open_method_insecure; 464 : 1 : 465 : 1 : testData.skip = false; 466 : 1 : suites.get(suiteDesc).push(testData); 467 : 1 : 468 : 1 : // TEST ### - open() - sync request not allowed if responseType is set 469 : 1 : testData = {}; 470 : 1 : testData.desc = 'open() - sync request not allowed if responseType is set'; 471 : 1 : testData.method = open_method_responsetype_set_sync; 472 : 1 : 473 : 1 : testData.skip = false; 474 : 1 : suites.get(suiteDesc).push(testData); 475 : 1 : 476 : 1 : // TEST ### - open() - attempts to toString its string parameters 477 : 1 : testData = {}; 478 : 1 : testData.desc = 'open() - attempts to toString its string parameters'; 479 : 1 : testData.method = open_parameters_toString; 480 : 1 : 481 : 1 : testData.skip = false; 482 : 1 : suites.get(suiteDesc).push(testData); 483 : 1 : 484 : 1 : // TEST ### - open() - open() - send() 485 : 1 : testData = {}; 486 : 1 : testData.desc = 'open() - open() - send()'; 487 : 1 : testData.method = open_open_send; 488 : 1 : 489 : 1 : testData.skip = false; 490 : 1 : suites.get(suiteDesc).push(testData); 491 : 1 : 492 : 1 : // TEST ### - open() - open() (sync) - send() 493 : 1 : testData = {}; 494 : 1 : testData.desc = 'open() - open() (sync) - send()'; 495 : 1 : testData.method = open_open_sync_send; 496 : 1 : 497 : 1 : testData.skip = false; 498 : 1 : suites.get(suiteDesc).push(testData); 499 : 1 : 500 : 1 : // TEST ### - open() - send() - open() 501 : 1 : testData = {}; 502 : 1 : testData.desc = 'open() - send() - open()'; 503 : 1 : testData.method = open_send_open; 504 : 1 : 505 : 1 : testData.skip = false; 506 : 1 : suites.get(suiteDesc).push(testData); 507 : 1 : 508 : 1 : // TEST ### - open() - during abort() 509 : 1 : testData = {}; 510 : 1 : testData.desc = 'open() - during abort()'; 511 : 1 : testData.method = open_send_during_abort; 512 : 1 : 513 : 1 : testData.skip = false; 514 : 1 : suites.get(suiteDesc).push(testData); 515 : 1 : 516 : 1 : // TEST ### - open() - (sync) - send() - open() 517 : 1 : testData = {}; 518 : 1 : testData.desc = 'open() - (sync) - send() - open()'; 519 : 1 : testData.method = open_sync_open_send; 520 : 1 : 521 : 1 : testData.skip = false; 522 : 1 : suites.get(suiteDesc).push(testData); 523 : 1 : 524 : 1 : // TEST ### - open() - resolving URLs 525 : 1 : testData = {}; 526 : 1 : testData.desc = 'open() - resolving URLs'; 527 : 1 : testData.method = open_url_base; 528 : 1 : 529 : 1 : testData.skip = false; 530 : 1 : suites.get(suiteDesc).push(testData); 531 : 1 : 532 : 1 : // TEST ### - open() - resolving URLs - fragment identifier 533 : 1 : testData = {}; 534 : 1 : testData.desc = 'open() - resolving URLs - fragment identifier'; 535 : 1 : testData.method = open_url_fragment; 536 : 1 : 537 : 1 : testData.skip = false; 538 : 1 : suites.get(suiteDesc).push(testData); 539 : 1 : 540 : 1 : // TEST SUITE #6 - Methods - setRequestHeader 541 : 1 : suiteDesc = 'Methods - setRequestHeader'; 542 : 1 : suites.set(suiteDesc, []); 543 : 1 : 544 : 1 : // TEST ### - setRequestHeader() - after send() 545 : 1 : testData = {}; 546 : 1 : testData.desc = 'setRequestHeader() - after send()'; 547 : 1 : testData.method = setrequestheader_after_send; 548 : 1 : 549 : 1 : testData.skip = false; 550 : 1 : suites.get(suiteDesc).push(testData); 551 : 1 : 552 : 1 : // TEST ### - setRequestHeader() - empty header 553 : 1 : testData = {}; 554 : 1 : testData.desc = 'setRequestHeader() - empty header'; 555 : 1 : testData.method = setrequestheader_allow_empty_value; 556 : 1 : 557 : 1 : testData.skip = false; 558 : 1 : suites.get(suiteDesc).push(testData); 559 : 1 : 560 : 1 : // TEST ### - setRequestHeader() - header value with whitespace 561 : 1 : testData = {}; 562 : 1 : testData.desc = 'setRequestHeader() - header value with whitespace'; 563 : 1 : testData.method = setrequestheader_allow_whitespace_in_value; 564 : 1 : 565 : 1 : testData.skip = false; 566 : 1 : suites.get(suiteDesc).push(testData); 567 : 1 : 568 : 1 : // TEST ### - setRequestHeader() - before open() 569 : 1 : testData = {}; 570 : 1 : testData.desc = 'setRequestHeader() - before open()'; 571 : 1 : testData.method = setrequestheader_before_open; 572 : 1 : 573 : 1 : testData.skip = false; 574 : 1 : suites.get(suiteDesc).push(testData); 575 : 1 : 576 : 1 : // TEST ### - setRequestHeader() - name argument checks 577 : 1 : testData = {}; 578 : 1 : testData.desc = 'setRequestHeader() - name argument checks'; 579 : 1 : testData.method = setrequestheader_bogus_name; 580 : 1 : 581 : 1 : testData.skip = false; 582 : 1 : suites.get(suiteDesc).push(testData); 583 : 1 : 584 : 1 : // TEST ### - setRequestHeader() - value argument checks 585 : 1 : testData = {}; 586 : 1 : testData.desc = 'setRequestHeader() - value argument checks'; 587 : 1 : testData.method = setrequestheader_bogus_value; 588 : 1 : 589 : 1 : testData.skip = false; 590 : 1 : suites.get(suiteDesc).push(testData); 591 : 1 : 592 : 1 : // TEST ### - setRequestHeader() - headers that differ in case 593 : 1 : testData = {}; 594 : 1 : testData.desc = 'setRequestHeader() - headers that differ in case'; 595 : 1 : testData.method = setrequestheader_case_insensitive; 596 : 1 : 597 : 1 : testData.skip = false; 598 : 1 : suites.get(suiteDesc).push(testData); 599 : 1 : 600 : 1 : // TEST ### - setRequestHeader() - Content-Type header 601 : 1 : testData = {}; 602 : 1 : testData.desc = 'setRequestHeader() - Content-Type header'; 603 : 1 : testData.method = setrequestheader_content_type; 604 : 1 : 605 : 1 : testData.skip = false; 606 : 1 : suites.get(suiteDesc).push(testData); 607 : 1 : 608 : 1 : // TEST ### - setRequestHeader() - headers that are allowed 609 : 1 : testData = {}; 610 : 1 : testData.desc = 'setRequestHeader() - headers that are allowed'; 611 : 1 : testData.method = setrequestheader_header_allowed; 612 : 1 : 613 : 1 : testData.skip = false; 614 : 1 : suites.get(suiteDesc).push(testData); 615 : 1 : 616 : 1 : // TEST ### - setRequestHeader() - headers that are forbidden 617 : 1 : testData = {}; 618 : 1 : testData.desc = 'setRequestHeader() - headers that are forbidden'; 619 : 1 : testData.method = setrequestheader_header_forbidden; 620 : 1 : 621 : 1 : testData.skip = false; 622 : 1 : suites.get(suiteDesc).push(testData); 623 : 1 : 624 : 1 : // TEST ### - setRequestHeader() - and open() 625 : 1 : testData = {}; 626 : 1 : testData.desc = 'setRequestHeader() - and open()'; 627 : 1 : testData.method = setrequestheader_open_setrequestheader; 628 : 1 : 629 : 1 : testData.skip = false; 630 : 1 : suites.get(suiteDesc).push(testData); 631 : 1 : 632 : 1 : // TEST SUITE #7 - Methods - overrideMimeType 633 : 1 : suiteDesc = 'Methods - overrideMimeType'; 634 : 1 : suites.set(suiteDesc, []); 635 : 1 : 636 : 1 : // TEST ### - overrideMimeType() - in HEADERS RECEIVED state, enforcing Shift-JIS encoding 637 : 1 : testData = {}; 638 : 1 : testData.desc = 'overrideMimeType() - in HEADERS RECEIVED state, enforcing Shift-JIS encoding'; 639 : 1 : testData.method = overridemimetype_headers_received_state_force_shiftjis; 640 : 1 : 641 : 1 : testData.skip = false; 642 : 1 : suites.get(suiteDesc).push(testData); 643 : 1 : 644 : 1 : // TEST ### - overrideMimeType() - and invalid MIME types 645 : 1 : testData = {}; 646 : 1 : testData.desc = 'overrideMimeType() - and invalid MIME types'; 647 : 1 : testData.method = overridemimetype_invalid_mime_type; 648 : 1 : 649 : 1 : testData.skip = false; 650 : 1 : suites.get(suiteDesc).push(testData); 651 : 1 : 652 : 1 : // TEST ### - overrideMimeType() - in LOADING state 653 : 1 : testData = {}; 654 : 1 : testData.desc = 'overrideMimeType() - in LOADING state'; 655 : 1 : testData.method = overridemimetype_loading_state; 656 : 1 : 657 : 1 : testData.skip = false; 658 : 1 : suites.get(suiteDesc).push(testData); 659 : 1 : 660 : 1 : // TEST ### - overrideMimeType() - in open state, enforcing UTF-8 encoding 661 : 1 : testData = {}; 662 : 1 : testData.desc = 'overrideMimeType() - in open state, enforcing UTF-8 encoding'; 663 : 1 : testData.method = overridemimetype_open_state_force_utf_8; 664 : 1 : 665 : 1 : testData.skip = false; 666 : 1 : suites.get(suiteDesc).push(testData); 667 : 1 : 668 : 1 : // TEST SUITE #8 - Methods - send 669 : 1 : suiteDesc = 'Methods - send'; 670 : 1 : suites.set(suiteDesc, []); 671 : 1 : 672 : 1 : // TEST ### - send() - Accept 673 : 1 : testData = {}; 674 : 1 : testData.desc = 'send() - Accept'; 675 : 1 : testData.method = send_accept; 676 : 1 : 677 : 1 : testData.skip = false; 678 : 1 : suites.get(suiteDesc).push(testData); 679 : 1 : 680 : 1 : // TEST ### - send() - Accept-Language 681 : 1 : testData = {}; 682 : 1 : testData.desc = 'send() - Accept-Language'; 683 : 1 : testData.method = send_accept_language; 684 : 1 : 685 : 1 : testData.skip = false; 686 : 1 : suites.get(suiteDesc).push(testData); 687 : 1 : 688 : 1 : // TEST ### - send() - Blob data with no mime type 689 : 1 : testData = {}; 690 : 1 : testData.desc = 'send() - Blob data with no mime type'; 691 : 1 : testData.method = send_blob_with_no_mime_type; 692 : 1 : 693 : 1 : testData.skip = false; 694 : 1 : suites.get(suiteDesc).push(testData); 695 : 1 : 696 : 1 : // TEST ### - send() - Content-Type 697 : 1 : testData = {}; 698 : 1 : testData.desc = 'send() - Content-Type'; 699 : 1 : testData.method = send_content_type_string; 700 : 1 : 701 : 1 : testData.skip = false; 702 : 1 : suites.get(suiteDesc).push(testData); 703 : 1 : 704 : 1 : // TEST ### - send() - charset parameter of Content-Type 705 : 1 : testData = {}; 706 : 1 : testData.desc = 'send() - charset parameter of Content-Type'; 707 : 1 : testData.method = send_content_type_charset; 708 : 1 : 709 : 1 : testData.skip = false; 710 : 1 : suites.get(suiteDesc).push(testData); 711 : 1 : 712 : 1 : // TEST ### - send() - method: Blob data 713 : 1 : testData = {}; 714 : 1 : testData.desc = 'send() - method: Blob data'; 715 : 1 : testData.method = send_data_blob; 716 : 1 : 717 : 1 : testData.skip = false; 718 : 1 : suites.get(suiteDesc).push(testData); 719 : 1 : 720 : 1 : // TEST ### - send() - data argument 721 : 1 : testData = {}; 722 : 1 : testData.desc = 'send() - data argument'; 723 : 1 : testData.method = send_entity_body_basic; 724 : 1 : 725 : 1 : testData.skip = false; 726 : 1 : suites.get(suiteDesc).push(testData); 727 : 1 : 728 : 1 : // TEST ### - send() - "" empty entity body 729 : 1 : testData = {}; 730 : 1 : testData.desc = 'send() - "" empty entity body'; 731 : 1 : testData.method = send_entity_body_empty; 732 : 1 : 733 : 1 : testData.skip = false; 734 : 1 : suites.get(suiteDesc).push(testData); 735 : 1 : 736 : 1 : // TEST ### - send() - non-empty data argument and GET/HEAD - async, no upload events should fire 737 : 1 : testData = {}; 738 : 1 : testData.desc = 'send() - non-empty data argument and GET/HEAD - async, no upload events should fire'; 739 : 1 : testData.method = send_entity_body_get_head_async; 740 : 1 : 741 : 1 : testData.skip = false; 742 : 1 : suites.get(suiteDesc).push(testData); 743 : 1 : 744 : 1 : // TEST ### - send() - non-empty data argument and GET/HEAD, no upload events should fire 745 : 1 : testData = {}; 746 : 1 : testData.desc = 'send() - non-empty data argument and GET/HEAD, no upload events should fire'; 747 : 1 : testData.method = send_entity_body_get_head; 748 : 1 : 749 : 1 : testData.skip = false; 750 : 1 : suites.get(suiteDesc).push(testData); 751 : 1 : 752 : 1 : // TEST ### - send() - null entity body 753 : 1 : testData = {}; 754 : 1 : testData.desc = 'send() - null entity body'; 755 : 1 : testData.method = send_entity_body_none; 756 : 1 : 757 : 1 : testData.skip = false; 758 : 1 : suites.get(suiteDesc).push(testData); 759 : 1 : 760 : 1 : // TEST ### - send() - Fire a progress event named error when Network error happens (synchronous flag is unset 761 : 1 : testData = {}; 762 : 1 : testData.desc = 'send() - Fire a progress event named error when Network error happens (synchronous flag is unset)'; 763 : 1 : testData.method = send_network_error_async_events_sub; 764 : 1 : 765 : 1 : testData.skip = false; 766 : 1 : suites.get(suiteDesc).push(testData); 767 : 1 : 768 : 1 : // TEST ### - send() - Throw a "throw an "NetworkError" exception when Network error happens (synchronous flag is set) 769 : 1 : testData = {}; 770 : 1 : testData.desc = 'send() - Throw a "throw an "NetworkError" exception when Network error happens (synchronous flag is set)'; 771 : 1 : testData.method = send_network_error_sync_events_sub; 772 : 1 : 773 : 1 : testData.skip = false; 774 : 1 : suites.get(suiteDesc).push(testData); 775 : 1 : 776 : 1 : // TEST ### - send() - Fire a progress event named loadend (no response entity body) 777 : 1 : testData = {}; 778 : 1 : testData.desc = 'send() - Fire a progress event named loadend (no response entity body)'; 779 : 1 : testData.method = send_no_response_event_loadend; 780 : 1 : 781 : 1 : testData.skip = false; 782 : 1 : suites.get(suiteDesc).push(testData); 783 : 1 : 784 : 1 : // TEST ### - send() - Fire a progress event named loadstart (no response entity body and the state is LOADING) 785 : 1 : testData = {}; 786 : 1 : testData.desc = 'send() - Fire a progress event named loadstart (no response entity body and the state is LOADING)'; 787 : 1 : testData.method = send_no_response_event_loadstart; 788 : 1 : 789 : 1 : testData.skip = false; 790 : 1 : suites.get(suiteDesc).push(testData); 791 : 1 : 792 : 1 : // TEST ### - send() - event order when there is no response entity body 793 : 1 : testData = {}; 794 : 1 : testData.desc = 'send() - event order when there is no response entity body'; 795 : 1 : testData.method = send_no_response_event_order; 796 : 1 : 797 : 1 : testData.skip = false; 798 : 1 : suites.get(suiteDesc).push(testData); 799 : 1 : 800 : 1 : // TEST ### - send() - receive data which is UTF-16 encoded 801 : 1 : testData = {}; 802 : 1 : testData.desc = 'send() - receive data which is UTF-16 encoded'; 803 : 1 : testData.method = send_receive_utf16; 804 : 1 : 805 : 1 : testData.skip = false; 806 : 1 : suites.get(suiteDesc).push(testData); 807 : 1 : 808 : 1 : // TEST ### - send() - Redirects (basics) 809 : 1 : testData = {}; 810 : 1 : testData.desc = 'send() - Redirects (basics)'; 811 : 1 : testData.method = send_redirect; 812 : 1 : 813 : 1 : testData.skip = false; 814 : 1 : suites.get(suiteDesc).push(testData); 815 : 1 : 816 : 1 : // TEST ### - send() - Redirects (bogus Location header) 817 : 1 : testData = {}; 818 : 1 : testData.desc = 'send() - Redirects (bogus Location header)'; 819 : 1 : testData.method = send_redirect_bogus; 820 : 1 : 821 : 1 : testData.skip = false; 822 : 1 : suites.get(suiteDesc).push(testData); 823 : 1 : 824 : 1 : // TEST ### - send() - Redirects (bogus Location header; sync) 825 : 1 : testData = {}; 826 : 1 : testData.desc = 'send() - Redirects (bogus Location header; sync)'; 827 : 1 : testData.method = send_redirect_bogus_sync; 828 : 1 : 829 : 1 : testData.skip = false; 830 : 1 : suites.get(suiteDesc).push(testData); 831 : 1 : 832 : 1 : // TEST ### - send() - Redirects (infinite loop) 833 : 1 : testData = {}; 834 : 1 : testData.desc = 'send() - Redirects (infinite loop)'; 835 : 1 : testData.method = send_redirect_infinite; 836 : 1 : 837 : 1 : testData.skip = false; 838 : 1 : suites.get(suiteDesc).push(testData); 839 : 1 : 840 : 1 : // TEST ### - send() - Redirects (infinite loop; sync) 841 : 1 : testData = {}; 842 : 1 : testData.desc = 'send() - Redirects (infinite loop; sync)'; 843 : 1 : testData.method = send_redirect_infinite_sync; 844 : 1 : 845 : 1 : testData.skip = false; 846 : 1 : suites.get(suiteDesc).push(testData); 847 : 1 : 848 : 1 : // TEST ### - send() - POSTing to URL that redirects 849 : 1 : testData = {}; 850 : 1 : testData.desc = 'send() - POSTing to URL that redirects'; 851 : 1 : testData.method = send_redirect_post_upload; 852 : 1 : 853 : 1 : testData.skip = false; 854 : 1 : suites.get(suiteDesc).push(testData); 855 : 1 : 856 : 1 : // TEST ### - send() - event order when synchronous flag is unset 857 : 1 : testData = {}; 858 : 1 : testData.desc = 'send() - event order when synchronous flag is unset'; 859 : 1 : testData.method = send_response_event_order; 860 : 1 : 861 : 1 : testData.skip = false; 862 : 1 : suites.get(suiteDesc).push(testData); 863 : 1 : 864 : 1 : // TEST ### - send() - Fire a progress event named loadstart on the XMLHttpRequestUpload (synchronous flag is unset) 865 : 1 : testData = {}; 866 : 1 : testData.desc = 'send() - Fire a progress event named loadstart on the XMLHttpRequestUpload (synchronous flag is unset)'; 867 : 1 : testData.method = send_response_upload_event_loadstart; 868 : 1 : 869 : 1 : testData.skip = false; 870 : 1 : suites.get(suiteDesc).push(testData); 871 : 1 : 872 : 1 : // TEST ### - send() - Fire a progress event named loadend on the XMLHttpRequestUpload (synchronous flag is unset) 873 : 1 : testData = {}; 874 : 1 : testData.desc = 'send() - Fire a progress event named loadend on the XMLHttpRequestUpload (synchronous flag is unset)'; 875 : 1 : testData.method = send_response_upload_event_loadend; 876 : 1 : 877 : 1 : testData.skip = false; 878 : 1 : suites.get(suiteDesc).push(testData); 879 : 1 : 880 : 1 : // TEST ### - send() - Fire a progress event named progress on the XMLHttpRequestUpload (synchronous flag is unset) 881 : 1 : testData = {}; 882 : 1 : testData.desc = 'send() - Fire a progress event named progress on the XMLHttpRequestUpload (synchronous flag is unset)'; 883 : 1 : testData.method = send_response_upload_event_progress; 884 : 1 : 885 : 1 : testData.skip = false; 886 : 1 : suites.get(suiteDesc).push(testData); 887 : 1 : 888 : 1 : // TEST ### - send() - sync requests should block events on pending async requests 889 : 1 : testData = {}; 890 : 1 : testData.desc = 'send() - sync requests should block events on pending async requests'; 891 : 1 : testData.method = send_sync_blocks_async; 892 : 1 : 893 : 1 : testData.skip = false; 894 : 1 : suites.get(suiteDesc).push(testData); 895 : 1 : 896 : 1 : // TEST ### - send() - event order when synchronous flag is set and there is no response entity body 897 : 1 : testData = {}; 898 : 1 : testData.desc = 'send() - event order when synchronous flag is set and there is no response entity body'; 899 : 1 : testData.method = send_sync_no_response_event_order; 900 : 1 : 901 : 1 : testData.skip = false; 902 : 1 : suites.get(suiteDesc).push(testData); 903 : 1 : 904 : 1 : // TEST ### - send() - Fire an event named loadend (no response entity body and the synchronous flag is set) 905 : 1 : testData = {}; 906 : 1 : testData.desc = 'send() - Fire an event named loadend (no response entity body and the synchronous flag is set)'; 907 : 1 : testData.method = send_sync_no_response_event_load; 908 : 1 : 909 : 1 : testData.skip = false; 910 : 1 : suites.get(suiteDesc).push(testData); 911 : 1 : 912 : 1 : // TEST ### - send() - Fire an event named loadend (no response entity body and the synchronous flag is set) 913 : 1 : testData = {}; 914 : 1 : testData.desc = 'send() - Fire an event named loadend (no response entity body and the synchronous flag is set)'; 915 : 1 : testData.method = send_sync_no_response_event_loadend; 916 : 1 : 917 : 1 : testData.skip = false; 918 : 1 : suites.get(suiteDesc).push(testData); 919 : 1 : 920 : 1 : // TEST ### - send() - event order when synchronous flag is set 921 : 1 : testData = {}; 922 : 1 : testData.desc = 'send() - event order when synchronous flag is set'; 923 : 1 : testData.method = send_sync_response_event_order; 924 : 1 : 925 : 1 : testData.skip = false; 926 : 1 : suites.get(suiteDesc).push(testData); 927 : 1 : 928 : 1 : // TEST ### - send() - timeout during sync send() should not run 929 : 1 : testData = {}; 930 : 1 : testData.desc = 'send() - timeout during sync send() should not run'; 931 : 1 : testData.method = send_sync_timeout; 932 : 1 : 933 : 1 : testData.skip = false; 934 : 1 : suites.get(suiteDesc).push(testData); 935 : 1 : 936 : 1 : // TEST ### - send() - timeout is not 0 937 : 1 : testData = {}; 938 : 1 : testData.desc = 'send() - timeout is not 0'; 939 : 1 : testData.method = send_timeout_events; 940 : 1 : 941 : 1 : testData.skip = false; 942 : 1 : suites.get(suiteDesc).push(testData); 943 : 1 : 944 : 1 : // TEST SUITE #9 - Methods - abort 945 : 1 : suiteDesc = 'Methods - abort'; 946 : 1 : suites.set(suiteDesc, []); 947 : 1 : 948 : 1 : // TEST ### - abort() - abort and loadend events 949 : 1 : testData = {}; 950 : 1 : testData.desc = 'abort() - abort and loadend events'; 951 : 1 : testData.method = abort_event_order; 952 : 1 : 953 : 1 : testData.skip = false; 954 : 1 : suites.get(suiteDesc).push(testData); 955 : 1 : 956 : 1 : // TEST SUITE #10 - Methods - getAllResponseHeaders 957 : 1 : suiteDesc = 'Methods - getAllResponseHeaders'; 958 : 1 : suites.set(suiteDesc, []); 959 : 1 : 960 : 1 : // TEST ### - getAllResponseHeaders() - excludes cookies 961 : 1 : testData = {}; 962 : 1 : testData.desc = 'getAllResponseHeaders() - excludes cookies'; 963 : 1 : testData.method = getallresponseheaders_cookies; 964 : 1 : 965 : 1 : testData.skip = false; 966 : 1 : suites.get(suiteDesc).push(testData); 967 : 1 : 968 : 1 : 969 : 1 : // TEST ### - getAllResponseHeaders() - excludes status line (HTTP/1.1 ...) 970 : 1 : testData = {}; 971 : 1 : testData.desc = 'getAllResponseHeaders() - excludes status line (HTTP/1.1 ...)'; 972 : 1 : testData.method = getallresponseheaders_status; 973 : 1 : 974 : 1 : testData.skip = false; 975 : 1 : suites.get(suiteDesc).push(testData); 976 : 1 : 977 : 1 : // TEST SUITE #11 - Methods - getResponseHeader 978 : 1 : suiteDesc = 'Methods - getResponseHeader'; 979 : 1 : suites.set(suiteDesc, []); 980 : 1 : 981 : 1 : // TEST ### - getResponseHeader() - case-insensitive matching 982 : 1 : testData = {}; 983 : 1 : testData.desc = 'getResponseHeader() - case-insensitive matching'; 984 : 1 : testData.method = getresponseheader_case_insensitive; 985 : 1 : 986 : 1 : testData.skip = false; 987 : 1 : suites.get(suiteDesc).push(testData); 988 : 1 : 989 : 1 : // TEST ### - getResponseHeader() - and HTTP trailer 990 : 1 : testData = {}; 991 : 1 : testData.desc = 'getResponseHeader() - and HTTP trailer'; 992 : 1 : testData.method = getresponseheader_chunked_trailer; 993 : 1 : 994 : 1 : testData.skip = false; 995 : 1 : suites.get(suiteDesc).push(testData); 996 : 1 : 997 : 1 : // TEST ### - getResponseHeader() - custom/non-existent headers and cookies 998 : 1 : testData = {}; 999 : 1 : testData.desc = 'getResponseHeader() - custom/non-existent headers and cookies'; 1000 : 1 : testData.method = getresponseheader_cookies_and_more; 1001 : 1 : 1002 : 1 : testData.skip = false; 1003 : 1 : suites.get(suiteDesc).push(testData); 1004 : 1 : 1005 : 1 : // TEST ### - getResponseHeader() - in error state 1006 : 1 : testData = {}; 1007 : 1 : testData.desc = 'getResponseHeader() - in error state'; 1008 : 1 : testData.method = getresponseheader_error_state; 1009 : 1 : 1010 : 1 : testData.skip = false; 1011 : 1 : suites.get(suiteDesc).push(testData); 1012 : 1 : 1013 : 1 : // TEST ### - getResponseHeader() - server and date 1014 : 1 : testData = {}; 1015 : 1 : testData.desc = 'getResponseHeader() - server and date'; 1016 : 1 : testData.method = getresponseheader_server_date; 1017 : 1 : 1018 : 1 : testData.skip = false; 1019 : 1 : suites.get(suiteDesc).push(testData); 1020 : 1 : 1021 : 1 : // TEST ### - getResponseHeader() - funny characters 1022 : 1 : testData = {}; 1023 : 1 : testData.desc = 'getResponseHeader() - funny characters'; 1024 : 1 : testData.method = getresponseheader_special_characters; 1025 : 1 : 1026 : 1 : testData.skip = false; 1027 : 1 : suites.get(suiteDesc).push(testData); 1028 : 1 : 1029 : 1 : // TEST ### - getResponseHeader() - in unsent, opened states 1030 : 1 : testData = {}; 1031 : 1 : testData.desc = 'getResponseHeader() - in unsent, opened states'; 1032 : 1 : testData.method = getresponseheader_unsent_opened_state; 1033 : 1 : 1034 : 1 : testData.skip = false; 1035 : 1 : suites.get(suiteDesc).push(testData); 1036 : 1 : 1037 : 1 : // TEST SUITE #12 - Response 1038 : 1 : suiteDesc = 'Response'; 1039 : 1 : suites.set(suiteDesc, []); 1040 : 1 : 1041 : 1 : // TEST ### - transmitting two chunks TEST_CHUNK and then garbage, which should result in an error 1042 : 1 : testData = {}; 1043 : 1 : testData.desc = 'transmitting two chunks TEST_CHUNK and then garbage, which should result in an error'; 1044 : 1 : testData.method = response_body_errors; 1045 : 1 : 1046 : 1 : testData.skip = false; 1047 : 1 : suites.get(suiteDesc).push(testData); 1048 : 1 : 1049 : 1 : // TEST ### - response - ArrayBuffer data 1050 : 1 : testData = {}; 1051 : 1 : testData.desc = 'response - ArrayBuffer data'; 1052 : 1 : testData.method = response_data_arraybuffer; 1053 : 1 : 1054 : 1 : testData.skip = false; 1055 : 1 : suites.get(suiteDesc).push(testData); 1056 : 1 : 1057 : 1 : // TEST ### - response - Blob data 1058 : 1 : testData = {}; 1059 : 1 : testData.desc = 'response - Blob data'; 1060 : 1 : testData.method = response_data_blob; 1061 : 1 : 1062 : 1 : testData.skip = false; 1063 : 1 : suites.get(suiteDesc).push(testData); 1064 : 1 : 1065 : 1 : // TEST ### - progress events grow response body size 1066 : 1 : testData = {}; 1067 : 1 : testData.desc = 'progress events grow response body size'; 1068 : 1 : testData.method = response_data_progress; 1069 : 1 : 1070 : 1 : testData.skip = false; 1071 : 1 : suites.get(suiteDesc).push(testData); 1072 : 1 : 1073 : 1 : // TEST ### - responseType - is plain text if responseType is set to an invalid string 1074 : 1 : testData = {}; 1075 : 1 : testData.desc = 'responseType - is plain text if responseType is set to an invalid string'; 1076 : 1 : testData.method = response_invalid_responsetype; 1077 : 1 : 1078 : 1 : testData.skip = false; 1079 : 1 : suites.get(suiteDesc).push(testData); 1080 : 1 : 1081 : 1 : // TEST ### - responseType - json 1082 : 1 : testData = {}; 1083 : 1 : testData.desc = 'responseType - json'; 1084 : 1 : testData.method = response_json; 1085 : 1 : 1086 : 1 : testData.skip = false; 1087 : 1 : suites.get(suiteDesc).push(testData); 1088 : 1 : 1089 : 1 : // TEST ### - responseText - status 1090 : 1 : testData = {}; 1091 : 1 : testData.desc = 'responseText - status'; 1092 : 1 : testData.method = responsetext_status; 1093 : 1 : 1094 : 1 : testData.skip = false; 1095 : 1 : suites.get(suiteDesc).push(testData); 1096 : 1 : 1097 : 1 : // TEST ### - responseText - decoding 1098 : 1 : testData = {}; 1099 : 1 : testData.desc = 'responseText - decoding'; 1100 : 1 : testData.method = responsetext_decoding; 1101 : 1 : 1102 : 1 : testData.skip = false; 1103 : 1 : suites.get(suiteDesc).push(testData); 1104 : 1 : 1105 : 1 : // TEST SUITE #13 - Status 1106 : 1 : suiteDesc = 'Status'; 1107 : 1 : suites.set(suiteDesc, []); 1108 : 1 : 1109 : 1 : // TEST ### - status/statusText - various responses 1110 : 1 : testData = {}; 1111 : 1 : testData.desc = 'status/statusText - various responses'; 1112 : 1 : testData.method = status_async; 1113 : 1 : 1114 : 1 : testData.skip = false; 1115 : 1 : suites.get(suiteDesc).push(testData); 1116 : 1 : 1117 : 1 : // TEST ### - status/statusText - basic 1118 : 1 : testData = {}; 1119 : 1 : testData.desc = 'status/statusText - basic'; 1120 : 1 : testData.method = status_basic; 1121 : 1 : 1122 : 1 : testData.skip = false; 1123 : 1 : suites.get(suiteDesc).push(testData); 1124 : 1 : 1125 : 1 : // TEST ### - status - error handling 1126 : 1 : testData = {}; 1127 : 1 : testData.desc = 'status - error handling'; 1128 : 1 : testData.method = status_error; 1129 : 1 : 1130 : 1 : testData.skip = false; 1131 : 1 : suites.get(suiteDesc).push(testData); 1132 : 1 : 1133 : 1 : // TEST SUITE #14 - Miscellaneous 1134 : 1 : suiteDesc = 'Miscellaneous'; 1135 : 1 : suites.set(suiteDesc, []); 1136 : 1 : 1137 : 1 : // TEST ### - data URLs 1138 : 1 : testData = {}; 1139 : 1 : testData.desc = 'data URLs'; 1140 : 1 : testData.method = data_uri; 1141 : 1 : 1142 : 1 : testData.skip = false; 1143 : 1 : suites.get(suiteDesc).push(testData); 1144 : 1 : 1145 : 1 : // TEST ### - historical features 1146 : 1 : testData = {}; 1147 : 1 : testData.desc = 'historical features'; 1148 : 1 : testData.method = historical; 1149 : 1 : 1150 : 1 : testData.skip = false; 1151 : 1 : suites.get(suiteDesc).push(testData); 1152 : 1 : 1153 : 1 : // TEST ### - loadstart event corner cases 1154 : 1 : testData = {}; 1155 : 1 : testData.desc = 'loadstart event corner cases'; 1156 : 1 : testData.method = loadstart_and_state; 1157 : 1 : 1158 : 1 : testData.skip = false; 1159 : 1 : suites.get(suiteDesc).push(testData); 1160 : 1 : } 1161 : 1 : 1162 : 1 : /** 1163 : 1 : * @func nodeRunner 1164 : 1 : * @param {object} runner - The node core module 'node:test' object 1165 : 1 : * @desc Carry out the loaded tests using node test runner 1166 : 1 : */ 1167 [ + ]: 1 : function nodeRunner(runner){ 1168 : 1 : 1169 : 1 : let startTime, success; 1170 : 1 : 1171 [ - ]: 1 : if(cmdOptions.verbose){ 1172 : 0 : 1173 : 0 : const callbackBefore = () => { 1174 : 0 : process.stderr.write(`wptTest-${(++testCount).toString().padStart(3, '0')} ... `); 1175 : 0 : startTime = Date.now(); 1176 : 0 : success = true; 1177 : 0 : }; 1178 : 0 : 1179 : 0 : const callbackAfter = (t) => { 1180 : 0 : let duration = Date.now() - startTime; 1181 : 0 : process.stderr.write(`${success ? 'success' : 'failure'} ... ${String(duration).padStart(6)} msec ... ${t.name}\n`); 1182 : 0 : }; 1183 : 0 : 1184 : 0 : runner.beforeEach(callbackBefore); 1185 : 0 : runner.afterEach(callbackAfter); 1186 : 0 : } 1187 : 1 : 1188 [ + ]: 1 : for(let [suiteDesc, suiteTests] of suites){ 1189 [ + ]: 14 : runner.suite(suiteDesc, () => { 1190 [ + ]: 14 : for(let testObj of suiteTests){ 1191 [ + ]: 115 : runner.test(testObj.desc, {skip: testObj.skip}, (t) => { 1192 [ - ]: 115 : if(cmdOptions.verbose){ 1193 : 0 : try{ 1194 : 0 : testObj.method(activeURL); 1195 : 0 : } 1196 : 0 : catch(err){ 1197 : 0 : success = false; throw err; 1198 : 0 : } 1199 : 0 : } 1200 : 115 : else{ 1201 : 115 : testObj.method(activeURL); 1202 : 115 : } 1203 : 115 : }); 1204 : 115 : } 1205 : 14 : }); 1206 : 14 : } 1207 : 1 : } 1208 : 1 : 1209 : 1 : /* node:coverage disable */ 1210 : : 1211 : : /** 1212 : : * @func defRunner 1213 : : * @desc Carry out the loaded tests using this developed test runner 1214 : : */ 1215 : : function defRunner(){ 1216 : : 1217 : : let startTime, success; 1218 : : let callbackBefore, callbackAfter 1219 : : 1220 : : if(cmdOptions.verbose){ 1221 : : callbackBefore = () => { 1222 : : process.stderr.write(`wptTest-${(++testCount).toString().padStart(3, '0')} ... `); 1223 : : startTime = Date.now(); 1224 : : success = true; 1225 : : }; 1226 : : 1227 : : callbackAfter = (testObj) => { 1228 : : let duration = Date.now() - startTime; 1229 : : process.stderr.write(`${success ? 'success' : 'failure'} ... ${String(duration).padStart(6)} msec ... ${testObj.desc}\n`); 1230 : : }; 1231 : : } 1232 : : 1233 : : cmdOptions.verbose && process.on('exit', () => { 1234 : : console.log(); 1235 : : console.log('▶ tests', testCount); 1236 : : console.log('▶ suites', suites.size); 1237 : : console.log('▶ pass', passCount); 1238 : : console.log('▶ fail', failCount); 1239 : : console.log('▶ cancelled', cancelCount); 1240 : : console.log('▶ skipped', skipCount); 1241 : : console.log('▶ todo', todoCount); 1242 : : console.log('▶ duration_ms', Math.round(Date.now() - startTime)); 1243 : : }); 1244 : : 1245 : : cmdOptions.verbose && console.error(); 1246 : : 1247 : : for(let [suiteDesc, suiteTests] of suites){ 1248 : : for(let testObj of suiteTests){ 1249 : : if(!testObj.skip){ 1250 : : if(cmdOptions.verbose){ 1251 : : callbackBefore(); 1252 : : try{ 1253 : : testObj.method(activeURL); 1254 : : ++passCount; 1255 : : } 1256 : : catch(err){ 1257 : : success = false; 1258 : : ++failCount; 1259 : : } 1260 : : callbackAfter(testObj); 1261 : : } 1262 : : else{ 1263 : : testObj.method(activeURL); 1264 : : ++passCount; 1265 : : } 1266 : : } 1267 : : else{ 1268 : : ++skipCount; 1269 : : } 1270 : : } 1271 : : } 1272 : : 1273 : : cmdOptions.verbose && console.error(); 1274 : : } 1275 : : 1276 : : /* node:coverage enable */ 1277 : 1 : 1278 : 1 : /** 1279 : 1 : * @func splash 1280 : 1 : * @desc The application splash screen 1281 : 1 : */ 1282 : 0 : function splash(){ 1283 : 0 : 1284 : 0 : const banner = String.raw` 1285 : 0 : __ ____ __ _ _ _ _ _ _____ _ 1286 : 0 : \ \ / / \/ | | | | | | | | | | __ \ | | 1287 : 0 : \ V /| \ / | | | |__| | |_| |_ _ __ | |__) |___ __ _ _ _ ___ ___| |_ 1288 : 0 : > < | |\/| | | | __ | __| __| '_ \| _ // _ \/ _ | | | |/ _ \/ __| __| 1289 : 0 : / . \| | | | |____| | | | |_| |_| |_) | | \ \ __/ (_| | |_| | __/\__ \ |_ 1290 : 0 : /_/ \_\_| |_|______|_| |_|\__|\__| .__/|_| \_\___|\__, |\__,_|\___||___/\__| 1291 : 0 : | | | | 1292 : 0 : |_| |_| 1293 : 0 : `; 1294 : 0 : 1295 : 0 : console.clear(); 1296 : 0 : console.log(banner); 1297 : 0 : console.log(); 1298 : 0 : 1299 : 0 : let url = new URL(activeURL); 1300 : 0 : 1301 : 0 : console.log(); 1302 : 0 : console.log(`▶ Test Server: ${url.host}`); 1303 : 0 : console.log(); 1304 : 0 : } 1305 : 1 : 1306 : 1 : /* 1307 : 1 : * imported - but not included 1308 : 1 : * 1309 : 1 : * open_url_encoding(activeURL); // results different from browser environment 1310 : 1 : * 1311 : 1 : * imported - skipped 1312 : 1 : * 1313 : 1 : * getallresponseheaders(activeURL); // using insecure http parser is required 1314 : 1 : * open_during_abort_event(activeURL); 1315 : 1 : * open_during_abort_processing(activeURL); 1316 : 1 : * open_method_case_sensitive(activeURL); // nodeJS http module always uppercase methods 1317 : 1 : * response_method(activeURL); // using insecure http parser is required 1318 : 1 : * send_redirect_no_location(activeURL); // requires xml parser 1319 : 1 : * 1320 : 1 : * imported - included but not fully tested 1321 : 1 : * 1322 : 1 : * send_content_type_charset(activeURL); // not fully tested 1323 : 1 : * setrequestheader_content_type(activeURL); // not fully tested - FormData not tested 1324 : 1 : * status_basic(activeURL); // not fully tested type=text/xml 1325 : 1 : * 1326 : 1 : * imported - tested but suspicious 1327 : 1 : * 1328 : 1 : * response_data_progress(activeURL); // failure with content-length not included 1329 : 1 : * 1330 : 1 : * imported - tested but to be revised 1331 : 1 : * 1332 : 1 : * progressevent_interface(activeURL); // revise/complete progressevent-interface.js 1333 : 1 : * open_open_send(activeURL); // unknown failure 1334 : 1 : */